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

封面

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

封面

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

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

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

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

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

图片

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

-

图片

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

图片

`;export{s as assetURLs,c as default,n as metadata,a as toc}; diff --git a/zh-cn/assets/index-11edd425.js b/zh-cn/assets/index-11e55415.js similarity index 88% rename from zh-cn/assets/index-11edd425.js rename to zh-cn/assets/index-11e55415.js index ca20336..029e640 100644 --- a/zh-cn/assets/index-11edd425.js +++ b/zh-cn/assets/index-11e55415.js @@ -1,4 +1,4 @@ -var GE=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var bK=GE((CK,Gc)=>{(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))n(i);new MutationObserver(i=>{for(const o of i)if(o.type==="childList")for(const a of o.addedNodes)a.tagName==="LINK"&&a.rel==="modulepreload"&&n(a)}).observe(document,{childList:!0,subtree:!0});function r(i){const o={};return i.integrity&&(o.integrity=i.integrity),i.referrerPolicy&&(o.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?o.credentials="include":i.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function n(i){if(i.ep)return;i.ep=!0;const o=r(i);fetch(i.href,o)}})();var Fo=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function Uw(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function XE(e){if(e.__esModule)return e;var t=e.default;if(typeof t=="function"){var r=function n(){if(this instanceof n){var i=[null];i.push.apply(i,arguments);var o=Function.bind.apply(t,i);return new o}return t.apply(this,arguments)};r.prototype=t.prototype}else r={};return Object.defineProperty(r,"__esModule",{value:!0}),Object.keys(e).forEach(function(n){var i=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(r,n,i.get?i:{enumerable:!0,get:function(){return e[n]}})}),r}var l={},KE={get exports(){return l},set exports(e){l=e}},Uu={},N={},QE={get exports(){return N},set exports(e){N=e}},ke={};/** +var GE=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var kK=GE((DK,Gc)=>{(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))n(i);new MutationObserver(i=>{for(const o of i)if(o.type==="childList")for(const a of o.addedNodes)a.tagName==="LINK"&&a.rel==="modulepreload"&&n(a)}).observe(document,{childList:!0,subtree:!0});function r(i){const o={};return i.integrity&&(o.integrity=i.integrity),i.referrerPolicy&&(o.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?o.credentials="include":i.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function n(i){if(i.ep)return;i.ep=!0;const o=r(i);fetch(i.href,o)}})();var Fo=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function Uw(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function XE(e){if(e.__esModule)return e;var t=e.default;if(typeof t=="function"){var r=function n(){if(this instanceof n){var i=[null];i.push.apply(i,arguments);var o=Function.bind.apply(t,i);return new o}return t.apply(this,arguments)};r.prototype=t.prototype}else r={};return Object.defineProperty(r,"__esModule",{value:!0}),Object.keys(e).forEach(function(n){var i=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(r,n,i.get?i:{enumerable:!0,get:function(){return e[n]}})}),r}var l={},KE={get exports(){return l},set exports(e){l=e}},Uu={},N={},QE={get exports(){return N},set exports(e){N=e}},ke={};/** * @license React * react.production.min.js * @@ -1445,7 +1445,7 @@ Error generating stack: `+o.message+` display: block; margin-inline: auto; color: #fff; -`,Q1=Object.assign({"/src/articles/events/2022-05-17-RDMA-Software-Interface-High-Level-Package/index.md":()=>D(()=>import("./index-a84bdbd8.js"),[]),"/src/articles/events/2022-08-04-When-RDMA-meets-Rust/index.md":()=>D(()=>import("./index-c832920a.js"),[]),"/src/articles/events/2022-08-23-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>D(()=>import("./index-5968a39d.js"),[]),"/src/articles/events/2022-10-11-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>D(()=>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":()=>D(()=>import("./index-b9cc4e07.js"),[]),"/src/articles/events/2022-11-24-The-Rust-China-Hackathon-2022-Datan-Technology-Group-Air-Presentation-is-here/index.md":()=>D(()=>import("./index-cf17c7a4.js"),[]),"/src/articles/events/2022-12-08-SpinalHDL-Application-Prospect-Exploration-Online-Seminar/index.md":()=>D(()=>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":()=>D(()=>import("./index-4b956329.js"),[]),"/src/articles/events/2023-01-06-Datan-Technology-2023-Open-Source-Graduation-Design-Internship-Recruitment/index.md":()=>D(()=>import("./index-b2f220f4.js"),[]),"/src/articles/events/2023-01-12-Welcome-to-join-Datan-Technology-hardware-design-learning-community/index.md":()=>D(()=>import("./index-1179d885.js"),[]),"/src/articles/events/2023-02-01-Consensus-Algorithms-and-Metadata-Management-for-Cross-Data-Center-Consistency/index.md":()=>D(()=>import("./index-5689e7f4.js"),[]),"/src/articles/events/2023-03-31-4.8-Beijing-Rust-Meetup-|-Call-For-Presenters/index.md":()=>D(()=>import("./index-ffd93bc8.js"),[]),"/src/articles/events/2023-04-05-Beijing-Rust-Meetup/index.md":()=>D(()=>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":()=>D(()=>import("./index-3dea6c6a.js"),[]),"/src/articles/events/2023-06-11-Countdown-to-Rust-X-DatenLord-l-Rust-China-Conf-2023/index.md":()=>D(()=>import("./index-0c25eea3.js"),[]),"/src/articles/events/2023-07-03-SpinalHDL-usage-and-development-experience-workshop/index.md":()=>D(()=>import("./index-0b4fd2ad.js"),[]),"/src/articles/events/2023-08-01-Countdown-to-6-days-l-Opportunities-and-Challenges-The-Development-Trend-of-Generative-AI-and-its-Application-on-the-Ground/index.md":()=>D(()=>import("./index-16f06676.js"),[]),"/src/articles/events/2023-08-15-DatenLord-X-Segmentfault-Live-Stream-Preview-l-CURP-Protocol-in-Industrial-Practice/index.md":()=>D(()=>import("./index-b9ee750d.js"),[]),"/src/articles/events/2023-08-20-Upcoming-Events-l-2nd-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>D(()=>import("./index-5f61d62d.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":()=>D(()=>import("./index-a154d453.js"),[]),"/src/articles/events/2023-09-19-MIT-Coursework-Orientation-for-Newcomers/index.md":()=>D(()=>import("./index-65e0a878.js"),[]),"/src/articles/events/2023-11-09-Exploring-the-Future-of-SpinalHDL-Applications-in-2023-Online-Workshop/index.md":()=>D(()=>import("./index-2530d06d.js"),[]),"/src/articles/events/2023-11-17-Ding!-You've-received-a-Hackthon-invitation-from-Dartan-Technologies!/index.md":()=>D(()=>import("./index-28dd2373.js"),[]),"/src/articles/events/2023-12-05-Countdown-to-5-days:-SpinalHDL-application-prospect-exploration-online-seminar/index.md":()=>D(()=>import("./index-1c57aced.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":()=>D(()=>import("./index-b8dbda9f.js"),[]),"/src/articles/events/2023-12-14-MIT-Architecture-Open-Course-Learning-Community-Version-2.0-is-officially-launched~/index.md":()=>D(()=>import("./index-50ad21f0.js"),[]),"/src/articles/events/2024-01-02-Highlights-I-DatenLord-Hackathon-2023-came-to-a-successful-conclusion!/index.md":()=>D(()=>import("./index-1c51c928.js"),[])}),Z5=()=>{const e=wt(),[t,r]=N.useState([]),n=async()=>{const i=await Promise.all(Object.keys(Q1).map(o=>Q1[o]()));r(i.reverse())};return N.useEffect(()=>{n()},[]),l.jsx(A5,{id:"dynamics",children:l.jsxs(I5,{children:[l.jsx(N5,{children:"达坦动态"}),l.jsx($5,{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(z5,{children:[l.jsx(Y5,{src:h?o[0]:G1}),l.jsxs(V5,{children:[l.jsx(U5,{children:g}),l.jsx(G5,{children:v})]}),l.jsxs(K5,{onClick:()=>{e(`/events/${d}-${c.split(" ").join("-")}`)},children:[l.jsx(X1,{children:"详情"}),l.jsx(K1,{src:B1})]})]},c);if(a<5)return l.jsxs(H5,{children:[l.jsx(F5,{src:h?o[0]:G1}),l.jsxs(W5,{children:[l.jsx(B5,{children:g}),l.jsx(X5,{children:v})]}),l.jsxs(Q5,{onClick:()=>{e(`/events/${d}-${c.split(" ").join("-")}`)},children:[l.jsx(X1,{children:"详情"}),l.jsx(K1,{src:B1})]})]},c)})}),l.jsx(q5,{onClick:()=>e("/events"),children:"了解更多"})]})})},J5="/zh-cn/assets/blog-test-image-c63d058c.png",e7="/zh-cn/assets/blog-cover-3d82a30d.png",{Heading:t7,Paragraph:r7}=Me,{CNHead4:n7,TitleLarge:i7}=t7,{CNBodyMedium:WS}=r7,o7=f.section` +`,Q1=Object.assign({"/src/articles/events/2022-05-17-RDMA-Software-Interface-High-Level-Package/index.md":()=>D(()=>import("./index-a84bdbd8.js"),[]),"/src/articles/events/2022-08-04-When-RDMA-meets-Rust/index.md":()=>D(()=>import("./index-c832920a.js"),[]),"/src/articles/events/2022-08-23-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>D(()=>import("./index-5968a39d.js"),[]),"/src/articles/events/2022-10-11-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>D(()=>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":()=>D(()=>import("./index-b9cc4e07.js"),[]),"/src/articles/events/2022-11-24-The-Rust-China-Hackathon-2022-Datan-Technology-Group-Air-Presentation-is-here/index.md":()=>D(()=>import("./index-cf17c7a4.js"),[]),"/src/articles/events/2022-12-08-SpinalHDL-Application-Prospect-Exploration-Online-Seminar/index.md":()=>D(()=>import("./index-a9e0a78f.js"),[]),"/src/articles/events/2022-12-08-Welcome-to-sign-up-for-the-Rust-China-Hackathon-2022-Datan-Technology-Group/index.md":()=>D(()=>import("./index-4b956329.js"),[]),"/src/articles/events/2023-01-06-Datan-Technology-2023-Open-Source-Graduation-Design-Internship-Recruitment/index.md":()=>D(()=>import("./index-d735fd77.js"),[]),"/src/articles/events/2023-01-12-Welcome-to-join-Datan-Technology-hardware-design-learning-community/index.md":()=>D(()=>import("./index-4e03f569.js"),[]),"/src/articles/events/2023-02-01-Consensus-Algorithms-and-Metadata-Management-for-Cross-Data-Center-Consistency/index.md":()=>D(()=>import("./index-5689e7f4.js"),[]),"/src/articles/events/2023-03-31-4.8-Beijing-Rust-Meetup-|-Call-For-Presenters/index.md":()=>D(()=>import("./index-a1a1a279.js"),[]),"/src/articles/events/2023-04-05-Beijing-Rust-Meetup/index.md":()=>D(()=>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":()=>D(()=>import("./index-3dea6c6a.js"),[]),"/src/articles/events/2023-06-11-Countdown-to-Rust-X-DatenLord-l-Rust-China-Conf-2023/index.md":()=>D(()=>import("./index-0c25eea3.js"),[]),"/src/articles/events/2023-07-03-SpinalHDL-usage-and-development-experience-workshop/index.md":()=>D(()=>import("./index-cc44974b.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":()=>D(()=>import("./index-4d1333f2.js"),[]),"/src/articles/events/2023-08-15-DatenLord-X-Segmentfault-Live-Stream-Preview-l-CURP-Protocol-in-Industrial-Practice/index.md":()=>D(()=>import("./index-20f01f19.js"),[]),"/src/articles/events/2023-08-20-Upcoming-Events-l-2nd-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>D(()=>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":()=>D(()=>import("./index-696ef44a.js"),[]),"/src/articles/events/2023-09-19-MIT-Coursework-Orientation-for-Newcomers/index.md":()=>D(()=>import("./index-5fa4b651.js"),[]),"/src/articles/events/2023-11-09-Exploring-the-Future-of-SpinalHDL-Applications-in-2023-Online-Workshop/index.md":()=>D(()=>import("./index-dfd283a0.js"),[]),"/src/articles/events/2023-11-17-Ding!-You've-received-a-Hackthon-invitation-from-Dartan-Technologies!/index.md":()=>D(()=>import("./index-69ce89cf.js"),[]),"/src/articles/events/2023-12-05-Countdown-to-5-days:-SpinalHDL-application-prospect-exploration-online-seminar/index.md":()=>D(()=>import("./index-ef7b41da.js"),[]),"/src/articles/events/2023-12-05-Ding!-2023-hackathon-tips-fresh-from-the-oven!-Last-week-to-sign-up-before-it's-too-late!/index.md":()=>D(()=>import("./index-b8dbda9f.js"),[]),"/src/articles/events/2023-12-14-MIT-Architecture-Open-Course-Learning-Community-Version-2.0-is-officially-launched~/index.md":()=>D(()=>import("./index-1061b5bb.js"),[]),"/src/articles/events/2024-01-02-Highlights-I-DatenLord-Hackathon-2023-came-to-a-successful-conclusion!/index.md":()=>D(()=>import("./index-1c51c928.js"),[])}),Z5=()=>{const e=wt(),[t,r]=N.useState([]),n=async()=>{const i=await Promise.all(Object.keys(Q1).map(o=>Q1[o]()));r(i.reverse())};return N.useEffect(()=>{n()},[]),l.jsx(A5,{id:"dynamics",children:l.jsxs(I5,{children:[l.jsx(N5,{children:"达坦动态"}),l.jsx($5,{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(z5,{children:[l.jsx(Y5,{src:h?o[0]:G1}),l.jsxs(V5,{children:[l.jsx(U5,{children:g}),l.jsx(G5,{children:v})]}),l.jsxs(K5,{onClick:()=>{e(`/events/${d}-${c.split(" ").join("-")}`)},children:[l.jsx(X1,{children:"详情"}),l.jsx(K1,{src:B1})]})]},c);if(a<5)return l.jsxs(H5,{children:[l.jsx(F5,{src:h?o[0]:G1}),l.jsxs(W5,{children:[l.jsx(B5,{children:g}),l.jsx(X5,{children:v})]}),l.jsxs(Q5,{onClick:()=>{e(`/events/${d}-${c.split(" ").join("-")}`)},children:[l.jsx(X1,{children:"详情"}),l.jsx(K1,{src:B1})]})]},c)})}),l.jsx(q5,{onClick:()=>e("/events"),children:"了解更多"})]})})},J5="/zh-cn/assets/blog-test-image-c63d058c.png",e7="/zh-cn/assets/blog-cover-3d82a30d.png",{Heading:t7,Paragraph:r7}=Me,{CNHead4:n7,TitleLarge:i7}=t7,{CNBodyMedium:WS}=r7,o7=f.section` background: #f7f7f9; `,s7=f.div` max-width: 1440px; @@ -1509,7 +1509,7 @@ Error generating stack: `+o.message+` border-radius: 0.5rem; border: none; cursor: pointer; -`,q1=Object.assign({"/src/articles/blogs/2022-05-17-Rust-Implementation-of-RDMA/index.md":()=>D(()=>import("./index-8702c933.js"),[]),"/src/articles/blogs/2022-05-27-Crossbeam-Epoch-Algorithm-for-Lock-Free-Programming-in-Rust/index.md":()=>D(()=>import("./index-28c4b418.js"),[]),"/src/articles/blogs/2022-05-27-Managing-RDMA-Memory-in-Rust/index.md":()=>D(()=>import("./index-de3329ad.js"),[]),"/src/articles/blogs/2022-05-27-Memory-Management-for-Lock-Free-Data-Structures-in-the-Rust-Language/index.md":()=>D(()=>import("./index-fe9ae8f0.js"),[]),"/src/articles/blogs/2022-05-27-Rethinking-How-Rust-Async-Enables-High-Performance-IO/index.md":()=>D(()=>import("./index-d81ed83c.js"),[]),"/src/articles/blogs/2022-05-27-Rust-Implementation-of-K8S-Scheduling-Extensions/index.md":()=>D(()=>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":()=>D(()=>import("./index-fd018bec.js"),[]),"/src/articles/blogs/2022-05-27-async-Rust-wraps-UCX-communication-library/index.md":()=>D(()=>import("./index-8c82e7c7.js"),[]),"/src/articles/blogs/2022-05-27-io_uring-Rust-Asynchronous-Library-Implementation/index.md":()=>D(()=>import("./index-e7093119.js"),[]),"/src/articles/blogs/2022-06-11-Computer-Architecture-l-MIT-Training-Q&A-and-Tips/index.md":()=>D(()=>import("./index-29c0b7ce.js"),[]),"/src/articles/blogs/2022-06-15-Etcd-client-cache-practice/index.md":()=>D(()=>import("./index-bfe04780.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-and-lock-free-programming-(1)/index.md":()=>D(()=>import("./index-147df4a9.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-in-lock-free-programming-scenarios-(2)/index.md":()=>D(()=>import("./index-b51a8ea2.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(1)/index.md":()=>D(()=>import("./index-5dd90a8c.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(2)/index.md":()=>D(()=>import("./index-426f092b.js"),[]),"/src/articles/blogs/2022-06-15-Using-BPF-to-implement-user-mode-tracing/index.md":()=>D(()=>import("./index-06215d3e.js"),[]),"/src/articles/blogs/2022-06-24-Why-should-a-startup-choose-Rust-for-an-RDMA-library/index.md":()=>D(()=>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":()=>D(()=>import("./index-2ee8a4ba.js"),[]),"/src/articles/blogs/2022-07-07-Rethinking-of-the-Curp-Consensus-Protocol/index.md":()=>D(()=>import("./index-f6eeef5e.js"),[]),"/src/articles/blogs/2022-08-11-DatenLord-|-Xline-Geo-distributed-KV-Storage/index.md":()=>D(()=>import("./index-9cd4971b.js"),[]),"/src/articles/blogs/2022-10-11-Rust-Chat-Room:-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>D(()=>import("./index-0bd243e2.js"),[]),"/src/articles/blogs/2022-10-20-Wonderful-review-l-Rust-chat-room:-Xline-cross-data-center-consistency-management/index.md":()=>D(()=>import("./index-fa30bf44.js"),[]),"/src/articles/blogs/2022-12-15-Distributed-state-machine-consensus-protocol-Copilot/index.md":()=>D(()=>import("./index-24694c1f.js"),[]),"/src/articles/blogs/2023-01-19-From-Cloud-Computing-to-Sky-Computing-(1)/index.md":()=>D(()=>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":()=>D(()=>import("./index-39390118.js"),[]),"/src/articles/blogs/2023-02-16-Database-isolation-level-and-MVCC/index.md":()=>D(()=>import("./index-1dde53bb.js"),[]),"/src/articles/blogs/2023-02-16-Xline-v0.2.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>D(()=>import("./index-6f20c5b7.js"),[]),"/src/articles/blogs/2023-03-02-Thinking-about-programs-mathematically-and-verifying-correctness/index.md":()=>D(()=>import("./index-82a24597.js"),[]),"/src/articles/blogs/2023-03-23-Xline-v0.3.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>D(()=>import("./index-72b88898.js"),[]),"/src/articles/blogs/2023-04-20-How-to-elegantly-organize-asynchronous-code-in-a-Rust-project/index.md":()=>D(()=>import("./index-7582b288.js"),[]),"/src/articles/blogs/2023-04-24-DatenLord-open-source-product-technology-sharing-l-Xline-source-code-interpretation/index.md":()=>D(()=>import("./index-015cf939.js"),[]),"/src/articles/blogs/2023-05-11-Xline-v0.4.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>D(()=>import("./index-1e192479.js"),[]),"/src/articles/blogs/2023-05-17-Computer-Architecture|MIT6.175-and-MIT6.375-Study-Notes/index.md":()=>D(()=>import("./index-e6f44fee.js"),[]),"/src/articles/blogs/2023-05-25-Xline-Persistent-Storage-Design-and-Implementation/index.md":()=>D(()=>import("./index-90593fbc.js"),[]),"/src/articles/blogs/2023-06-01-From-Cloud-Computing-to-Sky-Computing-(2)/index.md":()=>D(()=>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":()=>D(()=>import("./index-a8e1cc23.js"),[]),"/src/articles/blogs/2023-06-21-Xline-v0.4.1:-A-distributed-KV-store-for-metadata-management/index.md":()=>D(()=>import("./index-148365b0.js"),[]),"/src/articles/blogs/2023-07-13-Interpretation-of-Xline-source-code-(1)——Introduction-to-CURP-protocol/index.md":()=>D(()=>import("./index-5076d4ea.js"),[]),"/src/articles/blogs/2023-07-20-Xline-Source-Code-Interpretation-(II)-Lease-Mechanism-and-Implementation/index.md":()=>D(()=>import("./index-0074c42d.js"),[]),"/src/articles/blogs/2023-07-27-BSV-based-high-performance-parallel-CRC-hardware-circuit-generator/index.md":()=>D(()=>import("./index-dcc07e36.js"),[]),"/src/articles/blogs/2023-08-15-Xline-v0.5.0-a-distributed-KV-store-for-metadata-management/index.md":()=>D(()=>import("./index-7a7fbe77.js"),[]),"/src/articles/blogs/2023-08-31-Fountain-Code/index.md":()=>D(()=>import("./index-0850e6f5.js"),[]),"/src/articles/blogs/2023-09-14-Xline-Source-Code-Interpretation-(III)--CURP-Server-Implementation/index.md":()=>D(()=>import("./index-277ae463.js"),[]),"/src/articles/blogs/2023-09-28-Bluespec-SytemVerilog-Handshake-Protocol-Interface-Conversion/index.md":()=>D(()=>import("./index-3139538f.js"),[]),"/src/articles/blogs/2023-10-12-Software-and-hardware-co-simulation-l-Overview-of-principles-and-main-components/index.md":()=>D(()=>import("./index-1ec93936.js"),[]),"/src/articles/blogs/2023-10-19-Xline-Source-Code-Interpretation-(IV)-CURP-state-machine-engine/index.md":()=>D(()=>import("./index-6618c0b5.js"),[]),"/src/articles/blogs/2023-10-26-Application-of-data-flow-programming-in-hardware-design/index.md":()=>D(()=>import("./index-a27a1569.js"),[]),"/src/articles/blogs/2023-11-02-blue-ethernet-High-Performance-FPGA-Network-Packet-Processing-Project-Details/index.md":()=>D(()=>import("./index-0c28844a.js"),[]),"/src/articles/blogs/2023-11-23-Xline-v0.6.0:-a-distributed-KV-store-for-metadata-management/index.md":()=>D(()=>import("./index-b73b42f4.js"),[])}),p7=()=>{const e=wt(),[t,r]=N.useState([]),[n,i]=N.useState(""),o=async()=>{const a=await Promise.all(Object.keys(q1).map(c=>q1[c]()));r(a.reverse())};return N.useEffect(()=>{o()},[]),N.useEffect(()=>{var a;i(((a=t[0])==null?void 0:a.assetURLs[0])||J5)},[t]),l.jsx(o7,{id:"blog",children:l.jsxs(s7,{children:[l.jsx(a7,{children:"技术博客"}),l.jsxs(l7,{children:[l.jsxs(c7,{children:[l.jsx(u7,{src:e7}),t.map(({metadata:a},c)=>{const{title:d,date:h,label:g,description:v}=a;return c<4&&l.jsxs(d7,{children:[l.jsx(f7,{onClick:()=>{e(`/blogs/${h}-${d.split(" ").join("-")}`)},children:g}),l.jsx(h7,{children:v})]},d)})]}),l.jsx(m7,{onClick:()=>e("/blogs"),children:"了解更多"})]})]})})},Z1=()=>{const{sectionId:e}=gn();return N.useEffect(()=>{const t=document.querySelector(`#${e}`);t?t.scrollIntoView():window.scrollTo(0,0)},[e]),l.jsxs(Pt.Fragment,{children:[l.jsx(yn,{cover:$S,children:"资源"}),l.jsx(D5,{}),l.jsx(Z5,{}),l.jsx(p7,{})]})},g7="/zh-cn/assets/cover-2eaea155.png",v7="/zh-cn/assets/SJTU-logo-a938b527.png",y7="/zh-cn/assets/BUPT-logo-4d861e45.png",w7="/zh-cn/assets/HNU-logo-a704fb8b.png",_7="/zh-cn/assets/SCUT-logo-aa4c3285.png",x7="/zh-cn/assets/SBU-logo-a0084f17.png",S7="/zh-cn/assets/image-cd6390ff.png",{Heading:b7,Paragraph:k7}=Me,{CNHead4:C7,CNHead5:D7}=b7,{CNBodyLarge:US}=k7,E7=f.section` +`,q1=Object.assign({"/src/articles/blogs/2022-05-17-Rust-Implementation-of-RDMA/index.md":()=>D(()=>import("./index-8702c933.js"),[]),"/src/articles/blogs/2022-05-27-Crossbeam-Epoch-Algorithm-for-Lock-Free-Programming-in-Rust/index.md":()=>D(()=>import("./index-28c4b418.js"),[]),"/src/articles/blogs/2022-05-27-Managing-RDMA-Memory-in-Rust/index.md":()=>D(()=>import("./index-de3329ad.js"),[]),"/src/articles/blogs/2022-05-27-Memory-Management-for-Lock-Free-Data-Structures-in-the-Rust-Language/index.md":()=>D(()=>import("./index-fe9ae8f0.js"),[]),"/src/articles/blogs/2022-05-27-Rethinking-How-Rust-Async-Enables-High-Performance-IO/index.md":()=>D(()=>import("./index-d81ed83c.js"),[]),"/src/articles/blogs/2022-05-27-Rust-Implementation-of-K8S-Scheduling-Extensions/index.md":()=>D(()=>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":()=>D(()=>import("./index-fd018bec.js"),[]),"/src/articles/blogs/2022-05-27-async-Rust-wraps-UCX-communication-library/index.md":()=>D(()=>import("./index-8c82e7c7.js"),[]),"/src/articles/blogs/2022-05-27-io_uring-Rust-Asynchronous-Library-Implementation/index.md":()=>D(()=>import("./index-e7093119.js"),[]),"/src/articles/blogs/2022-06-11-Computer-Architecture-l-MIT-Training-Q&A-and-Tips/index.md":()=>D(()=>import("./index-ddfbefca.js"),[]),"/src/articles/blogs/2022-06-15-Etcd-client-cache-practice/index.md":()=>D(()=>import("./index-bfe04780.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-and-lock-free-programming-(1)/index.md":()=>D(()=>import("./index-147df4a9.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-in-lock-free-programming-scenarios-(2)/index.md":()=>D(()=>import("./index-b51a8ea2.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(1)/index.md":()=>D(()=>import("./index-5dd90a8c.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(2)/index.md":()=>D(()=>import("./index-426f092b.js"),[]),"/src/articles/blogs/2022-06-15-Using-BPF-to-implement-user-mode-tracing/index.md":()=>D(()=>import("./index-06215d3e.js"),[]),"/src/articles/blogs/2022-06-24-Why-should-a-startup-choose-Rust-for-an-RDMA-library/index.md":()=>D(()=>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":()=>D(()=>import("./index-aa8ef45e.js"),[]),"/src/articles/blogs/2022-07-07-Rethinking-of-the-Curp-Consensus-Protocol/index.md":()=>D(()=>import("./index-c719bd5c.js"),[]),"/src/articles/blogs/2022-08-11-DatenLord-|-Xline-Geo-distributed-KV-Storage/index.md":()=>D(()=>import("./index-9cd4971b.js"),[]),"/src/articles/blogs/2022-10-11-Rust-Chat-Room:-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>D(()=>import("./index-38e8d7df.js"),[]),"/src/articles/blogs/2022-10-20-Wonderful-review-l-Rust-chat-room:-Xline-cross-data-center-consistency-management/index.md":()=>D(()=>import("./index-fa30bf44.js"),[]),"/src/articles/blogs/2022-12-15-Distributed-state-machine-consensus-protocol-Copilot/index.md":()=>D(()=>import("./index-24694c1f.js"),[]),"/src/articles/blogs/2023-01-19-From-Cloud-Computing-to-Sky-Computing-(1)/index.md":()=>D(()=>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":()=>D(()=>import("./index-4270ced0.js"),[]),"/src/articles/blogs/2023-02-16-Database-isolation-level-and-MVCC/index.md":()=>D(()=>import("./index-1dde53bb.js"),[]),"/src/articles/blogs/2023-02-16-Xline-v0.2.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>D(()=>import("./index-9cbd4195.js"),[]),"/src/articles/blogs/2023-03-02-Thinking-about-programs-mathematically-and-verifying-correctness/index.md":()=>D(()=>import("./index-b28c82c1.js"),[]),"/src/articles/blogs/2023-03-23-Xline-v0.3.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>D(()=>import("./index-72b88898.js"),[]),"/src/articles/blogs/2023-04-20-How-to-elegantly-organize-asynchronous-code-in-a-Rust-project/index.md":()=>D(()=>import("./index-7582b288.js"),[]),"/src/articles/blogs/2023-04-24-DatenLord-open-source-product-technology-sharing-l-Xline-source-code-interpretation/index.md":()=>D(()=>import("./index-015cf939.js"),[]),"/src/articles/blogs/2023-05-11-Xline-v0.4.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>D(()=>import("./index-494dac65.js"),[]),"/src/articles/blogs/2023-05-17-Computer-Architecture|MIT6.175-and-MIT6.375-Study-Notes/index.md":()=>D(()=>import("./index-38c14a45.js"),[]),"/src/articles/blogs/2023-05-25-Xline-Persistent-Storage-Design-and-Implementation/index.md":()=>D(()=>import("./index-86e42443.js"),[]),"/src/articles/blogs/2023-06-01-From-Cloud-Computing-to-Sky-Computing-(2)/index.md":()=>D(()=>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":()=>D(()=>import("./index-a8e1cc23.js"),[]),"/src/articles/blogs/2023-06-21-Xline-v0.4.1:-A-distributed-KV-store-for-metadata-management/index.md":()=>D(()=>import("./index-148365b0.js"),[]),"/src/articles/blogs/2023-07-13-Interpretation-of-Xline-source-code-(1)——Introduction-to-CURP-protocol/index.md":()=>D(()=>import("./index-90047cd2.js"),[]),"/src/articles/blogs/2023-07-20-Xline-Source-Code-Interpretation-(II)-Lease-Mechanism-and-Implementation/index.md":()=>D(()=>import("./index-0074c42d.js"),[]),"/src/articles/blogs/2023-07-27-BSV-based-high-performance-parallel-CRC-hardware-circuit-generator/index.md":()=>D(()=>import("./index-aaba7b29.js"),[]),"/src/articles/blogs/2023-08-15-Xline-v0.5.0-a-distributed-KV-store-for-metadata-management/index.md":()=>D(()=>import("./index-7a7fbe77.js"),[]),"/src/articles/blogs/2023-08-31-Fountain-Code/index.md":()=>D(()=>import("./index-bccae718.js"),[]),"/src/articles/blogs/2023-09-14-Xline-Source-Code-Interpretation-(III)--CURP-Server-Implementation/index.md":()=>D(()=>import("./index-277ae463.js"),[]),"/src/articles/blogs/2023-09-28-Bluespec-SytemVerilog-Handshake-Protocol-Interface-Conversion/index.md":()=>D(()=>import("./index-3139538f.js"),[]),"/src/articles/blogs/2023-10-12-Software-and-hardware-co-simulation-l-Overview-of-principles-and-main-components/index.md":()=>D(()=>import("./index-1ec93936.js"),[]),"/src/articles/blogs/2023-10-19-Xline-Source-Code-Interpretation-(IV)-CURP-state-machine-engine/index.md":()=>D(()=>import("./index-6618c0b5.js"),[]),"/src/articles/blogs/2023-10-26-Application-of-data-flow-programming-in-hardware-design/index.md":()=>D(()=>import("./index-4c405f89.js"),[]),"/src/articles/blogs/2023-11-02-blue-ethernet-High-Performance-FPGA-Network-Packet-Processing-Project-Details/index.md":()=>D(()=>import("./index-b21d7686.js"),[]),"/src/articles/blogs/2023-11-23-Xline-v0.6.0:-a-distributed-KV-store-for-metadata-management/index.md":()=>D(()=>import("./index-b73b42f4.js"),[]),"/src/articles/blogs/2023-12-28-Xline-command-de-duplication-mechanism-(I)-Introduction-to-RIFL/index.md":()=>D(()=>import("./index-1b00c887.js"),[])}),p7=()=>{const e=wt(),[t,r]=N.useState([]),[n,i]=N.useState(""),o=async()=>{const a=await Promise.all(Object.keys(q1).map(c=>q1[c]()));r(a.reverse())};return N.useEffect(()=>{o()},[]),N.useEffect(()=>{var a;i(((a=t[0])==null?void 0:a.assetURLs[0])||J5)},[t]),l.jsx(o7,{id:"blog",children:l.jsxs(s7,{children:[l.jsx(a7,{children:"技术博客"}),l.jsxs(l7,{children:[l.jsxs(c7,{children:[l.jsx(u7,{src:e7}),t.map(({metadata:a},c)=>{const{title:d,date:h,label:g,description:v}=a;return c<4&&l.jsxs(d7,{children:[l.jsx(f7,{onClick:()=>{e(`/blogs/${h}-${d.split(" ").join("-")}`)},children:g}),l.jsx(h7,{children:v})]},d)})]}),l.jsx(m7,{onClick:()=>e("/blogs"),children:"了解更多"})]})]})})},Z1=()=>{const{sectionId:e}=gn();return N.useEffect(()=>{const t=document.querySelector(`#${e}`);t?t.scrollIntoView():window.scrollTo(0,0)},[e]),l.jsxs(Pt.Fragment,{children:[l.jsx(yn,{cover:$S,children:"资源"}),l.jsx(D5,{}),l.jsx(Z5,{}),l.jsx(p7,{})]})},g7="/zh-cn/assets/cover-2eaea155.png",v7="/zh-cn/assets/SJTU-logo-a938b527.png",y7="/zh-cn/assets/BUPT-logo-4d861e45.png",w7="/zh-cn/assets/HNU-logo-a704fb8b.png",_7="/zh-cn/assets/SCUT-logo-aa4c3285.png",x7="/zh-cn/assets/SBU-logo-a0084f17.png",S7="/zh-cn/assets/image-cd6390ff.png",{Heading:b7,Paragraph:k7}=Me,{CNHead4:C7,CNHead5:D7}=b7,{CNBodyLarge:US}=k7,E7=f.section` background: ${e=>e.theme.white00}; background: linear-gradient(180deg, #BFC5FB, #BFC5FB00 50%); `,T7=f.div` @@ -2024,7 +2024,7 @@ Error generating stack: `+o.message+` `,qz=f(Xz)` padding-bottom: 1.23rem; text-align: center; -`,ow=()=>{const{sectionId:e}=gn();return N.useEffect(()=>{const t=document.querySelector(`#${e}`);t?t==null||t.scrollIntoView():window.scrollTo(0,0)},[e]),l.jsxs(Pt.Fragment,{children:[l.jsx(yn,{cover:KS,subTitle:"通过实现跨云、跨数据中心的数据高速访问,DatenLord将大大提升存储系统的可扩展性,同时大大降低企业级IT业务系统在实现高可用性、多活方面的复杂性。随着多云、多数据中心成为企业级IT的主流架构,跨云分布式存储将在互联网、金融、电信、能源等不同行业得到广泛应用。",children:"公司"}),l.jsx(Kz,{id:"join-us",children:l.jsxs(Qz,{children:[l.jsx(qz,{children:"加入我们"}),l.jsx(b8,{}),l.jsx(H8,{}),l.jsx(K8,{}),l.jsx(wz,{})]})}),l.jsx(Bz,{})]})},Zz="/zh-cn/assets/video-demo-cover-6531bf08.png",hc="/zh-cn/assets/arrow-up-right-f6ca128c.svg",Jz="/zh-cn/assets/cover1-0f766121.jpg",eH="/zh-cn/assets/cover2-6c924915.jpg",tH="/zh-cn/assets/cover3-a8cadd7b.jpg",rH="/zh-cn/assets/cover4-da59baaf.jpg",nH="/zh-cn/assets/cover5-55104208.jpg",iH="/zh-cn/assets/cover6-bf6d56c4.jpg",oH="/zh-cn/assets/cover7-461ad08e.jpg",sH="/zh-cn/assets/cover8-18bb5252.jpg",aH="/zh-cn/assets/cover9-0cfe7433.jpg",lH="/zh-cn/assets/cover10-7707f5f7.jpg",cH="/zh-cn/assets/cover11-18bf7e52.jpg",uH="/zh-cn/assets/cover12-2ec52bb9.jpg",dH="/zh-cn/assets/cover13-20980f41.jpg",fH="/zh-cn/assets/cover14-6dff9a13.jpg",hH="/zh-cn/assets/cover15-f2819b4b.jpg",mH="/zh-cn/assets/cover16-6b3eea77.jpg",pH="/zh-cn/assets/cover17-2d99b802.jpg",gH="/zh-cn/assets/cover19-9503f8ee.jpg",vH="/zh-cn/assets/cover20-a198bfe8.jpg",yH="/zh-cn/assets/cover21-c1808615.jpg",wH="/zh-cn/assets/cover22-a24d3264.jpg",_H="/zh-cn/assets/cover23-91837162.jpg",xH="/zh-cn/assets/cover24-f34d429f.jpg",SH="/zh-cn/assets/cover25-11f1a4dd.jpg",bH="/zh-cn/assets/cover26-574c835d.jpg",kH="/zh-cn/assets/cover27-cab7b800.jpg",CH="/zh-cn/assets/cover28-61988539.jpg",DH="/zh-cn/assets/cover29-cfa296fc.jpg",EH="/zh-cn/assets/cover30-6bc9e17a.jpg",TH="/zh-cn/assets/cover31-de17416a.jpg",jH="/zh-cn/assets/cover32-64d8c4cf.jpg",OH="/zh-cn/assets/cover33-747e46a5.jpg",PH="/zh-cn/assets/cover34-b47433e8.jpg",RH="/zh-cn/assets/cover35-474e265e.jpg",MH="/zh-cn/assets/cover40-e2bf253f.jpg",LH="/zh-cn/assets/cover41-56007738.jpg",AH="/zh-cn/assets/cover42-075bcf74.jpg",IH="/zh-cn/assets/cover43-d1896502.jpg",NH="/zh-cn/assets/cover50-2dc33471.jpg",$H="/zh-cn/assets/cover51-235c2ee6.jpg",zH="/zh-cn/assets/cover52-06cc8093.jpg",HH="/zh-cn/assets/cover53-11208fe4.jpg",YH="/zh-cn/assets/cover54-00d520f8.jpg",FH=[{key:1,image:Jz,title:"Virtio-net相关知识介绍与Rust-for-Linux基本知识",text:"本场workshop由达坦科技李弘宇进行内容分享,主要介绍了Virtio-net相关知识介绍与Rust-for-Linux基本知识。欢迎参加达坦科技DatenLord相关开源项目:https://github.com/datenlord/linux/tree/rust_virtio",date:"2022.08.17",url:"https://www.bilibili.com/video/BV17G4y1a7Bv/"},{key:2,image:eH,title:"roce-sim Workshop分享",text:"本场workshop由达坦科技王恒宇进行内容分享,主要介绍了roce-sim相关知识分享,如果您对这方面有兴趣,欢迎参与达坦科技开源项目:Github链接:https://github.com/datenlord/roce-sim",date:"2022.08.25",url:"https://www.bilibili.com/video/BV1UB4y137Tn/"},{key:3,image:tH,title:"Cocotb Workshop分享",text:"本场workshop由达坦科技DatenLord 翁万正进行内容分享,主要进行了cocotb相关知识介绍。",date:"2022.09.23",url:"https://www.bilibili.com/video/BV19e4y1k7EE/"},{key:4,image:rH,title:"使用Copilot在分布式系统中容忍暂时变慢的节点",text:"本场workshop由达坦科技DatenLord 田野进行内容分享,主要进行了“使用Copilot在分布式系统中容忍暂时变慢的节点“相关知识介绍。",date:"2022.09.30",url:"https://www.bilibili.com/video/BV15e411T7pX/"},{key:5,image:nH,title:"硬件设计的集合方法",text:"本场workshop由达坦科技DatenLord李天瑞进行内容分享,主要进行了“硬件设计的集合方法”相关知识介绍。",date:"2022.10.09",url:"https://www.bilibili.com/video/BV1FK411Q7JV/"},{key:6,image:iH,title:"VLSI Sharing",text:"本场workshop由达坦科技DatenLord李天瑞进行内容分享,主要进行了VLSI相关知识介绍。",date:"2022.10.15",url:"https://www.bilibili.com/video/BV1bK411Q7GB/"},{key:7,image:oH,title:"Corumdum介绍",text:"本场workshop由西安电子科技大学 ISN网络与交换团队 硕士研究生李钊进行内容分享,主要进行了Corumdum相关知识介绍。",date:"2022.10.16",url:"https://www.bilibili.com/video/BV1qG41177Pq/"},{key:8,image:sH,title:"可编程交换机:原理与使用",text:"本场workshop由上海交通大学IPADS实验室博士二年级 张汉泽进行内容分享,主要进行了“可编程交换机:原理与使用”相关知识分享。可编程交换机由安装包处理规则的控制面与负责高速包处理的数据面构成,两者由一根PCIe总线相连。控制面支持高级语言编程,而数据面逻辑需要用P4语言编写。在可编程交换机上设计系统主要面临数据面内存有限与P4编程模型受限两大挑战。",date:"2022.10.23",url:"https://www.bilibili.com/video/BV1jm4y1w7w3/"},{key:9,image:aH,title:"形式化验证入门",text:"本场workshop由达坦科技DatenLord王璞进行内容分享,主要进行了形式化验证入门相关知识介绍。",date:"2022.10.26",url:"https://www.bilibili.com/video/BV1DG411L78p/"},{key:10,image:lH,title:"利用RDMA加速FaaS服务",text:"本场workshop由达坦科技DatenLord李弘宇进行内容分享,主要进行了“利用RDMA加速FaaS服务”相关知识介绍。",date:"2022.11.06",url:"https://www.bilibili.com/video/BV1et4y1K7Sw/"},{key:11,image:cH,title:"Rust for Linux",text:"本场workshop由苏宇恒进行内容分享,主要进行了“Rust for Linux”相关知识介绍。",date:"2022.11.08",url:"https://www.bilibili.com/video/BV1G8411a7CE/"},{key:12,image:uH,title:"Intel用户态中断",text:"本场workshop由韩明聪进行内容分享,主要进行了“Intel用户态中断”相关知识介绍。",date:"2022.11.08",url:"https://www.bilibili.com/video/BV1tG4y1t7Lg/"},{key:13,image:dH,title:"VLSI DSP Sharing",text:"本场workshop由达坦科技DatenLord李天瑞进行内容分享,主要进行了“VLSI DSP Intro”相关知识介绍。",date:"2022.11.11",url:"https://www.bilibili.com/video/BV18P4y1y7iP/"},{key:14,image:fH,title:"DSP Sharing Part2",text:"本场workshop由达坦科技DatenLord李天瑞进行内容分享,主要就DSP相关知识进行第二次workshop分享",date:"2022.11.12",url:"https://www.bilibili.com/video/BV1bM411k7YP/"},{key:15,image:hH,title:"eunomia-bpf: 结合 wasm 的 ebpf 轻量级开发框架",text:"本场workshop由浙江大学学生/eunomia-bpf 开发者 郑昱笙进行内容分享,主要内容围绕“eunomia-bpf: 结合 wasm 的 ebpf 轻量级开发框架”相关知识。",date:"2022.11.20",url:"https://www.bilibili.com/video/BV1u84y1C7pQ/"},{key:16,image:mH,title:"RDMA网络拥塞管理架构",text:"本场workshop由北京邮电大学网络与交换国家重点实验室、计算机学院,副研究员、博导:张乙然进行内容分享,主要内容围绕“RDMA网络拥塞管理架构”进行知识介绍。",date:"2022.11.27",url:"https://www.bilibili.com/video/BV1Ve4y1g7gx/"},{key:17,image:pH,title:"使用RDMA加速服务器无感知计算容器启动",text:"本场workshop由上海交通大学助理教授魏星达进行分享,主要内容围绕“使用RDMA加速服务器无感知计算容器启动”进行知识介绍。",date:"2022.12.04",url:"https://www.bilibili.com/video/BV1qG4y1G784/"},{key:19,image:gH,title:"基于智能网卡的数据处理系统",text:"本场workshop由浙江大学百人计划研究员 王则可进行分享,主要内容为“基于智能网卡的数据处理系统”介绍。",date:"2022.12.18",url:"https://www.bilibili.com/video/BV1Eg411J7fJ/"},{key:20,image:vH,title:"异步事件驱动的电路机制 & 基于RISC-V的全异步超标量CPU体系结构",text:"本场workshop由何安平副教授进行分享,主要内容为“异步事件驱动的电路机制 & 基于RISC-V的全异步超标量CPU体系结构”介绍。",date:"2022.12.25",url:"https://www.bilibili.com/video/BV1sA411D7on/"},{key:21,image:yH,title:"使用 TLA+ 为分布式算法验证正确性",text:"本场workshop由达坦科技DatenLord田野进行分享,主要内容为“使用 TLA+ 为分布式算法验证正确性”介绍。",date:"2023.01.09",url:"https://www.bilibili.com/video/BV1pG4y1y7an/"},{key:22,image:wH,title:"喷泉码技术简介",text:"本场workshop由兰州大学信息科学与工程学院副教授、通信工程专业系主任袁磊 进行分享,主要内容为“喷泉码技术简介”介绍。",date:"2023.01.15",url:"https://www.bilibili.com/video/BV1SM411b77k/"},{key:23,image:_H,title:"数据库隔离级别及MVCC",text:"本场workshop由达坦科技DatenLord施继成进行分享,主要内容为“数据库隔离级别及MVCC”介绍。",date:"2023.01.29",url:"https://www.bilibili.com/video/BV1sR4y1b7Cu/"},{key:24,image:xH,title:"互联网传输协议优化研究",text:"本场workshop由中国人民大学副教授李彤教授进行分享,主要内容为“互联网传输协议优化研究”介绍。",date:"2023.02.06",url:"https://www.bilibili.com/video/BV1X84y157vL/"},{key:25,image:SH,title:"高性能RDMA网络协议栈",text:"高性能RDMA网络协议栈是RDMA高性能网络的核心组成部分之一,它提供了支持RDMA技术的网络协议和驱动程序。在本周的前沿科技分享中,我们邀请到了湖南大学信息科学与工程学院的陈果教授来给我们分享高性能RDMA网络协议栈的话题。",date:"2023.02.28",url:"https://www.bilibili.com/video/BV1Y24y1n7Dk/"},{key:26,image:bH,title:"GPU抢占式任务调度",text:"GPU编程可以大幅提升计算速度和效率,从而使得许多计算任务得以在合理时间内完成。随着GPU硬件技术的发展和大规模数据处理需求的增加,GPU编程的应用范围不断扩大。在本周的前沿科技分享中,我们邀请到了上海交通大学并行与分布式研究所的韩明聪博士来给我们分享GPU抢占式任务调度。",date:"2023.03.05",url:"https://www.bilibili.com/video/BV1cY4y1y7ND/"},{key:27,image:kH,title:"聊聊RaptorQ纠错码",text:"喷泉码具有极高的纠错能力,且具有低延迟、地复杂度、高效率等优点,使其在冷存储、分布式存储、无线通信等领域得到广泛应用。达坦科技致力于软硬件融合的解决方案,喷泉码的高效实现在硬件上,作为公司长期的技术储备,在本周的前沿科技分享中,达坦科技的联合创始人兼CTO施继成将为大家分享聊聊 RaptorQ 纠错码 。",date:"2023.03.15",url:"https://www.bilibili.com/video/BV1wL411C7DL/"},{key:28,image:CH,title:"Buddy Compiler 简介和愿景",text:"在本次分享中,中国科学院软件研究所博士生张洪滨将介绍Buddy Compiler 编译流程、协同设计、硬件支持。Buddy Compiler 是领域特定的编译器框架,致力于打造基于 MLIR 和 RISC-V 的软硬件协同设计生态。其目标是实现从 DSL 到 DSA 的编译流程和协同设计,愿景是让领域特定的协同设计不再困难。",date:"2023.03.21",url:"https://www.bilibili.com/video/BV1YT41167GB/"},{key:29,image:DH,title:"新一代计算架构:超异构计算",text:"AGI带来的变化之一是算力将进一步从CPU转到GPU,在本周的前沿技术分享中,我们邀请到了上海矩向科技创始人兼CEO黄朝波为大家分享新一代计算架构:超异构计算。",date:"2023.04.04",url:"https://www.bilibili.com/video/BV1Rm4y1q7Dx/"},{key:30,image:EH,title:"通过Chainsaw设计DSP电路",text:"DSP在数据压缩、编码和加密方面都发挥了重要的作用;SpinalHDL具有更高的抽象层次和更强的表达能力,可以大大简化DSP电路设计的复杂度和提高开发效率;而Chainsaw框架可以在不同的FPGA平台上运行,提高了设计的灵活性和可移植性。在本周的前沿技术分享中,我们邀请到了中山大学在读博士李天瑞为大家分享通过Chainsaw设计DSP电路。",date:"2023.04.18",url:"https://www.bilibili.com/video/BV14o4y1j7bH/"},{key:31,image:TH,title:"Something About Cache Security",text:"在本周的前沿技术分享中,我们邀请到了浙江大学在读硕士研究生缪晨露为大家分享她在MICRO和HPCA上发表的两篇论文的精华,演讲主题是Something About Cache Security。",date:"2023.04.25",url:"https://www.bilibili.com/video/BV1p24y1F7fN/"},{key:32,image:jH,title:"Rust嵌入式开发生态介绍及入门",text:"在本周的前沿技术分享中,我们邀请到了一位爱好硬件的软件工程师米明恒,来为大家分享Rust嵌入式开发生态介绍及入门。",date:"2023.05.04",url:"https://www.bilibili.com/video/BV1J24y1T7EH/"},{key:33,image:OH,title:"RDMA赋能数据中心/超算中心间远程互联",text:"在本周的前沿技术分享中,我们邀请到了南京大学田臣教授,来为大家分享RDMA赋能数据中心/超算中心间远程互联。",date:"2023.06.04",url:"https://www.bilibili.com/video/BV1cz4y1B7cx/"},{key:34,image:PH,title:"Paper Reading: DPU任务卸载",text:"达坦科技一直在探索用硬件加速做分布式跨云存储,在本周的前沿技术分享中,我们邀请到了中南大学在读博士生卢军,来为大家分享DPU任务卸载的相关研究。",date:"2023.06.17",url:"https://www.bilibili.com/video/BV1R14y1S79T/"},{key:35,image:RH,title:"Rust在物理引擎研发中的应用",text:"在本周的前沿技术分享中,我们邀请到了Motphys CEO崔汉青,来为大家分享Rust在物理引擎研发中的应用。",date:"2023.06.27",url:"https://b23.tv/BZuSvyW"},{key:40,image:MH,title:"基于BSV的RTL仿真加速设计研究",text:"BSV的仿真加速可以提升硬件开发调试的效率。在本周的前沿技术分享中,我们邀请到了梁之杰,来为大家分享基于BSV的RTL仿真加速设计研究。",date:"2023.07.09",url:"https://www.bilibili.com/video/BV1ou411L7Yy/"},{key:41,image:LH,title:"RDMA网络的系统测试方案",text:"在本周的前沿技术分享中,我们邀请到了孔心皓,来为大家分享RDMA 网络的系统测试方案。",date:"2023.07.16",url:"https://www.bilibili.com/video/BV1tz4y147rw/"},{key:42,image:AH,title:"RapidWright技术分享会",text:"在本周的前沿技术分享中,我们邀请到了西南交通大学邸志雄副教授和他的学生向瀚章,来为大家分享开源FPGA设计工具RapidWright技术。",date:"2023.07.28",url:"https://www.bilibili.com/video/BV14z4y1x7a8/"},{key:43,image:IH,title:"基于Karmada实现Kubernetes应用跨集群故障转移",text:"在本周的前沿技术分享中,我们邀请到了开源爱好者,云兴科技软件研发工程师梁远鹏,来为大家分享基于Karmada实现Kubernetes应用跨集群故障转移。",date:"2023.08.01",url:"https://www.bilibili.com/video/BV1rN411Y7aZ/"},{key:50,image:NH,title:"大模型训练和基础设施",text:"在本周的前沿技术分享中,我们邀请到了范一呈,来为大家分享大模型训练和基础设施。",date:"2023.09.01",url:"https://www.bilibili.com/video/BV1ZN4y1R7HP/"},{key:51,image:$H,title:"RustBelt与Rust形式化方法",text:"在本周的前沿技术分享中,我们邀请到了王俊吉,来为大家分享RustBelt与Rust形式化方法。",date:"2023.09.04",url:"https://www.bilibili.com/video/BV1Vw411D7rT/"},{key:52,image:zH,title:"网络的智能该放在哪里:网卡、交换机还是xPU",text:"在本周的前沿技术分享中,我们邀请到了Logenic AI联合创始人、前华为天才少年李博杰,来为大家分享网络的智能该放在哪里:网卡、交换机还是xPU。",date:"2023.09.25",url:"https://www.bilibili.com/video/BV1Kw411Y7Cj/"},{key:53,image:HH,title:"以ARM为镜的RISC-V",text:"在本周的前沿技术分享中,我们邀请到了Logenic AI联合创始人、前华为天才少年李博杰,来为大家分享网络的智能该放在哪里:网卡、交换机还是xPU。",date:"2023.09.25",url:"https://www.bilibili.com/video/BV1Kw411Y7Cj/"},{key:54,image:YH,title:"面向网络测量的可编程交换机优化技术",text:"在本周的前沿技术分享中,我们邀请到了北京大学计算机学院黄群助理教授,来为大家分享面向网络测量的可编程交换机优化技术。",date:"2023.10.20",url:"https://www.bilibili.com/video/BV1i84y1974F/"}],VH="/zh-cn/assets/cover1-42e6189a.jpg",WH="/zh-cn/assets/cover2-af26ed46.jpg",UH="/zh-cn/assets/cover3-9c9d21fa.jpg",BH=[{key:1,image:VH,title:"Xline-跨数据中心一致性的元数据管理",text:"天空计算是云平台上的一层,其目标是打通彼此孤立的云,将分布式系统从数据中心范围扩展到全球范围。Xline是一款开源分布式KV存储系统,基于Curp共识算法实现,旨在提供跨云元数据管理的功能。相比于传统共识协议Raft或Paxos,Curp在天空计算的场景中有着更好的性能表现。本次分享将聚焦于共识算法,从天空计算的背景和挑战出发,介绍Curp共识算法,以及Revision机制与Curp无序性语义之间的冲突,最后,简述下Xline未来的优化方向。欢迎了解更多关于Xline的信息:Https://github.com/datenlord/Xline",date:"2023.02.09",url:"https://www.bilibili.com/video/BV1XY411q7X8/"},{key:2,image:WH,title:"源码解读:Xline Curp共识协议的设计与实现",text:"传统单数据中心解决方案无法满足跨数据中心的场景对性能和一致性的需求。DatenLord推出开源分布式KV存储Xline,针对多数据中心场景,可以实现数据的高性能跨云、跨数据中心共享访问,并且保证数据的一致性。",date:"2023.04.30",url:"https://www.bilibili.com/video/BV1dL411h7YK/"},{key:3,image:UH,title:"Xline的Lease机制与实现",text:"传统单数据中心解决方案无法满足跨数据中心的场景对性能和一致性的需求。DatenLord推出开源分布式KV存储Xline,针对多数据中心场景,可以实现数据的高性能跨云、跨数据中心共享访问,并且保证数据的一致性。",date:"2023.06.09",url:"https://www.bilibili.com/video/BV1FX4y1h7X5/"}],GH="/zh-cn/assets/cover1-a1358db9.jpg",XH="/zh-cn/assets/cover2-b899ea12.jpg",KH="/zh-cn/assets/cover3-e0bf4798.jpg",QH="/zh-cn/assets/cover4-15b0b4f1.jpg",qH="/zh-cn/assets/cover5-7c4c2482.jpg",ZH="/zh-cn/assets/cover6-1c4d5c5f.jpg",JH="/zh-cn/assets/cover7-4f7454c0.jpg",eY="/zh-cn/assets/cover8-7e30c0fc.jpg",tY="/zh-cn/assets/cover9-e8c86c60.jpg",rY="/zh-cn/assets/cover10-bb13b118.jpg",nY="/zh-cn/assets/cover11-c29e9692.jpg",iY="/zh-cn/assets/cover12-6877e246.jpg",oY="/zh-cn/assets/cover13-5a4d97b0.jpg",sY=[{key:7,image:JH,title:"2022年Rust开发者大会Workshop One:用Rust实现RDMA高性能编程",text:"2022年7月31日,北京达坦科技有限公司获邀参加Rust China大会,并做公司专题workshop。这是本场workshop的第一部分,将为大家介绍如何用Rust实现RDMA高性能编程。",date:"2022.08.03",url:"https://www.bilibili.com/video/BV13e4y1D7Ch/"},{key:8,image:eY,title:"2022年Rust开发者大会Workshop Two:Async RDMA",text:"2022年7月31日,北京达坦科技有限公司获邀参加Rust China大会,并做公司专题workshop。这是第二部分workshop,将为大家介绍Async RDMA。",date:"2022.08.04",url:"https://www.bilibili.com/video/BV1Rh411M7EP/"},{key:9,image:tY,title:"2022年Rust开发者大会Workshop Three:Workshop动手实验环节",text:"2022年7月31日,北京达坦科技有限公司获邀参加Rust China大会,并做公司专题Workshop。这是本场Worshop的第三个部分:workshop动手环节 方便大家体验用Rust构建RDMA应用。",date:"2022.08.04",url:"https://www.bilibili.com/video/BV1oN4y1V7Hn/"},{key:1,image:GH,title:"Rust China Hackathon2022空中路演",text:"由Rust中文社区举办的题为「Rust For Fun」的首届Rust China Hackathon已经顺利完赛。达坦科技作为本届Hackathon的协办方,赞助参与本次企业组赛道。最终获得优胜奖的两支队伍在线上了举办一场空中路演。分享了:他们是如何思考拆解赛题的?在着手设计时碰到哪些难点和挑战?以及最终提交的代码设计思路和亮点。欢迎对Concurrent Indexing感兴趣的伙伴观看本条视频。",date:"2023.01.15",url:"https://www.bilibili.com/video/BV1xY41197Za/"},{key:2,image:XH,title:"4.8 Beijing Rust Meetup|张汉东《理解 Unsafe Rust》",text:"2023年4月8日,达坦科技联合南京大学、CloudWeGo、华为等技术专家成功举办了题为Rust 💡X的meetup。本场分享由《Rust 编程之道》作者、Rust 中文社区布道者张汉东老师进行,主题为《理解 Unsafe Rust》。",date:"2023.04.12",url:"https://www.bilibili.com/video/BV1c24y1A7aK/"},{key:3,image:KH,title:"4.8 Beijing Rust Meetup|冯洋《RUFES》",text:"2023年4月8日,达坦科技联合南京大学、CloudWeGo、华为等技术专家成功举办了题为Rust 💡X的meetup。本场由南京大学计算机科学与技术系助理研究员冯洋老师进行《基于实际场景应用分析的Rust库模糊测试技术报告》的演讲分享。",date:"2023.04.12",url:"https://www.bilibili.com/video/BV1Qo4y1n7tS/"},{key:4,image:QH,title:"4.8 Beijing Rust Meetup|施继成《Rust for Linux 6.2》",text:"2023年4月8日,达坦科技联合南京大学、CloudWeGo、华为等技术专家成功举办了题为Rust 💡X的meetup。本场分享由达坦科技联合创始人兼CTO施继成进行,演讲主题是《Rust for Linux 6.2》。",date:"2023.04.12",url:"https://www.bilibili.com/video/BV1Bs4y117Ze/"},{key:5,image:qH,title:"4.8 Beijing Rust Meetup|叶天星《用Rust实现Git传输协议、Git对象解析和数据库存储》",text:"2023年4月8日,达坦科技联合南京大学、CloudWeGo、华为等技术专家成功举办了题为Rust 💡X的meetup。本场分享由达坦科技联合创始人兼CTO施继成进行,演讲主题是《Rust for Linux 6.2》。",date:"2023.04.12",url:"https://www.bilibili.com/video/BV1Bs4y117Ze/"},{key:6,image:ZH,title:"4.8 Beijing Rust Meetup|茌海《Monoio:一个基于 io-uring 的 Rust Runtime》",text:"2023年4月8日,达坦科技联合南京大学、CloudWeGo、华为等技术专家成功举办了题为Rust 💡X的meetup。本场分享由达坦科技联合创始人兼CTO施继成进行,演讲主题是《Rust for Linux 6.2》。",date:"2023.04.12",url:"https://www.bilibili.com/video/BV1Rh411M7EP/"},{key:10,image:rY,title:"如何用Rust写分布式系统",text:"分享会介绍分布式KV Store (Xline) 整体的组成,以及不同组件之间如何去交互。在广域网下的分布式系统如何高效地达成共识,以及分布式系统如何实现容错。",date:"2023.06.24",url:"https://www.bilibili.com/video/BV1Hs4y1r7dD/"},{key:11,image:nY,title:"Building microsecond-scale system with modern networking in Rust",text:"随着新型网络技术,如RDMA的普及,现代分布式应用的延迟降到了毫秒甚至微秒级别。这为构建系统软件带来了新的挑战。Rust的zero-cost抽象及内存管理能力能够为构建新型分布式应用带来新的机遇。我将分享利用Rust在用户态及内核态构建新型系统软件的相关经验,包括如何利用Rust抽象RDMA硬件的底层抽象及如何在内核构建一个毫秒级的容器启动机制。",date:"2023.06.24",url:"https://www.bilibili.com/video/BV1Zo4y1P7Sg/"},{key:12,image:iY,title:"30分钟体验Rust for Linux内核模块开发",text:"本主题会提供构建好的docker开发环境,在30分钟内演示如何使用r4l开发一个简易内核模块,并介绍目前r4l的发展现状。可以自备好电脑现场体验。",date:"2023.06.24",url:"https://www.bilibili.com/video/BV12j411U78o/"},{key:13,image:oY,title:"DatenLord 2023 Hackathon赛题宣讲会",text:"达坦科技基于其跨云分布式文件系统DatenLord项目,结合AI大模型时代背景,搭建了擂台,在此正式向您发出邀约!本次大赛主题为 Explore the Possibilities 赛题深刻有趣,奖品丰厚多样,借此机会您不仅可以尽情施展才华、与来自全国各地优秀的青年才俊们同台PK,更将有机会与优秀的评委教师对话交流。Clock is Ticking!无需犹豫,行动起来吧!",date:"2023.11.25",url:"https://www.bilibili.com/video/BV1su4y157iB/"}],aY="/zh-cn/assets/cover1-b9371555.jpg",lY="/zh-cn/assets/cover2-41a903e3.jpg",cY="/zh-cn/assets/cover2-41a903e3.jpg",uY="/zh-cn/assets/cover2-41a903e3.jpg",dY="/zh-cn/assets/cover2-41a903e3.jpg",fY="/zh-cn/assets/cover2-41a903e3.jpg",hY="/zh-cn/assets/cover2-41a903e3.jpg",mY="/zh-cn/assets/cover2-41a903e3.jpg",pY="/zh-cn/assets/cover2-41a903e3.jpg",gY="/zh-cn/assets/cover13-a69a12b0.jpg",vY="/zh-cn/assets/cover14-3a97e013.jpg",yY="/zh-cn/assets/cover14-3a97e013.jpg",wY="/zh-cn/assets/cover14-3a97e013.jpg",_Y="/zh-cn/assets/cover14-3a97e013.jpg",xY="/zh-cn/assets/cover14-3a97e013.jpg",SY="/zh-cn/assets/cover14-3a97e013.jpg",bY="/zh-cn/assets/cover20-c97bc11b.jpg",kY="/zh-cn/assets/cover21-9f52ba13.jpg",CY="/zh-cn/assets/cover22-187b655a.jpg",DY="/zh-cn/assets/cover23-1e515665.jpg",EY="/zh-cn/assets/cover24-020d0c34.jpg",TY="/zh-cn/assets/cover25-cb84d871.jpg",jY="/zh-cn/assets/cover26-7a726e97.jpg",OY="/zh-cn/assets/cover27-401eea81.jpg",PY="/zh-cn/assets/cover28-6ddc6bee.jpg",RY="/zh-cn/assets/cover29-0d2deb11.jpg",MY=[{key:1,image:aY,title:"Utilizing SpinalHDL for Large-scale Datapath Design",text:"为了让对开源硬件感兴趣的朋友进一步了解SpinalHDL,达坦科技联合SpinalHDL社区举办一场题为《SpinalHDL应用前景探索》的线上研讨会(Webinar)。本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程(Flow)。这是本场研讨会的一个workshop:Utilizing SpinalHDL for Large-scale Datapath Design,由李天瑞进行分享。",date:"2022.12.20",url:"https://www.bilibili.com/video/BV1PM411m7DB/"},{key:2,image:lY,title:"A Network Attached Deep Learning Accelerator for FPGA Clusters",text:"为了让对开源硬件感兴趣的朋友进一步了解SpinalHDL,达坦科技联合SpinalHDL社区举办一场题为《SpinalHDL应用前景探索》的线上研讨会(Webinar)。本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程(Flow)。这是本场研讨会的三个workshop:A Network Attached Deep Learning Accelerator for FPGA Clusters,由Philipp Kreowsky Justin Knapheide进行分享。",date:"2022.12.20",url:"https://www.bilibili.com/video/BV1HM411m7mS/"},{key:3,image:cY,title:"Coding a microprogrammed protocol receiver in SpinalHDL",text:"为了让对开源硬件感兴趣的朋友进一步了解SpinalHDL,达坦科技联合SpinalHDL社区举办一场题为《SpinalHDL应用前景探索》的线上研讨会(Webinar)。本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程(Flow)。这是本场研讨会的五个workshop:Coding a microprogrammed protocol receiver in SpinalHDL,由Michael Meier进行分享。",date:"2022.12.20",url:"https://www.bilibili.com/video/BV1oK411z7VD/"},{key:4,image:uY,title:"Utilizing SpinalHDL to Accelerate Neuroscience",text:"为了让对开源硬件感兴趣的朋友进一步了解SpinalHDL,达坦科技联合SpinalHDL社区举办一场题为《SpinalHDL应用前景探索》的线上研讨会(Webinar)。本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程(Flow)。这是本场研讨会的二个workshop:Utilizing SpinalHDL to Accelerate Neuroscience,由Jeff-Ciesielski进行分享。",date:"2022.12.20",url:"https://www.bilibili.com/video/BV1GG4y1J7gU/"},{key:5,image:dY,title:"SpinalHDL in Computer Architecture Research",text:"为了让对开源硬件感兴趣的朋友进一步了解SpinalHDL,达坦科技联合SpinalHDL社区举办一场题为《SpinalHDL应用前景探索》的线上研讨会(Webinar)。本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程(Flow)。这是本场研讨会的四个workshop:SpinalHDL in Computer Architecture Research,由Sallar Ahmadi-Pour ( saahm)进行分享。",date:"2022.12.20",url:"https://www.bilibili.com/video/BV1gA411X7f8/"},{key:6,image:fY,title:"NaxRiscv: A Pipeline/Plugins/SpinalHDL/Scala mix",text:"为了让对开源硬件感兴趣的朋友进一步了解SpinalHDL,达坦科技联合SpinalHDL社区举办一场题为《SpinalHDL应用前景探索》的线上研讨会(Webinar)。本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程(Flow)。这是本场研讨会的第六个workshop:NaxRiscv: A Pipeline/Plugins/SpinalHDL/Scala mix,由Dolu1990进行分享。",date:"2022.12.21",url:"https://www.bilibili.com/video/BV13K41167q5/"},{key:7,image:hY,title:"Recent progress on formal verification support on SpinalHDL",text:"为了让对开源硬件感兴趣的朋友进一步了解SpinalHDL,达坦科技联合SpinalHDL社区举办一场题为《SpinalHDL应用前景探索》的线上研讨会(Webinar)。本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程(Flow)。这是本场研讨会的第七个workshop:Recent progress on formal verification support on SpinalHDL,由Xiao Yindong (Readon)进行分享。",date:"2022.12.21",url:"https://www.bilibili.com/video/BV1bG411N7fk/"},{key:8,image:mY,title:"SpinalHDL for ASIC",text:"为了让对开源硬件感兴趣的朋友进一步了解SpinalHDL,达坦科技联合SpinalHDL社区举办一场题为《SpinalHDL应用前景探索》的线上研讨会(Webinar)。本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程(Flow)。这是本场研讨会的第八个workshop:SpinalHDL for ASIC,由Sebastien-riou进行分享。",date:"2022.12.21",url:"https://www.bilibili.com/video/BV16e4y1L7dV/"},{key:9,image:pY,title:"From Peripheral Plugins to Product documentation",text:"为了让对开源硬件感兴趣的朋友进一步了解SpinalHDL,达坦科技联合SpinalHDL社区举办一场题为《SpinalHDL应用前景探索》的线上研讨会(Webinar)。本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程(Flow)。这是本场研讨会的第九个workshop:From Peripheral Plugins to Product documentation,由Andreas Wallner进行分享。",date:"2022.12.21",url:"https://www.bilibili.com/video/BV12v4y1Q7cg/"},{key:13,image:gY,title:"Coroutines Applied to a Tilelink Interconnect Elaboration",text:"SpinalHDL始于2014年,最初是作为VHDL/Verilog的替代而做的创新尝试,伴随着数年来开源硬件设计的蓬勃发展,基于开源技术的硬件设计方法和范式逐渐受到业界的关注。达坦科技联合了SpinalHDL社区,以及四川芯测电子技术有限公司举办了一场题为SpinalHDL的使用和开发经验研讨会,旨在和大家分享SpinalHDL最新的实践、挑战和经验的分享。本视频为Workshop的第一部分,由Charles Popen进行分享。",date:"2023.07.08",url:"https://www.bilibili.com/video/BV1Vz4y1J7ck/"},{key:14,image:vY,title:"RISC-V敏捷硬件开发-软件定义芯片",text:"2023年8月23日至25日, 2023 RISC-V中国峰会在北京香格里拉饭店举办。作为本届RISC-V中国峰会的同期活动,8月25日下午,达坦科技在线上举办了第二届硬件敏捷开发与验证方法学研讨会。本次研讨会邀请了业界多位专家分享他们在各自领域的硬件敏捷开发与验证实践经验,为业界提供一次深入探讨和交流的机会,促进硬件敏捷开发与验证方法学的发展与落地。这是本场研讨会的第一个分享《RISC-V敏捷硬件开发-软件定义芯片》。",date:"2023.08.25",url:"https://www.bilibili.com/video/BV1Qh4y1K7pH/"},{key:15,image:yY,title:"香山处理器与敏捷开发工具链的最新进展",text:"2023年8月23日至25日, 2023 RISC-V中国峰会在北京香格里拉饭店举办。作为本届RISC-V中国峰会的同期活动,8月25日下午,达坦科技在线上举办了第二届硬件敏捷开发与验证方法学研讨会。本次研讨会邀请了业界多位专家分享他们在各自领域的硬件敏捷开发与验证实践经验,为业界提供一次深入探讨和交流的机会,促进硬件敏捷开发与验证方法学的发展与落地。这是本场研讨会的第二个分享《香山处理器与敏捷开发工具链的最新进展》。",date:"2023.08.25",url:"https://www.bilibili.com/video/BV1Dz4y1T7V6/"},{key:16,image:wY,title:"数据流式编程在硬件设计中的应用",text:"2023年8月23日至25日, 2023 RISC-V中国峰会在北京香格里拉饭店举办。作为本届RISC-V中国峰会的同期活动,8月25日下午,达坦科技在线上举办了第二届硬件敏捷开发与验证方法学研讨会。本次研讨会邀请了业界多位专家分享他们在各自领域的硬件敏捷开发与验证实践经验,为业界提供一次深入探讨和交流的机会,促进硬件敏捷开发与验证方法学的发展与落地。这是本场研讨会的第三个分享《数据流式编程在硬件设计中的应用》。",date:"2023.08.25",url:"https://www.bilibili.com/video/BV12N411B7TN/"},{key:17,image:_Y,title:"EDA创新推动敏捷芯片设计",text:"2023年8月23日至25日, 2023 RISC-V中国峰会在北京香格里拉饭店举办。作为本届RISC-V中国峰会的同期活动,8月25日下午,达坦科技在线上举办了第二届硬件敏捷开发与验证方法学研讨会。本次研讨会邀请了业界多位专家分享他们在各自领域的硬件敏捷开发与验证实践经验,为业界提供一次深入探讨和交流的机会,促进硬件敏捷开发与验证方法学的发展与落地。这是本场研讨会的第四个分享《EDA创新推动敏捷芯片设计》。",date:"2023.08.25",url:"https://www.bilibili.com/video/BV1Tz4y1M7vt/"},{key:18,image:xY,title:"Automated CPU design with AI",text:"2023年8月23日至25日, 2023 RISC-V中国峰会在北京香格里拉饭店举办。作为本届RISC-V中国峰会的同期活动,8月25日下午,达坦科技在线上举办了第二届硬件敏捷开发与验证方法学研讨会。本次研讨会邀请了业界多位专家分享他们在各自领域的硬件敏捷开发与验证实践经验,为业界提供一次深入探讨和交流的机会,促进硬件敏捷开发与验证方法学的发展与落地。这是本场研讨会的第五个分享《Automated CPU design with AI》。",date:"2023.08.25",url:"https://www.bilibili.com/video/BV13w411Q7zi/"},{key:19,image:SY,title:"MetaHVL硬件敏捷验证与协同仿真",text:"2023年8月23日至25日, 2023 RISC-V中国峰会在北京香格里拉饭店举办。作为本届RISC-V中国峰会的同期活动,8月25日下午,达坦科技在线上举办了第二届硬件敏捷开发与验证方法学研讨会。本次研讨会邀请了业界多位专家分享他们在各自领域的硬件敏捷开发与验证实践经验,为业界提供一次深入探讨和交流的机会,促进硬件敏捷开发与验证方法学的发展与落地。这是本场研讨会的第六个分享《MetaHVL硬件敏捷验证与协同仿》。",date:"2023.08.26",url:"https://www.bilibili.com/video/BV1DN4y197Pm/"},{key:20,image:bY,title:"计算机体系结构MIT课程学习社区经验分享",text:"在2023年初,达坦科技发起成立硬件设计学习社区,邀请所有有志于从事数字芯片设计的同学加入我们的学习互助自学小组,以理解数字芯片设计的精髓,强化理论知识的同时提升实操技能,继而整体提升设计能力。本场分享主题为【计算机体系结构MIT课程学习社区经验分享】,旨在了解学习社区各位同学学习的状态和面临的挑战,邀请已完成课程的学员分享学习和动手操作LAB的经验和教训,以此更好地辅助大家完成课程。",date:"2023.07.08",url:"https://www.bilibili.com/video/BV1cs4y1r7T3/"},{key:21,image:kY,title:"计算机体系结构 l MIT课程学习新手上路宣讲",text:"达坦科技在2023年始,发起成立计算机体系结构- MIT课程学习社区,号召感兴趣的工程师和同学系统地学习计算机体系结构相关知识,并且通过动手项目来验证学习的成果。为此,达坦科技软硬件联合开发工程师米明恒在2023年9月23日(周六)上午10:30为大家带来了一场计算机体系结构 l MIT课程学习新手上路宣讲。",date:"2023.09.24",url:"https://www.bilibili.com/video/BV1u8411i7Qw/"},{key:22,image:CY,title:"Stream Transaction Extender设计与验证",text:"达坦科技联合了SpinalHDL社区,以及四川芯测电子技术有限公司举办了一场题为SpinalHDL的使用和开发经验研讨会,旨在和大家分享SpinalHDL最新的实践、挑战和经验的分享。本视频为Workshop的第二部分,由电子科技大学副教授肖寅东(Readon)进行分享。",date:"2023.07.08",url:"https://www.bilibili.com/video/BV1pM4y1j7Lm/"},{key:23,image:DY,title:"面向Multi-Die FPGA的设计与部署自动化方法探索",text:"达坦科技联合了SpinalHDL社区,以及四川芯测电子技术有限公司举办了一场题为SpinalHDL的使用和开发经验研讨会,旨在和大家分享SpinalHDL最新的实践、挑战和经验的分享。本视频为Workshop的第三部分,由西安交通大学副教授邸志雄进行分享。",date:"2023.07.08",url:"https://www.bilibili.com/video/BV1og4y1c7RS/"},{key:24,image:EY,title:"Get Started with SpinalHDL with a Simplified Setup",text:"在2023年12月10日,达坦科技联合SpinalHDL社区及该语言的创建者 Charles Papon 举办了 《2023 SpinalHDL应用前景探索》的线上研讨会,这是研讨会第一个视频,Get Started with SpinalHDL with a Simplified Setup",date:"2023.12.17",url:"https://www.bilibili.com/video/BV1TW4y1F7uQ/"},{key:25,image:TY,title:"Some Tips on Using Memory Black Box in SpinalHDL",text:"在2023年12月10日,达坦科技联合SpinalHDL社区及该语言的创建者 Charles Papon 举办 了《2023 SpinalHDL应用前景探索》的线上研讨会,分为两个Track。这是第二个视频,由yportne13带来“Some Tips on Using Memory Black Box in SpinalHDL”。",date:"2023.12.17",url:"https://www.bilibili.com/video/BV1LC4y1g7c7/"},{key:26,image:jY,title:"Pipelining API Introduction",text:"在2023年12月10日,达坦科技联合SpinalHDL社区及该语言的创建者 Charles Papon 举办 了《2023 SpinalHDL应用前景探索》的线上研讨会,分为两个Track。这是第三个视频,由Charles Papon带来“Pipelining API Introduction”。",date:"2023.12.17",url:"https://www.bilibili.com/video/BV1Zj411n7SC/"},{key:27,image:OY,title:"SpinalHDL Intro for New Users",text:"在2023年12月10日,达坦科技联合SpinalHDL社区及该语言的创建者 Charles Papon 举办 了《2023 SpinalHDL应用前景探索》的线上研讨会,分为两个Track。这是第四个视频,由Andreas Wallner带来“SpinalHDL Intro for New Users”。",date:"2023.12.17",url:"https://www.bilibili.com/video/BV1Mw41147aS/"},{key:28,image:PY,title:"Pcie Brief Introduction",text:"在2023年12月10日,达坦科技联合SpinalHDL社区及该语言的创建者 Charles Papon 举办 了《2023 SpinalHDL应用前景探索》的线上研讨会,分为两个Track。这是第五个视频,由Chenbo带来“Pcie Brief Introduction”。",date:"2023.12.17",url:"https://www.bilibili.com/video/BV1Mw41147aS/"},{key:29,image:RY,title:"The J1Sc Family",text:"在2023年12月10日,达坦科技联合SpinalHDL社区及该语言的创建者 Charles Papon 举办 了《2023 SpinalHDL应用前景探索》的线上研讨会,分为两个Track。这是第六个视频,由Christopher Lozinsk带来“The J1Sc Family”。",date:"2023.12.17",url:"https://www.bilibili.com/video/BV1Jc411o7A6/"}],{Heading:LY,Paragraph:AY}=Me,{CNHead4:IY,CNTitleLarge:NY}=LY,{CNMarkSmall:$Y,CNBodySmall:zY}=AY,mc=new Map([["tech-talk",{label:"前沿科技分享",description:"探索前沿技术,拥抱创新与改变",list:FH,recommend:27}],["oss-showcase",{label:"开源产品分享",description:"软硬件融合创新实践的观察与输出",list:BH,recommend:2}],["rust-showcase",{label:"Rust语言应用及案例分享",description:"Rust编程语言的应用、实践与探索",list:sY,recommend:12}],["hardware-acceleration",{label:"硬件加速",description:"硬件加速领域的实践、经验与挑战",list:MY,recommend:21}]]),HY=f.main``,YY=f.div` +`,ow=()=>{const{sectionId:e}=gn();return N.useEffect(()=>{const t=document.querySelector(`#${e}`);t?t==null||t.scrollIntoView():window.scrollTo(0,0)},[e]),l.jsxs(Pt.Fragment,{children:[l.jsx(yn,{cover:KS,subTitle:"通过实现跨云、跨数据中心的数据高速访问,DatenLord将大大提升存储系统的可扩展性,同时大大降低企业级IT业务系统在实现高可用性、多活方面的复杂性。随着多云、多数据中心成为企业级IT的主流架构,跨云分布式存储将在互联网、金融、电信、能源等不同行业得到广泛应用。",children:"公司"}),l.jsx(Kz,{id:"join-us",children:l.jsxs(Qz,{children:[l.jsx(qz,{children:"加入我们"}),l.jsx(b8,{}),l.jsx(H8,{}),l.jsx(K8,{}),l.jsx(wz,{})]})}),l.jsx(Bz,{})]})},Zz="/zh-cn/assets/video-demo-cover-6531bf08.png",hc="/zh-cn/assets/arrow-up-right-f6ca128c.svg",Jz="/zh-cn/assets/cover1-0f766121.jpg",eH="/zh-cn/assets/cover2-6c924915.jpg",tH="/zh-cn/assets/cover3-a8cadd7b.jpg",rH="/zh-cn/assets/cover4-da59baaf.jpg",nH="/zh-cn/assets/cover5-55104208.jpg",iH="/zh-cn/assets/cover6-bf6d56c4.jpg",oH="/zh-cn/assets/cover7-461ad08e.jpg",sH="/zh-cn/assets/cover8-18bb5252.jpg",aH="/zh-cn/assets/cover9-0cfe7433.jpg",lH="/zh-cn/assets/cover10-7707f5f7.jpg",cH="/zh-cn/assets/cover11-18bf7e52.jpg",uH="/zh-cn/assets/cover12-2ec52bb9.jpg",dH="/zh-cn/assets/cover13-20980f41.jpg",fH="/zh-cn/assets/cover14-6dff9a13.jpg",hH="/zh-cn/assets/cover15-f2819b4b.jpg",mH="/zh-cn/assets/cover16-6b3eea77.jpg",pH="/zh-cn/assets/cover17-2d99b802.jpg",gH="/zh-cn/assets/cover19-9503f8ee.jpg",vH="/zh-cn/assets/cover20-a198bfe8.jpg",yH="/zh-cn/assets/cover21-c1808615.jpg",wH="/zh-cn/assets/cover22-a24d3264.jpg",_H="/zh-cn/assets/cover23-91837162.jpg",xH="/zh-cn/assets/cover24-f34d429f.jpg",SH="/zh-cn/assets/cover25-11f1a4dd.jpg",bH="/zh-cn/assets/cover26-574c835d.jpg",kH="/zh-cn/assets/cover27-cab7b800.jpg",CH="/zh-cn/assets/cover28-61988539.jpg",DH="/zh-cn/assets/cover29-cfa296fc.jpg",EH="/zh-cn/assets/cover30-6bc9e17a.jpg",TH="/zh-cn/assets/cover31-de17416a.jpg",jH="/zh-cn/assets/cover32-64d8c4cf.jpg",OH="/zh-cn/assets/cover33-747e46a5.jpg",PH="/zh-cn/assets/cover34-b47433e8.jpg",RH="/zh-cn/assets/cover35-474e265e.jpg",MH="/zh-cn/assets/cover40-e2bf253f.jpg",LH="/zh-cn/assets/cover41-56007738.jpg",AH="/zh-cn/assets/cover42-075bcf74.jpg",IH="/zh-cn/assets/cover43-d1896502.jpg",NH="/zh-cn/assets/cover50-2dc33471.jpg",$H="/zh-cn/assets/cover51-235c2ee6.jpg",zH="/zh-cn/assets/cover52-06cc8093.jpg",HH="/zh-cn/assets/cover53-11208fe4.jpg",YH="/zh-cn/assets/cover54-00d520f8.jpg",FH=[{key:1,image:Jz,title:"Virtio-net相关知识介绍与Rust-for-Linux基本知识",text:"本场workshop由达坦科技李弘宇进行内容分享,主要介绍了Virtio-net相关知识介绍与Rust-for-Linux基本知识。欢迎参加达坦科技DatenLord相关开源项目:https://github.com/datenlord/linux/tree/rust_virtio",date:"2022.08.17",url:"https://www.bilibili.com/video/BV17G4y1a7Bv/"},{key:2,image:eH,title:"roce-sim Workshop分享",text:"本场workshop由达坦科技王恒宇进行内容分享,主要介绍了roce-sim相关知识分享,如果您对这方面有兴趣,欢迎参与达坦科技开源项目:Github链接:https://github.com/datenlord/roce-sim",date:"2022.08.25",url:"https://www.bilibili.com/video/BV1UB4y137Tn/"},{key:3,image:tH,title:"Cocotb Workshop分享",text:"本场workshop由达坦科技DatenLord 翁万正进行内容分享,主要进行了cocotb相关知识介绍。",date:"2022.09.23",url:"https://www.bilibili.com/video/BV19e4y1k7EE/"},{key:4,image:rH,title:"使用Copilot在分布式系统中容忍暂时变慢的节点",text:"本场workshop由达坦科技DatenLord 田野进行内容分享,主要进行了“使用Copilot在分布式系统中容忍暂时变慢的节点“相关知识介绍。",date:"2022.09.30",url:"https://www.bilibili.com/video/BV15e411T7pX/"},{key:5,image:nH,title:"硬件设计的集合方法",text:"本场workshop由达坦科技DatenLord李天瑞进行内容分享,主要进行了“硬件设计的集合方法”相关知识介绍。",date:"2022.10.09",url:"https://www.bilibili.com/video/BV1FK411Q7JV/"},{key:6,image:iH,title:"VLSI Sharing",text:"本场workshop由达坦科技DatenLord李天瑞进行内容分享,主要进行了VLSI相关知识介绍。",date:"2022.10.15",url:"https://www.bilibili.com/video/BV1bK411Q7GB/"},{key:7,image:oH,title:"Corumdum介绍",text:"本场workshop由西安电子科技大学 ISN网络与交换团队 硕士研究生李钊进行内容分享,主要进行了Corumdum相关知识介绍。",date:"2022.10.16",url:"https://www.bilibili.com/video/BV1qG41177Pq/"},{key:8,image:sH,title:"可编程交换机:原理与使用",text:"本场workshop由上海交通大学IPADS实验室博士二年级 张汉泽进行内容分享,主要进行了“可编程交换机:原理与使用”相关知识分享。可编程交换机由安装包处理规则的控制面与负责高速包处理的数据面构成,两者由一根PCIe总线相连。控制面支持高级语言编程,而数据面逻辑需要用P4语言编写。在可编程交换机上设计系统主要面临数据面内存有限与P4编程模型受限两大挑战。",date:"2022.10.23",url:"https://www.bilibili.com/video/BV1jm4y1w7w3/"},{key:9,image:aH,title:"形式化验证入门",text:"本场workshop由达坦科技DatenLord王璞进行内容分享,主要进行了形式化验证入门相关知识介绍。",date:"2022.10.26",url:"https://www.bilibili.com/video/BV1DG411L78p/"},{key:10,image:lH,title:"利用RDMA加速FaaS服务",text:"本场workshop由达坦科技DatenLord李弘宇进行内容分享,主要进行了“利用RDMA加速FaaS服务”相关知识介绍。",date:"2022.11.06",url:"https://www.bilibili.com/video/BV1et4y1K7Sw/"},{key:11,image:cH,title:"Rust for Linux",text:"本场workshop由苏宇恒进行内容分享,主要进行了“Rust for Linux”相关知识介绍。",date:"2022.11.08",url:"https://www.bilibili.com/video/BV1G8411a7CE/"},{key:12,image:uH,title:"Intel用户态中断",text:"本场workshop由韩明聪进行内容分享,主要进行了“Intel用户态中断”相关知识介绍。",date:"2022.11.08",url:"https://www.bilibili.com/video/BV1tG4y1t7Lg/"},{key:13,image:dH,title:"VLSI DSP Sharing",text:"本场workshop由达坦科技DatenLord李天瑞进行内容分享,主要进行了“VLSI DSP Intro”相关知识介绍。",date:"2022.11.11",url:"https://www.bilibili.com/video/BV18P4y1y7iP/"},{key:14,image:fH,title:"DSP Sharing Part2",text:"本场workshop由达坦科技DatenLord李天瑞进行内容分享,主要就DSP相关知识进行第二次workshop分享",date:"2022.11.12",url:"https://www.bilibili.com/video/BV1bM411k7YP/"},{key:15,image:hH,title:"eunomia-bpf: 结合 wasm 的 ebpf 轻量级开发框架",text:"本场workshop由浙江大学学生/eunomia-bpf 开发者 郑昱笙进行内容分享,主要内容围绕“eunomia-bpf: 结合 wasm 的 ebpf 轻量级开发框架”相关知识。",date:"2022.11.20",url:"https://www.bilibili.com/video/BV1u84y1C7pQ/"},{key:16,image:mH,title:"RDMA网络拥塞管理架构",text:"本场workshop由北京邮电大学网络与交换国家重点实验室、计算机学院,副研究员、博导:张乙然进行内容分享,主要内容围绕“RDMA网络拥塞管理架构”进行知识介绍。",date:"2022.11.27",url:"https://www.bilibili.com/video/BV1Ve4y1g7gx/"},{key:17,image:pH,title:"使用RDMA加速服务器无感知计算容器启动",text:"本场workshop由上海交通大学助理教授魏星达进行分享,主要内容围绕“使用RDMA加速服务器无感知计算容器启动”进行知识介绍。",date:"2022.12.04",url:"https://www.bilibili.com/video/BV1qG4y1G784/"},{key:19,image:gH,title:"基于智能网卡的数据处理系统",text:"本场workshop由浙江大学百人计划研究员 王则可进行分享,主要内容为“基于智能网卡的数据处理系统”介绍。",date:"2022.12.18",url:"https://www.bilibili.com/video/BV1Eg411J7fJ/"},{key:20,image:vH,title:"异步事件驱动的电路机制 & 基于RISC-V的全异步超标量CPU体系结构",text:"本场workshop由何安平副教授进行分享,主要内容为“异步事件驱动的电路机制 & 基于RISC-V的全异步超标量CPU体系结构”介绍。",date:"2022.12.25",url:"https://www.bilibili.com/video/BV1sA411D7on/"},{key:21,image:yH,title:"使用 TLA+ 为分布式算法验证正确性",text:"本场workshop由达坦科技DatenLord田野进行分享,主要内容为“使用 TLA+ 为分布式算法验证正确性”介绍。",date:"2023.01.09",url:"https://www.bilibili.com/video/BV1pG4y1y7an/"},{key:22,image:wH,title:"喷泉码技术简介",text:"本场workshop由兰州大学信息科学与工程学院副教授、通信工程专业系主任袁磊 进行分享,主要内容为“喷泉码技术简介”介绍。",date:"2023.01.15",url:"https://www.bilibili.com/video/BV1SM411b77k/"},{key:23,image:_H,title:"数据库隔离级别及MVCC",text:"本场workshop由达坦科技DatenLord施继成进行分享,主要内容为“数据库隔离级别及MVCC”介绍。",date:"2023.01.29",url:"https://www.bilibili.com/video/BV1sR4y1b7Cu/"},{key:24,image:xH,title:"互联网传输协议优化研究",text:"本场workshop由中国人民大学副教授李彤教授进行分享,主要内容为“互联网传输协议优化研究”介绍。",date:"2023.02.06",url:"https://www.bilibili.com/video/BV1X84y157vL/"},{key:25,image:SH,title:"高性能RDMA网络协议栈",text:"高性能RDMA网络协议栈是RDMA高性能网络的核心组成部分之一,它提供了支持RDMA技术的网络协议和驱动程序。在本周的前沿科技分享中,我们邀请到了湖南大学信息科学与工程学院的陈果教授来给我们分享高性能RDMA网络协议栈的话题。",date:"2023.02.28",url:"https://www.bilibili.com/video/BV1Y24y1n7Dk/"},{key:26,image:bH,title:"GPU抢占式任务调度",text:"GPU编程可以大幅提升计算速度和效率,从而使得许多计算任务得以在合理时间内完成。随着GPU硬件技术的发展和大规模数据处理需求的增加,GPU编程的应用范围不断扩大。在本周的前沿科技分享中,我们邀请到了上海交通大学并行与分布式研究所的韩明聪博士来给我们分享GPU抢占式任务调度。",date:"2023.03.05",url:"https://www.bilibili.com/video/BV1cY4y1y7ND/"},{key:27,image:kH,title:"聊聊RaptorQ纠错码",text:"喷泉码具有极高的纠错能力,且具有低延迟、地复杂度、高效率等优点,使其在冷存储、分布式存储、无线通信等领域得到广泛应用。达坦科技致力于软硬件融合的解决方案,喷泉码的高效实现在硬件上,作为公司长期的技术储备,在本周的前沿科技分享中,达坦科技的联合创始人兼CTO施继成将为大家分享聊聊 RaptorQ 纠错码 。",date:"2023.03.15",url:"https://www.bilibili.com/video/BV1wL411C7DL/"},{key:28,image:CH,title:"Buddy Compiler 简介和愿景",text:"在本次分享中,中国科学院软件研究所博士生张洪滨将介绍Buddy Compiler 编译流程、协同设计、硬件支持。Buddy Compiler 是领域特定的编译器框架,致力于打造基于 MLIR 和 RISC-V 的软硬件协同设计生态。其目标是实现从 DSL 到 DSA 的编译流程和协同设计,愿景是让领域特定的协同设计不再困难。",date:"2023.03.21",url:"https://www.bilibili.com/video/BV1YT41167GB/"},{key:29,image:DH,title:"新一代计算架构:超异构计算",text:"AGI带来的变化之一是算力将进一步从CPU转到GPU,在本周的前沿技术分享中,我们邀请到了上海矩向科技创始人兼CEO黄朝波为大家分享新一代计算架构:超异构计算。",date:"2023.04.04",url:"https://www.bilibili.com/video/BV1Rm4y1q7Dx/"},{key:30,image:EH,title:"通过Chainsaw设计DSP电路",text:"DSP在数据压缩、编码和加密方面都发挥了重要的作用;SpinalHDL具有更高的抽象层次和更强的表达能力,可以大大简化DSP电路设计的复杂度和提高开发效率;而Chainsaw框架可以在不同的FPGA平台上运行,提高了设计的灵活性和可移植性。在本周的前沿技术分享中,我们邀请到了中山大学在读博士李天瑞为大家分享通过Chainsaw设计DSP电路。",date:"2023.04.18",url:"https://www.bilibili.com/video/BV14o4y1j7bH/"},{key:31,image:TH,title:"Something About Cache Security",text:"在本周的前沿技术分享中,我们邀请到了浙江大学在读硕士研究生缪晨露为大家分享她在MICRO和HPCA上发表的两篇论文的精华,演讲主题是Something About Cache Security。",date:"2023.04.25",url:"https://www.bilibili.com/video/BV1p24y1F7fN/"},{key:32,image:jH,title:"Rust嵌入式开发生态介绍及入门",text:"在本周的前沿技术分享中,我们邀请到了一位爱好硬件的软件工程师米明恒,来为大家分享Rust嵌入式开发生态介绍及入门。",date:"2023.05.04",url:"https://www.bilibili.com/video/BV1J24y1T7EH/"},{key:33,image:OH,title:"RDMA赋能数据中心/超算中心间远程互联",text:"在本周的前沿技术分享中,我们邀请到了南京大学田臣教授,来为大家分享RDMA赋能数据中心/超算中心间远程互联。",date:"2023.06.04",url:"https://www.bilibili.com/video/BV1cz4y1B7cx/"},{key:34,image:PH,title:"Paper Reading: DPU任务卸载",text:"达坦科技一直在探索用硬件加速做分布式跨云存储,在本周的前沿技术分享中,我们邀请到了中南大学在读博士生卢军,来为大家分享DPU任务卸载的相关研究。",date:"2023.06.17",url:"https://www.bilibili.com/video/BV1R14y1S79T/"},{key:35,image:RH,title:"Rust在物理引擎研发中的应用",text:"在本周的前沿技术分享中,我们邀请到了Motphys CEO崔汉青,来为大家分享Rust在物理引擎研发中的应用。",date:"2023.06.27",url:"https://b23.tv/BZuSvyW"},{key:40,image:MH,title:"基于BSV的RTL仿真加速设计研究",text:"BSV的仿真加速可以提升硬件开发调试的效率。在本周的前沿技术分享中,我们邀请到了梁之杰,来为大家分享基于BSV的RTL仿真加速设计研究。",date:"2023.07.09",url:"https://www.bilibili.com/video/BV1ou411L7Yy/"},{key:41,image:LH,title:"RDMA网络的系统测试方案",text:"在本周的前沿技术分享中,我们邀请到了孔心皓,来为大家分享RDMA 网络的系统测试方案。",date:"2023.07.16",url:"https://www.bilibili.com/video/BV1tz4y147rw/"},{key:42,image:AH,title:"RapidWright技术分享会",text:"在本周的前沿技术分享中,我们邀请到了西南交通大学邸志雄副教授和他的学生向瀚章,来为大家分享开源FPGA设计工具RapidWright技术。",date:"2023.07.28",url:"https://www.bilibili.com/video/BV14z4y1x7a8/"},{key:43,image:IH,title:"基于Karmada实现Kubernetes应用跨集群故障转移",text:"在本周的前沿技术分享中,我们邀请到了开源爱好者,云兴科技软件研发工程师梁远鹏,来为大家分享基于Karmada实现Kubernetes应用跨集群故障转移。",date:"2023.08.01",url:"https://www.bilibili.com/video/BV1rN411Y7aZ/"},{key:50,image:NH,title:"大模型训练和基础设施",text:"在本周的前沿技术分享中,我们邀请到了范一呈,来为大家分享大模型训练和基础设施。",date:"2023.09.01",url:"https://www.bilibili.com/video/BV1ZN4y1R7HP/"},{key:51,image:$H,title:"RustBelt与Rust形式化方法",text:"在本周的前沿技术分享中,我们邀请到了王俊吉,来为大家分享RustBelt与Rust形式化方法。",date:"2023.09.04",url:"https://www.bilibili.com/video/BV1Vw411D7rT/"},{key:52,image:zH,title:"网络的智能该放在哪里:网卡、交换机还是xPU",text:"在本周的前沿技术分享中,我们邀请到了Logenic AI联合创始人、前华为天才少年李博杰,来为大家分享网络的智能该放在哪里:网卡、交换机还是xPU。",date:"2023.09.25",url:"https://www.bilibili.com/video/BV1Kw411Y7Cj/"},{key:53,image:HH,title:"以ARM为镜的RISC-V",text:"在本周的前沿技术分享中,我们邀请到了Logenic AI联合创始人、前华为天才少年李博杰,来为大家分享网络的智能该放在哪里:网卡、交换机还是xPU。",date:"2023.09.25",url:"https://www.bilibili.com/video/BV1Kw411Y7Cj/"},{key:54,image:YH,title:"面向网络测量的可编程交换机优化技术",text:"在本周的前沿技术分享中,我们邀请到了北京大学计算机学院黄群助理教授,来为大家分享面向网络测量的可编程交换机优化技术。",date:"2023.10.20",url:"https://www.bilibili.com/video/BV1i84y1974F/"}],VH="/zh-cn/assets/cover1-42e6189a.jpg",WH="/zh-cn/assets/cover2-af26ed46.jpg",UH="/zh-cn/assets/cover3-9c9d21fa.jpg",BH=[{key:1,image:VH,title:"Xline-跨数据中心一致性的元数据管理",text:"天空计算是云平台上的一层,其目标是打通彼此孤立的云,将分布式系统从数据中心范围扩展到全球范围。Xline是一款开源分布式KV存储系统,基于Curp共识算法实现,旨在提供跨云元数据管理的功能。相比于传统共识协议Raft或Paxos,Curp在天空计算的场景中有着更好的性能表现。本次分享将聚焦于共识算法,从天空计算的背景和挑战出发,介绍Curp共识算法,以及Revision机制与Curp无序性语义之间的冲突,最后,简述下Xline未来的优化方向。欢迎了解更多关于Xline的信息:Https://github.com/datenlord/Xline",date:"2023.02.09",url:"https://www.bilibili.com/video/BV1XY411q7X8/"},{key:2,image:WH,title:"源码解读:Xline Curp共识协议的设计与实现",text:"传统单数据中心解决方案无法满足跨数据中心的场景对性能和一致性的需求。DatenLord推出开源分布式KV存储Xline,针对多数据中心场景,可以实现数据的高性能跨云、跨数据中心共享访问,并且保证数据的一致性。",date:"2023.04.30",url:"https://www.bilibili.com/video/BV1dL411h7YK/"},{key:3,image:UH,title:"Xline的Lease机制与实现",text:"传统单数据中心解决方案无法满足跨数据中心的场景对性能和一致性的需求。DatenLord推出开源分布式KV存储Xline,针对多数据中心场景,可以实现数据的高性能跨云、跨数据中心共享访问,并且保证数据的一致性。",date:"2023.06.09",url:"https://www.bilibili.com/video/BV1FX4y1h7X5/"}],GH="/zh-cn/assets/cover1-a1358db9.jpg",XH="/zh-cn/assets/cover2-b899ea12.jpg",KH="/zh-cn/assets/cover3-e0bf4798.jpg",QH="/zh-cn/assets/cover4-15b0b4f1.jpg",qH="/zh-cn/assets/cover5-7c4c2482.jpg",ZH="/zh-cn/assets/cover6-1c4d5c5f.jpg",JH="/zh-cn/assets/cover7-4f7454c0.jpg",eY="/zh-cn/assets/cover8-7e30c0fc.jpg",tY="/zh-cn/assets/cover9-e8c86c60.jpg",rY="/zh-cn/assets/cover10-bb13b118.jpg",nY="/zh-cn/assets/cover11-c29e9692.jpg",iY="/zh-cn/assets/cover12-6877e246.jpg",oY="/zh-cn/assets/cover13-5a4d97b0.jpg",sY="/zh-cn/assets/cover14-052a8b36.jpg",aY=[{key:7,image:JH,title:"2022年Rust开发者大会Workshop One:用Rust实现RDMA高性能编程",text:"2022年7月31日,北京达坦科技有限公司获邀参加Rust China大会,并做公司专题workshop。这是本场workshop的第一部分,将为大家介绍如何用Rust实现RDMA高性能编程。",date:"2022.08.03",url:"https://www.bilibili.com/video/BV13e4y1D7Ch/"},{key:8,image:eY,title:"2022年Rust开发者大会Workshop Two:Async RDMA",text:"2022年7月31日,北京达坦科技有限公司获邀参加Rust China大会,并做公司专题workshop。这是第二部分workshop,将为大家介绍Async RDMA。",date:"2022.08.04",url:"https://www.bilibili.com/video/BV1Rh411M7EP/"},{key:9,image:tY,title:"2022年Rust开发者大会Workshop Three:Workshop动手实验环节",text:"2022年7月31日,北京达坦科技有限公司获邀参加Rust China大会,并做公司专题Workshop。这是本场Worshop的第三个部分:workshop动手环节 方便大家体验用Rust构建RDMA应用。",date:"2022.08.04",url:"https://www.bilibili.com/video/BV1oN4y1V7Hn/"},{key:1,image:GH,title:"Rust China Hackathon2022空中路演",text:"由Rust中文社区举办的题为「Rust For Fun」的首届Rust China Hackathon已经顺利完赛。达坦科技作为本届Hackathon的协办方,赞助参与本次企业组赛道。最终获得优胜奖的两支队伍在线上了举办一场空中路演。分享了:他们是如何思考拆解赛题的?在着手设计时碰到哪些难点和挑战?以及最终提交的代码设计思路和亮点。欢迎对Concurrent Indexing感兴趣的伙伴观看本条视频。",date:"2023.01.15",url:"https://www.bilibili.com/video/BV1xY41197Za/"},{key:2,image:XH,title:"4.8 Beijing Rust Meetup|张汉东《理解 Unsafe Rust》",text:"2023年4月8日,达坦科技联合南京大学、CloudWeGo、华为等技术专家成功举办了题为Rust 💡X的meetup。本场分享由《Rust 编程之道》作者、Rust 中文社区布道者张汉东老师进行,主题为《理解 Unsafe Rust》。",date:"2023.04.12",url:"https://www.bilibili.com/video/BV1c24y1A7aK/"},{key:3,image:KH,title:"4.8 Beijing Rust Meetup|冯洋《RUFES》",text:"2023年4月8日,达坦科技联合南京大学、CloudWeGo、华为等技术专家成功举办了题为Rust 💡X的meetup。本场由南京大学计算机科学与技术系助理研究员冯洋老师进行《基于实际场景应用分析的Rust库模糊测试技术报告》的演讲分享。",date:"2023.04.12",url:"https://www.bilibili.com/video/BV1Qo4y1n7tS/"},{key:4,image:QH,title:"4.8 Beijing Rust Meetup|施继成《Rust for Linux 6.2》",text:"2023年4月8日,达坦科技联合南京大学、CloudWeGo、华为等技术专家成功举办了题为Rust 💡X的meetup。本场分享由达坦科技联合创始人兼CTO施继成进行,演讲主题是《Rust for Linux 6.2》。",date:"2023.04.12",url:"https://www.bilibili.com/video/BV1Bs4y117Ze/"},{key:5,image:qH,title:"4.8 Beijing Rust Meetup|叶天星《用Rust实现Git传输协议、Git对象解析和数据库存储》",text:"2023年4月8日,达坦科技联合南京大学、CloudWeGo、华为等技术专家成功举办了题为Rust 💡X的meetup。本场分享由达坦科技联合创始人兼CTO施继成进行,演讲主题是《Rust for Linux 6.2》。",date:"2023.04.12",url:"https://www.bilibili.com/video/BV1Bs4y117Ze/"},{key:6,image:ZH,title:"4.8 Beijing Rust Meetup|茌海《Monoio:一个基于 io-uring 的 Rust Runtime》",text:"2023年4月8日,达坦科技联合南京大学、CloudWeGo、华为等技术专家成功举办了题为Rust 💡X的meetup。本场分享由达坦科技联合创始人兼CTO施继成进行,演讲主题是《Rust for Linux 6.2》。",date:"2023.04.12",url:"https://www.bilibili.com/video/BV1Rh411M7EP/"},{key:10,image:rY,title:"如何用Rust写分布式系统",text:"分享会介绍分布式KV Store (Xline) 整体的组成,以及不同组件之间如何去交互。在广域网下的分布式系统如何高效地达成共识,以及分布式系统如何实现容错。",date:"2023.06.24",url:"https://www.bilibili.com/video/BV1Hs4y1r7dD/"},{key:11,image:nY,title:"Building microsecond-scale system with modern networking in Rust",text:"随着新型网络技术,如RDMA的普及,现代分布式应用的延迟降到了毫秒甚至微秒级别。这为构建系统软件带来了新的挑战。Rust的zero-cost抽象及内存管理能力能够为构建新型分布式应用带来新的机遇。我将分享利用Rust在用户态及内核态构建新型系统软件的相关经验,包括如何利用Rust抽象RDMA硬件的底层抽象及如何在内核构建一个毫秒级的容器启动机制。",date:"2023.06.24",url:"https://www.bilibili.com/video/BV1Zo4y1P7Sg/"},{key:12,image:iY,title:"30分钟体验Rust for Linux内核模块开发",text:"本主题会提供构建好的docker开发环境,在30分钟内演示如何使用r4l开发一个简易内核模块,并介绍目前r4l的发展现状。可以自备好电脑现场体验。",date:"2023.06.24",url:"https://www.bilibili.com/video/BV12j411U78o/"},{key:13,image:oY,title:"DatenLord 2023 Hackathon赛题宣讲会",text:"达坦科技基于其跨云分布式文件系统DatenLord项目,结合AI大模型时代背景,搭建了擂台,在此正式向您发出邀约!本次大赛主题为 Explore the Possibilities 赛题深刻有趣,奖品丰厚多样,借此机会您不仅可以尽情施展才华、与来自全国各地优秀的青年才俊们同台PK,更将有机会与优秀的评委教师对话交流。Clock is Ticking!无需犹豫,行动起来吧!",date:"2023.11.25",url:"https://www.bilibili.com/video/BV1su4y157iB/"},{key:14,image:sY,title:"DatenLord Hackathon2023空中路演",text:"DatenLord Hackathon 2023已经顺利完赛。达坦科技基于其跨云分布式文件系统DatenLord项目,结合AI大模型时代背景,搭建了擂台。我们邀请参赛者为DatenLord的极端场景设计并实现缓存 p2p 传输和同步模块。本次空中路演邀请了最终获得优胜奖的两支队伍进行思路分享,包括他们的解题思路,碰到的难点和挑战,以及如何应对的方法和设计亮点。欢迎感兴趣的大家进行观看,有问题也欢迎在评论区进行交流~~不要忘记一键三连哦~~",date:"2024.01.07",url:"https://www.bilibili.com/video/BV1ic411t7Nf/"}],lY="/zh-cn/assets/cover1-b9371555.jpg",cY="/zh-cn/assets/cover2-41a903e3.jpg",uY="/zh-cn/assets/cover2-41a903e3.jpg",dY="/zh-cn/assets/cover2-41a903e3.jpg",fY="/zh-cn/assets/cover2-41a903e3.jpg",hY="/zh-cn/assets/cover2-41a903e3.jpg",mY="/zh-cn/assets/cover2-41a903e3.jpg",pY="/zh-cn/assets/cover2-41a903e3.jpg",gY="/zh-cn/assets/cover2-41a903e3.jpg",vY="/zh-cn/assets/cover13-a69a12b0.jpg",yY="/zh-cn/assets/cover14-3a97e013.jpg",wY="/zh-cn/assets/cover14-3a97e013.jpg",_Y="/zh-cn/assets/cover14-3a97e013.jpg",xY="/zh-cn/assets/cover14-3a97e013.jpg",SY="/zh-cn/assets/cover14-3a97e013.jpg",bY="/zh-cn/assets/cover14-3a97e013.jpg",kY="/zh-cn/assets/cover20-c97bc11b.jpg",CY="/zh-cn/assets/cover21-9f52ba13.jpg",DY="/zh-cn/assets/cover22-187b655a.jpg",EY="/zh-cn/assets/cover23-1e515665.jpg",TY="/zh-cn/assets/cover24-020d0c34.jpg",jY="/zh-cn/assets/cover25-cb84d871.jpg",OY="/zh-cn/assets/cover26-7a726e97.jpg",PY="/zh-cn/assets/cover27-401eea81.jpg",RY="/zh-cn/assets/cover28-6ddc6bee.jpg",MY="/zh-cn/assets/cover29-0d2deb11.jpg",LY=[{key:1,image:lY,title:"Utilizing SpinalHDL for Large-scale Datapath Design",text:"为了让对开源硬件感兴趣的朋友进一步了解SpinalHDL,达坦科技联合SpinalHDL社区举办一场题为《SpinalHDL应用前景探索》的线上研讨会(Webinar)。本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程(Flow)。这是本场研讨会的一个workshop:Utilizing SpinalHDL for Large-scale Datapath Design,由李天瑞进行分享。",date:"2022.12.20",url:"https://www.bilibili.com/video/BV1PM411m7DB/"},{key:2,image:cY,title:"A Network Attached Deep Learning Accelerator for FPGA Clusters",text:"为了让对开源硬件感兴趣的朋友进一步了解SpinalHDL,达坦科技联合SpinalHDL社区举办一场题为《SpinalHDL应用前景探索》的线上研讨会(Webinar)。本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程(Flow)。这是本场研讨会的三个workshop:A Network Attached Deep Learning Accelerator for FPGA Clusters,由Philipp Kreowsky Justin Knapheide进行分享。",date:"2022.12.20",url:"https://www.bilibili.com/video/BV1HM411m7mS/"},{key:3,image:uY,title:"Coding a microprogrammed protocol receiver in SpinalHDL",text:"为了让对开源硬件感兴趣的朋友进一步了解SpinalHDL,达坦科技联合SpinalHDL社区举办一场题为《SpinalHDL应用前景探索》的线上研讨会(Webinar)。本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程(Flow)。这是本场研讨会的五个workshop:Coding a microprogrammed protocol receiver in SpinalHDL,由Michael Meier进行分享。",date:"2022.12.20",url:"https://www.bilibili.com/video/BV1oK411z7VD/"},{key:4,image:dY,title:"Utilizing SpinalHDL to Accelerate Neuroscience",text:"为了让对开源硬件感兴趣的朋友进一步了解SpinalHDL,达坦科技联合SpinalHDL社区举办一场题为《SpinalHDL应用前景探索》的线上研讨会(Webinar)。本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程(Flow)。这是本场研讨会的二个workshop:Utilizing SpinalHDL to Accelerate Neuroscience,由Jeff-Ciesielski进行分享。",date:"2022.12.20",url:"https://www.bilibili.com/video/BV1GG4y1J7gU/"},{key:5,image:fY,title:"SpinalHDL in Computer Architecture Research",text:"为了让对开源硬件感兴趣的朋友进一步了解SpinalHDL,达坦科技联合SpinalHDL社区举办一场题为《SpinalHDL应用前景探索》的线上研讨会(Webinar)。本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程(Flow)。这是本场研讨会的四个workshop:SpinalHDL in Computer Architecture Research,由Sallar Ahmadi-Pour ( saahm)进行分享。",date:"2022.12.20",url:"https://www.bilibili.com/video/BV1gA411X7f8/"},{key:6,image:hY,title:"NaxRiscv: A Pipeline/Plugins/SpinalHDL/Scala mix",text:"为了让对开源硬件感兴趣的朋友进一步了解SpinalHDL,达坦科技联合SpinalHDL社区举办一场题为《SpinalHDL应用前景探索》的线上研讨会(Webinar)。本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程(Flow)。这是本场研讨会的第六个workshop:NaxRiscv: A Pipeline/Plugins/SpinalHDL/Scala mix,由Dolu1990进行分享。",date:"2022.12.21",url:"https://www.bilibili.com/video/BV13K41167q5/"},{key:7,image:mY,title:"Recent progress on formal verification support on SpinalHDL",text:"为了让对开源硬件感兴趣的朋友进一步了解SpinalHDL,达坦科技联合SpinalHDL社区举办一场题为《SpinalHDL应用前景探索》的线上研讨会(Webinar)。本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程(Flow)。这是本场研讨会的第七个workshop:Recent progress on formal verification support on SpinalHDL,由Xiao Yindong (Readon)进行分享。",date:"2022.12.21",url:"https://www.bilibili.com/video/BV1bG411N7fk/"},{key:8,image:pY,title:"SpinalHDL for ASIC",text:"为了让对开源硬件感兴趣的朋友进一步了解SpinalHDL,达坦科技联合SpinalHDL社区举办一场题为《SpinalHDL应用前景探索》的线上研讨会(Webinar)。本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程(Flow)。这是本场研讨会的第八个workshop:SpinalHDL for ASIC,由Sebastien-riou进行分享。",date:"2022.12.21",url:"https://www.bilibili.com/video/BV16e4y1L7dV/"},{key:9,image:gY,title:"From Peripheral Plugins to Product documentation",text:"为了让对开源硬件感兴趣的朋友进一步了解SpinalHDL,达坦科技联合SpinalHDL社区举办一场题为《SpinalHDL应用前景探索》的线上研讨会(Webinar)。本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程(Flow)。这是本场研讨会的第九个workshop:From Peripheral Plugins to Product documentation,由Andreas Wallner进行分享。",date:"2022.12.21",url:"https://www.bilibili.com/video/BV12v4y1Q7cg/"},{key:13,image:vY,title:"Coroutines Applied to a Tilelink Interconnect Elaboration",text:"SpinalHDL始于2014年,最初是作为VHDL/Verilog的替代而做的创新尝试,伴随着数年来开源硬件设计的蓬勃发展,基于开源技术的硬件设计方法和范式逐渐受到业界的关注。达坦科技联合了SpinalHDL社区,以及四川芯测电子技术有限公司举办了一场题为SpinalHDL的使用和开发经验研讨会,旨在和大家分享SpinalHDL最新的实践、挑战和经验的分享。本视频为Workshop的第一部分,由Charles Popen进行分享。",date:"2023.07.08",url:"https://www.bilibili.com/video/BV1Vz4y1J7ck/"},{key:14,image:yY,title:"RISC-V敏捷硬件开发-软件定义芯片",text:"2023年8月23日至25日, 2023 RISC-V中国峰会在北京香格里拉饭店举办。作为本届RISC-V中国峰会的同期活动,8月25日下午,达坦科技在线上举办了第二届硬件敏捷开发与验证方法学研讨会。本次研讨会邀请了业界多位专家分享他们在各自领域的硬件敏捷开发与验证实践经验,为业界提供一次深入探讨和交流的机会,促进硬件敏捷开发与验证方法学的发展与落地。这是本场研讨会的第一个分享《RISC-V敏捷硬件开发-软件定义芯片》。",date:"2023.08.25",url:"https://www.bilibili.com/video/BV1Qh4y1K7pH/"},{key:15,image:wY,title:"香山处理器与敏捷开发工具链的最新进展",text:"2023年8月23日至25日, 2023 RISC-V中国峰会在北京香格里拉饭店举办。作为本届RISC-V中国峰会的同期活动,8月25日下午,达坦科技在线上举办了第二届硬件敏捷开发与验证方法学研讨会。本次研讨会邀请了业界多位专家分享他们在各自领域的硬件敏捷开发与验证实践经验,为业界提供一次深入探讨和交流的机会,促进硬件敏捷开发与验证方法学的发展与落地。这是本场研讨会的第二个分享《香山处理器与敏捷开发工具链的最新进展》。",date:"2023.08.25",url:"https://www.bilibili.com/video/BV1Dz4y1T7V6/"},{key:16,image:_Y,title:"数据流式编程在硬件设计中的应用",text:"2023年8月23日至25日, 2023 RISC-V中国峰会在北京香格里拉饭店举办。作为本届RISC-V中国峰会的同期活动,8月25日下午,达坦科技在线上举办了第二届硬件敏捷开发与验证方法学研讨会。本次研讨会邀请了业界多位专家分享他们在各自领域的硬件敏捷开发与验证实践经验,为业界提供一次深入探讨和交流的机会,促进硬件敏捷开发与验证方法学的发展与落地。这是本场研讨会的第三个分享《数据流式编程在硬件设计中的应用》。",date:"2023.08.25",url:"https://www.bilibili.com/video/BV12N411B7TN/"},{key:17,image:xY,title:"EDA创新推动敏捷芯片设计",text:"2023年8月23日至25日, 2023 RISC-V中国峰会在北京香格里拉饭店举办。作为本届RISC-V中国峰会的同期活动,8月25日下午,达坦科技在线上举办了第二届硬件敏捷开发与验证方法学研讨会。本次研讨会邀请了业界多位专家分享他们在各自领域的硬件敏捷开发与验证实践经验,为业界提供一次深入探讨和交流的机会,促进硬件敏捷开发与验证方法学的发展与落地。这是本场研讨会的第四个分享《EDA创新推动敏捷芯片设计》。",date:"2023.08.25",url:"https://www.bilibili.com/video/BV1Tz4y1M7vt/"},{key:18,image:SY,title:"Automated CPU design with AI",text:"2023年8月23日至25日, 2023 RISC-V中国峰会在北京香格里拉饭店举办。作为本届RISC-V中国峰会的同期活动,8月25日下午,达坦科技在线上举办了第二届硬件敏捷开发与验证方法学研讨会。本次研讨会邀请了业界多位专家分享他们在各自领域的硬件敏捷开发与验证实践经验,为业界提供一次深入探讨和交流的机会,促进硬件敏捷开发与验证方法学的发展与落地。这是本场研讨会的第五个分享《Automated CPU design with AI》。",date:"2023.08.25",url:"https://www.bilibili.com/video/BV13w411Q7zi/"},{key:19,image:bY,title:"MetaHVL硬件敏捷验证与协同仿真",text:"2023年8月23日至25日, 2023 RISC-V中国峰会在北京香格里拉饭店举办。作为本届RISC-V中国峰会的同期活动,8月25日下午,达坦科技在线上举办了第二届硬件敏捷开发与验证方法学研讨会。本次研讨会邀请了业界多位专家分享他们在各自领域的硬件敏捷开发与验证实践经验,为业界提供一次深入探讨和交流的机会,促进硬件敏捷开发与验证方法学的发展与落地。这是本场研讨会的第六个分享《MetaHVL硬件敏捷验证与协同仿》。",date:"2023.08.26",url:"https://www.bilibili.com/video/BV1DN4y197Pm/"},{key:20,image:kY,title:"计算机体系结构MIT课程学习社区经验分享",text:"在2023年初,达坦科技发起成立硬件设计学习社区,邀请所有有志于从事数字芯片设计的同学加入我们的学习互助自学小组,以理解数字芯片设计的精髓,强化理论知识的同时提升实操技能,继而整体提升设计能力。本场分享主题为【计算机体系结构MIT课程学习社区经验分享】,旨在了解学习社区各位同学学习的状态和面临的挑战,邀请已完成课程的学员分享学习和动手操作LAB的经验和教训,以此更好地辅助大家完成课程。",date:"2023.07.08",url:"https://www.bilibili.com/video/BV1cs4y1r7T3/"},{key:21,image:CY,title:"计算机体系结构 l MIT课程学习新手上路宣讲",text:"达坦科技在2023年始,发起成立计算机体系结构- MIT课程学习社区,号召感兴趣的工程师和同学系统地学习计算机体系结构相关知识,并且通过动手项目来验证学习的成果。为此,达坦科技软硬件联合开发工程师米明恒在2023年9月23日(周六)上午10:30为大家带来了一场计算机体系结构 l MIT课程学习新手上路宣讲。",date:"2023.09.24",url:"https://www.bilibili.com/video/BV1u8411i7Qw/"},{key:22,image:DY,title:"Stream Transaction Extender设计与验证",text:"达坦科技联合了SpinalHDL社区,以及四川芯测电子技术有限公司举办了一场题为SpinalHDL的使用和开发经验研讨会,旨在和大家分享SpinalHDL最新的实践、挑战和经验的分享。本视频为Workshop的第二部分,由电子科技大学副教授肖寅东(Readon)进行分享。",date:"2023.07.08",url:"https://www.bilibili.com/video/BV1pM4y1j7Lm/"},{key:23,image:EY,title:"面向Multi-Die FPGA的设计与部署自动化方法探索",text:"达坦科技联合了SpinalHDL社区,以及四川芯测电子技术有限公司举办了一场题为SpinalHDL的使用和开发经验研讨会,旨在和大家分享SpinalHDL最新的实践、挑战和经验的分享。本视频为Workshop的第三部分,由西安交通大学副教授邸志雄进行分享。",date:"2023.07.08",url:"https://www.bilibili.com/video/BV1og4y1c7RS/"},{key:24,image:TY,title:"Get Started with SpinalHDL with a Simplified Setup",text:"在2023年12月10日,达坦科技联合SpinalHDL社区及该语言的创建者 Charles Papon 举办了 《2023 SpinalHDL应用前景探索》的线上研讨会,这是研讨会第一个视频,Get Started with SpinalHDL with a Simplified Setup",date:"2023.12.17",url:"https://www.bilibili.com/video/BV1TW4y1F7uQ/"},{key:25,image:jY,title:"Some Tips on Using Memory Black Box in SpinalHDL",text:"在2023年12月10日,达坦科技联合SpinalHDL社区及该语言的创建者 Charles Papon 举办 了《2023 SpinalHDL应用前景探索》的线上研讨会,分为两个Track。这是第二个视频,由yportne13带来“Some Tips on Using Memory Black Box in SpinalHDL”。",date:"2023.12.17",url:"https://www.bilibili.com/video/BV1LC4y1g7c7/"},{key:26,image:OY,title:"Pipelining API Introduction",text:"在2023年12月10日,达坦科技联合SpinalHDL社区及该语言的创建者 Charles Papon 举办 了《2023 SpinalHDL应用前景探索》的线上研讨会,分为两个Track。这是第三个视频,由Charles Papon带来“Pipelining API Introduction”。",date:"2023.12.17",url:"https://www.bilibili.com/video/BV1Zj411n7SC/"},{key:27,image:PY,title:"SpinalHDL Intro for New Users",text:"在2023年12月10日,达坦科技联合SpinalHDL社区及该语言的创建者 Charles Papon 举办 了《2023 SpinalHDL应用前景探索》的线上研讨会,分为两个Track。这是第四个视频,由Andreas Wallner带来“SpinalHDL Intro for New Users”。",date:"2023.12.17",url:"https://www.bilibili.com/video/BV1Mw41147aS/"},{key:28,image:RY,title:"Pcie Brief Introduction",text:"在2023年12月10日,达坦科技联合SpinalHDL社区及该语言的创建者 Charles Papon 举办 了《2023 SpinalHDL应用前景探索》的线上研讨会,分为两个Track。这是第五个视频,由Chenbo带来“Pcie Brief Introduction”。",date:"2023.12.17",url:"https://www.bilibili.com/video/BV1Mw41147aS/"},{key:29,image:MY,title:"The J1Sc Family",text:"在2023年12月10日,达坦科技联合SpinalHDL社区及该语言的创建者 Charles Papon 举办 了《2023 SpinalHDL应用前景探索》的线上研讨会,分为两个Track。这是第六个视频,由Christopher Lozinsk带来“The J1Sc Family”。",date:"2023.12.17",url:"https://www.bilibili.com/video/BV1Jc411o7A6/"}],{Heading:AY,Paragraph:IY}=Me,{CNHead4:NY,CNTitleLarge:$Y}=AY,{CNMarkSmall:zY,CNBodySmall:HY}=IY,mc=new Map([["tech-talk",{label:"前沿科技分享",description:"探索前沿技术,拥抱创新与改变",list:FH,recommend:27}],["oss-showcase",{label:"开源产品分享",description:"软硬件融合创新实践的观察与输出",list:BH,recommend:2}],["rust-showcase",{label:"Rust语言应用及案例分享",description:"Rust编程语言的应用、实践与探索",list:aY,recommend:12}],["hardware-acceleration",{label:"硬件加速",description:"硬件加速领域的实践、经验与挑战",list:LY,recommend:21}]]),YY=f.main``,FY=f.div` max-width: 1440px; margin-inline: auto; padding: 1rem 1.76rem 1.68rem; @@ -2033,39 +2033,39 @@ Error generating stack: `+o.message+` &:last-child { padding-bottom: 0; } -`,Th=f(IY)` +`,Th=f(NY)` padding-bottom: 0.48rem; text-align: center; -`,FY=f.div` +`,VY=f.div` display: grid; grid-template-rows: repeat(2, 1fr); grid-template-columns: repeat(2, 1fr); grid-gap: 0.29rem; -`,VY=f.div` +`,WY=f.div` display: grid; grid-template-columns: repeat(3, 1fr); grid-gap: 0.43rem 0.29rem; `,eb=f.div` display: flex; flex-direction: column; -`,WY=f(eb)` +`,UY=f(eb)` display: flex; flex-direction: column; grid-area: 1 / 1 / 3 / 2; -`,UY=f.div` +`,BY=f.div` display: flex; justify-content: space-between; height: 100%; -`,BY=f.div``,sw=f.img` +`,GY=f.div``,sw=f.img` display: block; width: 100%; border-radius: 0.06rem; -`,GY=f.img` +`,XY=f.img` display: block; width: 50%; height: min-content; border-radius: 0.06rem; -`,XY=f.img` +`,KY=f.img` float: left; width: 50%; padding-right: 0.21rem; @@ -2073,9 +2073,9 @@ Error generating stack: `+o.message+` border-radius: 0.06rem; `,aw=f.div` padding-top: 0.29rem; -`,KY=f.div` +`,QY=f.div` width: 47%; -`,pc=f($Y)` +`,pc=f(zY)` padding-bottom: 0.11rem; color: ${e=>e.theme.secondary01}; `,gc=f.div` @@ -2087,27 +2087,27 @@ Error generating stack: `+o.message+` &:hover { color: #531dab; } -`,vc=f(NY)``,yc=f.img` +`,vc=f($Y)``,yc=f.img` width: 0.215rem; height: 0.215rem; -`,wc=f(zY)` +`,wc=f(HY)` color: #667085; -`,_c=()=>{var a,c,d,h;const t=ti().pathname.split("/").join(""),r=(a=mc.get(t))==null?void 0:a.label,n=(c=mc.get(t))==null?void 0:c.description,i=(d=mc.get(t))==null?void 0:d.list.reverse(),o=(h=mc.get(t))==null?void 0:h.recommend;return N.useEffect(()=>{window.scrollTo(0,0)},[]),l.jsxs(Pt.Fragment,{children:[l.jsx(yn,{cover:Zz,subTitle:n,children:r}),l.jsx(HY,{children:l.jsxs(YY,{children:[l.jsxs(Eh,{children:[l.jsx(Th,{children:"最新视频"}),l.jsx(FY,{children:i&&i.map(({key:g,image:v,date:x,title:b,text:k,url:C},E)=>E===0?l.jsxs(WY,{children:[l.jsx(sw,{src:v}),l.jsxs(aw,{children:[l.jsx(pc,{children:x}),l.jsxs(gc,{as:lc,to:C,children:[l.jsx(vc,{children:b}),l.jsx(yc,{src:hc})]}),l.jsx(wc,{children:k})]})]},g):E<3?l.jsxs(BY,{children:[l.jsx(XY,{src:v}),l.jsx(pc,{children:x}),l.jsxs(gc,{as:lc,to:C,children:[l.jsx(vc,{children:b}),l.jsx(yc,{src:hc})]}),l.jsx(wc,{children:k})]},E):null)})]}),l.jsxs(Eh,{children:[l.jsx(Th,{children:"推荐视频"}),i&&i.map(({key:g,image:v,date:x,title:b,text:k,url:C})=>{if(g===o)return l.jsxs(UY,{children:[l.jsx(GY,{src:v}),l.jsxs(KY,{children:[l.jsx(pc,{children:x}),l.jsxs(gc,{as:lc,to:C,children:[l.jsx(vc,{children:b}),l.jsx(yc,{src:hc})]}),l.jsx(wc,{children:k})]})]},g)})]}),l.jsxs(Eh,{children:[l.jsx(Th,{children:"全部视频"}),l.jsx(VY,{children:i&&i.map(({key:g,image:v,date:x,title:b,text:k,url:C})=>l.jsxs(eb,{children:[l.jsx(sw,{src:v}),l.jsxs(aw,{children:[l.jsx(pc,{children:x}),l.jsxs(gc,{as:lc,to:C,children:[l.jsx(vc,{children:b}),l.jsx(yc,{src:hc})]}),l.jsx(wc,{children:k})]})]},g))})]})]})})]})};//! moment.js +`,_c=()=>{var a,c,d,h;const t=ti().pathname.split("/").join(""),r=(a=mc.get(t))==null?void 0:a.label,n=(c=mc.get(t))==null?void 0:c.description,i=(d=mc.get(t))==null?void 0:d.list.reverse(),o=(h=mc.get(t))==null?void 0:h.recommend;return N.useEffect(()=>{window.scrollTo(0,0)},[]),l.jsxs(Pt.Fragment,{children:[l.jsx(yn,{cover:Zz,subTitle:n,children:r}),l.jsx(YY,{children:l.jsxs(FY,{children:[l.jsxs(Eh,{children:[l.jsx(Th,{children:"最新视频"}),l.jsx(VY,{children:i&&i.map(({key:g,image:v,date:x,title:b,text:k,url:C},E)=>E===0?l.jsxs(UY,{children:[l.jsx(sw,{src:v}),l.jsxs(aw,{children:[l.jsx(pc,{children:x}),l.jsxs(gc,{as:lc,to:C,children:[l.jsx(vc,{children:b}),l.jsx(yc,{src:hc})]}),l.jsx(wc,{children:k})]})]},g):E<3?l.jsxs(GY,{children:[l.jsx(KY,{src:v}),l.jsx(pc,{children:x}),l.jsxs(gc,{as:lc,to:C,children:[l.jsx(vc,{children:b}),l.jsx(yc,{src:hc})]}),l.jsx(wc,{children:k})]},E):null)})]}),l.jsxs(Eh,{children:[l.jsx(Th,{children:"推荐视频"}),i&&i.map(({key:g,image:v,date:x,title:b,text:k,url:C})=>{if(g===o)return l.jsxs(BY,{children:[l.jsx(XY,{src:v}),l.jsxs(QY,{children:[l.jsx(pc,{children:x}),l.jsxs(gc,{as:lc,to:C,children:[l.jsx(vc,{children:b}),l.jsx(yc,{src:hc})]}),l.jsx(wc,{children:k})]})]},g)})]}),l.jsxs(Eh,{children:[l.jsx(Th,{children:"全部视频"}),l.jsx(WY,{children:i&&i.map(({key:g,image:v,date:x,title:b,text:k,url:C})=>l.jsxs(eb,{children:[l.jsx(sw,{src:v}),l.jsxs(aw,{children:[l.jsx(pc,{children:x}),l.jsxs(gc,{as:lc,to:C,children:[l.jsx(vc,{children:b}),l.jsx(yc,{src:hc})]}),l.jsx(wc,{children:k})]})]},g))})]})]})})]})};//! moment.js //! version : 2.29.4 //! authors : Tim Wood, Iskren Chernev, Moment.js contributors //! license : MIT //! momentjs.com -var tb;function U(){return tb.apply(null,arguments)}function QY(e){tb=e}function Zr(e){return e instanceof Array||Object.prototype.toString.call(e)==="[object Array]"}function lo(e){return e!=null&&Object.prototype.toString.call(e)==="[object Object]"}function Oe(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function wg(e){if(Object.getOwnPropertyNames)return Object.getOwnPropertyNames(e).length===0;var t;for(t in e)if(Oe(e,t))return!1;return!0}function ar(e){return e===void 0}function qn(e){return typeof e=="number"||Object.prototype.toString.call(e)==="[object Number]"}function bl(e){return e instanceof Date||Object.prototype.toString.call(e)==="[object Date]"}function rb(e,t){var r=[],n,i=e.length;for(n=0;n>>0,n;for(n=0;n0)for(r=0;r>>0,n;for(n=0;n0)for(r=0;r=0;return(o?r?"+":"":"-")+Math.pow(10,Math.max(0,i)).toString().substr(1)+n}var bg=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,xc=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,Oh={},hs={};function se(e,t,r,n){var i=n;typeof n=="string"&&(i=function(){return this[n]()}),e&&(hs[e]=i),t&&(hs[t[0]]=function(){return mn(i.apply(this,arguments),t[1],t[2])}),r&&(hs[r]=function(){return this.localeData().ordinal(i.apply(this,arguments),e)})}function tF(e){return e.match(/\[[\s\S]/)?e.replace(/^\[|\]$/g,""):e.replace(/\\/g,"")}function rF(e){var t=e.match(bg),r,n;for(r=0,n=t.length;r=0&&xc.test(e);)e=e.replace(xc,n),xc.lastIndex=0,r-=1;return e}var nF={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 iF(e){var t=this._longDateFormat[e],r=this._longDateFormat[e.toUpperCase()];return t||!r?t:(this._longDateFormat[e]=r.match(bg).map(function(n){return n==="MMMM"||n==="MM"||n==="DD"||n==="dddd"?n.slice(1):n}).join(""),this._longDateFormat[e])}var oF="Invalid date";function sF(){return this._invalidDate}var aF="%d",lF=/\d{1,2}/;function cF(e){return this._ordinal.replace("%d",e)}var uF={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 dF(e,t,r,n){var i=this._relativeTime[r];return _n(i)?i(e,t,r,n):i.replace(/%d/i,e)}function fF(e,t){var r=this._relativeTime[e>0?"future":"past"];return _n(r)?r(t):r.replace(/%s/i,t)}var Aa={};function Bt(e,t){var r=e.toLowerCase();Aa[r]=Aa[r+"s"]=Aa[t]=e}function Ir(e){return typeof e=="string"?Aa[e]||Aa[e.toLowerCase()]:void 0}function kg(e){var t={},r,n;for(n in e)Oe(e,n)&&(r=Ir(n),r&&(t[r]=e[n]));return t}var sb={};function Gt(e,t){sb[e]=t}function hF(e){var t=[],r;for(r in e)Oe(e,r)&&t.push({unit:r,priority:sb[r]});return t.sort(function(n,i){return n.priority-i.priority}),t}function Gd(e){return e%4===0&&e%100!==0||e%400===0}function Tr(e){return e<0?Math.ceil(e)||0:Math.floor(e)}function we(e){var t=+e,r=0;return t!==0&&isFinite(t)&&(r=Tr(t)),r}function Ys(e,t){return function(r){return r!=null?(ab(this,e,r),U.updateOffset(this,t),this):Mu(this,e)}}function Mu(e,t){return e.isValid()?e._d["get"+(e._isUTC?"UTC":"")+t]():NaN}function ab(e,t,r){e.isValid()&&!isNaN(r)&&(t==="FullYear"&&Gd(e.year())&&e.month()===1&&e.date()===29?(r=we(r),e._d["set"+(e._isUTC?"UTC":"")+t](r,e.month(),Jd(r,e.month()))):e._d["set"+(e._isUTC?"UTC":"")+t](r))}function mF(e){return e=Ir(e),_n(this[e])?this[e]():this}function pF(e,t){if(typeof e=="object"){e=kg(e);var r=hF(e),n,i=r.length;for(n=0;n68?1900:2e3)};var vb=Ys("FullYear",!0);function LF(){return Gd(this.year())}function AF(e,t,r,n,i,o,a){var c;return e<100&&e>=0?(c=new Date(e+400,t,r,n,i,o,a),isFinite(c.getFullYear())&&c.setFullYear(e)):c=new Date(e,t,r,n,i,o,a),c}function al(e){var t,r;return e<100&&e>=0?(r=Array.prototype.slice.call(arguments),r[0]=e+400,t=new Date(Date.UTC.apply(null,r)),isFinite(t.getUTCFullYear())&&t.setUTCFullYear(e)):t=new Date(Date.UTC.apply(null,arguments)),t}function Au(e,t,r){var n=7+t-r,i=(7+al(e,0,n).getUTCDay()-t)%7;return-i+n-1}function yb(e,t,r,n,i){var o=(7+r-n)%7,a=Au(e,n,i),c=1+7*(t-1)+o+a,d,h;return c<=0?(d=e-1,h=Ia(d)+c):c>Ia(e)?(d=e+1,h=c-Ia(e)):(d=e,h=c),{year:d,dayOfYear:h}}function ll(e,t,r){var n=Au(e.year(),t,r),i=Math.floor((e.dayOfYear()-n-1)/7)+1,o,a;return i<1?(a=e.year()-1,o=i+Bn(a,t,r)):i>Bn(e.year(),t,r)?(o=i-Bn(e.year(),t,r),a=e.year()+1):(a=e.year(),o=i),{week:o,year:a}}function Bn(e,t,r){var n=Au(e,t,r),i=Au(e+1,t,r);return(Ia(e)-n+i)/7}se("w",["ww",2],"wo","week");se("W",["WW",2],"Wo","isoWeek");Bt("week","w");Bt("isoWeek","W");Gt("week",5);Gt("isoWeek",5);q("w",Ke);q("ww",Ke,kr);q("W",Ke);q("WW",Ke,kr);Dl(["w","ww","W","WW"],function(e,t,r,n){t[n.substr(0,1)]=we(e)});function IF(e){return ll(e,this._week.dow,this._week.doy).week}var NF={dow:0,doy:6};function $F(){return this._week.dow}function zF(){return this._week.doy}function HF(e){var t=this.localeData().week(this);return e==null?t:this.add((e-t)*7,"d")}function YF(e){var t=ll(this,1,4).week;return e==null?t:this.add((e-t)*7,"d")}se("d",0,"do","day");se("dd",0,0,function(e){return this.localeData().weekdaysMin(this,e)});se("ddd",0,0,function(e){return this.localeData().weekdaysShort(this,e)});se("dddd",0,0,function(e){return this.localeData().weekdays(this,e)});se("e",0,0,"weekday");se("E",0,0,"isoWeekday");Bt("day","d");Bt("weekday","e");Bt("isoWeekday","E");Gt("day",11);Gt("weekday",11);Gt("isoWeekday",11);q("d",Ke);q("e",Ke);q("E",Ke);q("dd",function(e,t){return t.weekdaysMinRegex(e)});q("ddd",function(e,t){return t.weekdaysShortRegex(e)});q("dddd",function(e,t){return t.weekdaysRegex(e)});Dl(["dd","ddd","dddd"],function(e,t,r,n){var i=r._locale.weekdaysParse(e,n,r._strict);i!=null?t.d=i:pe(r).invalidWeekday=e});Dl(["d","e","E"],function(e,t,r,n){t[n]=we(e)});function FF(e,t){return typeof e!="string"?e:isNaN(e)?(e=t.weekdaysParse(e),typeof e=="number"?e:null):parseInt(e,10)}function VF(e,t){return typeof e=="string"?t.weekdaysParse(e)%7||7:isNaN(e)?null:e}function Eg(e,t){return e.slice(t,7).concat(e.slice(0,t))}var WF="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),wb="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),UF="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),BF=Cl,GF=Cl,XF=Cl;function KF(e,t){var r=Zr(this._weekdays)?this._weekdays:this._weekdays[e&&e!==!0&&this._weekdays.isFormat.test(t)?"format":"standalone"];return e===!0?Eg(r,this._week.dow):e?r[e.day()]:r}function QF(e){return e===!0?Eg(this._weekdaysShort,this._week.dow):e?this._weekdaysShort[e.day()]:this._weekdaysShort}function qF(e){return e===!0?Eg(this._weekdaysMin,this._week.dow):e?this._weekdaysMin[e.day()]:this._weekdaysMin}function ZF(e,t,r){var n,i,o,a=e.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],n=0;n<7;++n)o=wn([2e3,1]).day(n),this._minWeekdaysParse[n]=this.weekdaysMin(o,"").toLocaleLowerCase(),this._shortWeekdaysParse[n]=this.weekdaysShort(o,"").toLocaleLowerCase(),this._weekdaysParse[n]=this.weekdays(o,"").toLocaleLowerCase();return r?t==="dddd"?(i=dt.call(this._weekdaysParse,a),i!==-1?i:null):t==="ddd"?(i=dt.call(this._shortWeekdaysParse,a),i!==-1?i:null):(i=dt.call(this._minWeekdaysParse,a),i!==-1?i:null):t==="dddd"?(i=dt.call(this._weekdaysParse,a),i!==-1||(i=dt.call(this._shortWeekdaysParse,a),i!==-1)?i:(i=dt.call(this._minWeekdaysParse,a),i!==-1?i:null)):t==="ddd"?(i=dt.call(this._shortWeekdaysParse,a),i!==-1||(i=dt.call(this._weekdaysParse,a),i!==-1)?i:(i=dt.call(this._minWeekdaysParse,a),i!==-1?i:null)):(i=dt.call(this._minWeekdaysParse,a),i!==-1||(i=dt.call(this._weekdaysParse,a),i!==-1)?i:(i=dt.call(this._shortWeekdaysParse,a),i!==-1?i:null))}function JF(e,t,r){var n,i,o;if(this._weekdaysParseExact)return ZF.call(this,e,t,r);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),n=0;n<7;n++){if(i=wn([2e3,1]).day(n),r&&!this._fullWeekdaysParse[n]&&(this._fullWeekdaysParse[n]=new RegExp("^"+this.weekdays(i,"").replace(".","\\.?")+"$","i"),this._shortWeekdaysParse[n]=new RegExp("^"+this.weekdaysShort(i,"").replace(".","\\.?")+"$","i"),this._minWeekdaysParse[n]=new RegExp("^"+this.weekdaysMin(i,"").replace(".","\\.?")+"$","i")),this._weekdaysParse[n]||(o="^"+this.weekdays(i,"")+"|^"+this.weekdaysShort(i,"")+"|^"+this.weekdaysMin(i,""),this._weekdaysParse[n]=new RegExp(o.replace(".",""),"i")),r&&t==="dddd"&&this._fullWeekdaysParse[n].test(e))return n;if(r&&t==="ddd"&&this._shortWeekdaysParse[n].test(e))return n;if(r&&t==="dd"&&this._minWeekdaysParse[n].test(e))return n;if(!r&&this._weekdaysParse[n].test(e))return n}}function eV(e){if(!this.isValid())return e!=null?this:NaN;var t=this._isUTC?this._d.getUTCDay():this._d.getDay();return e!=null?(e=FF(e,this.localeData()),this.add(e-t,"d")):t}function tV(e){if(!this.isValid())return e!=null?this:NaN;var t=(this.day()+7-this.localeData()._week.dow)%7;return e==null?t:this.add(e-t,"d")}function rV(e){if(!this.isValid())return e!=null?this:NaN;if(e!=null){var t=VF(e,this.localeData());return this.day(this.day()%7?t:t-7)}else return this.day()||7}function nV(e){return this._weekdaysParseExact?(Oe(this,"_weekdaysRegex")||Tg.call(this),e?this._weekdaysStrictRegex:this._weekdaysRegex):(Oe(this,"_weekdaysRegex")||(this._weekdaysRegex=BF),this._weekdaysStrictRegex&&e?this._weekdaysStrictRegex:this._weekdaysRegex)}function iV(e){return this._weekdaysParseExact?(Oe(this,"_weekdaysRegex")||Tg.call(this),e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(Oe(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=GF),this._weekdaysShortStrictRegex&&e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)}function oV(e){return this._weekdaysParseExact?(Oe(this,"_weekdaysRegex")||Tg.call(this),e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(Oe(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=XF),this._weekdaysMinStrictRegex&&e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)}function Tg(){function e(g,v){return v.length-g.length}var t=[],r=[],n=[],i=[],o,a,c,d,h;for(o=0;o<7;o++)a=wn([2e3,1]).day(o),c=gr(this.weekdaysMin(a,"")),d=gr(this.weekdaysShort(a,"")),h=gr(this.weekdays(a,"")),t.push(c),r.push(d),n.push(h),i.push(c),i.push(d),i.push(h);t.sort(e),r.sort(e),n.sort(e),i.sort(e),this._weekdaysRegex=new RegExp("^("+i.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+n.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+r.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+t.join("|")+")","i")}function jg(){return this.hours()%12||12}function sV(){return this.hours()||24}se("H",["HH",2],0,"hour");se("h",["hh",2],0,jg);se("k",["kk",2],0,sV);se("hmm",0,0,function(){return""+jg.apply(this)+mn(this.minutes(),2)});se("hmmss",0,0,function(){return""+jg.apply(this)+mn(this.minutes(),2)+mn(this.seconds(),2)});se("Hmm",0,0,function(){return""+this.hours()+mn(this.minutes(),2)});se("Hmmss",0,0,function(){return""+this.hours()+mn(this.minutes(),2)+mn(this.seconds(),2)});function _b(e,t){se(e,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),t)})}_b("a",!0);_b("A",!1);Bt("hour","h");Gt("hour",13);function xb(e,t){return t._meridiemParse}q("a",xb);q("A",xb);q("H",Ke);q("h",Ke);q("k",Ke);q("HH",Ke,kr);q("hh",Ke,kr);q("kk",Ke,kr);q("hmm",ub);q("hmmss",db);q("Hmm",ub);q("Hmmss",db);He(["H","HH"],Ct);He(["k","kk"],function(e,t,r){var n=we(e);t[Ct]=n===24?0:n});He(["a","A"],function(e,t,r){r._isPm=r._locale.isPM(e),r._meridiem=e});He(["h","hh"],function(e,t,r){t[Ct]=we(e),pe(r).bigHour=!0});He("hmm",function(e,t,r){var n=e.length-2;t[Ct]=we(e.substr(0,n)),t[Gr]=we(e.substr(n)),pe(r).bigHour=!0});He("hmmss",function(e,t,r){var n=e.length-4,i=e.length-2;t[Ct]=we(e.substr(0,n)),t[Gr]=we(e.substr(n,2)),t[Vn]=we(e.substr(i)),pe(r).bigHour=!0});He("Hmm",function(e,t,r){var n=e.length-2;t[Ct]=we(e.substr(0,n)),t[Gr]=we(e.substr(n))});He("Hmmss",function(e,t,r){var n=e.length-4,i=e.length-2;t[Ct]=we(e.substr(0,n)),t[Gr]=we(e.substr(n,2)),t[Vn]=we(e.substr(i))});function aV(e){return(e+"").toLowerCase().charAt(0)==="p"}var lV=/[ap]\.?m?\.?/i,cV=Ys("Hours",!0);function uV(e,t,r){return e>11?r?"pm":"PM":r?"am":"AM"}var Sb={calendar:JY,longDateFormat:nF,invalidDate:oF,ordinal:aF,dayOfMonthOrdinalParse:lF,relativeTime:uF,months:kF,monthsShort:fb,week:NF,weekdays:WF,weekdaysMin:UF,weekdaysShort:wb,meridiemParse:lV},qe={},ma={},cl;function dV(e,t){var r,n=Math.min(e.length,t.length);for(r=0;r0;){if(i=ef(o.slice(0,r).join("-")),i)return i;if(n&&n.length>=r&&dV(o,n)>=r-1)break;r--}t++}return cl}function hV(e){return e.match("^[^/\\\\]*$")!=null}function ef(e){var t=null,r;if(qe[e]===void 0&&typeof Gc<"u"&&Gc&&Gc.exports&&hV(e))try{t=cl._abbr,r=require,r("./locale/"+e),Li(t)}catch{qe[e]=null}return qe[e]}function Li(e,t){var r;return e&&(ar(t)?r=ri(e):r=Og(e,t),r?cl=r:typeof console<"u"&&console.warn&&console.warn("Locale "+e+" not found. Did you forget to load it?")),cl._abbr}function Og(e,t){if(t!==null){var r,n=Sb;if(t.abbr=e,qe[e]!=null)ib("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),n=qe[e]._config;else if(t.parentLocale!=null)if(qe[t.parentLocale]!=null)n=qe[t.parentLocale]._config;else if(r=ef(t.parentLocale),r!=null)n=r._config;else return ma[t.parentLocale]||(ma[t.parentLocale]=[]),ma[t.parentLocale].push({name:e,config:t}),null;return qe[e]=new Sg(Mp(n,t)),ma[e]&&ma[e].forEach(function(i){Og(i.name,i.config)}),Li(e),qe[e]}else return delete qe[e],null}function mV(e,t){if(t!=null){var r,n,i=Sb;qe[e]!=null&&qe[e].parentLocale!=null?qe[e].set(Mp(qe[e]._config,t)):(n=ef(e),n!=null&&(i=n._config),t=Mp(i,t),n==null&&(t.abbr=e),r=new Sg(t),r.parentLocale=qe[e],qe[e]=r),Li(e)}else qe[e]!=null&&(qe[e].parentLocale!=null?(qe[e]=qe[e].parentLocale,e===Li()&&Li(e)):qe[e]!=null&&delete qe[e]);return qe[e]}function ri(e){var t;if(e&&e._locale&&e._locale._abbr&&(e=e._locale._abbr),!e)return cl;if(!Zr(e)){if(t=ef(e),t)return t;e=[e]}return fV(e)}function pV(){return Lp(qe)}function Pg(e){var t,r=e._a;return r&&pe(e).overflow===-2&&(t=r[Fn]<0||r[Fn]>11?Fn:r[cn]<1||r[cn]>Jd(r[Wt],r[Fn])?cn:r[Ct]<0||r[Ct]>24||r[Ct]===24&&(r[Gr]!==0||r[Vn]!==0||r[no]!==0)?Ct:r[Gr]<0||r[Gr]>59?Gr:r[Vn]<0||r[Vn]>59?Vn:r[no]<0||r[no]>999?no:-1,pe(e)._overflowDayOfYear&&(tcn)&&(t=cn),pe(e)._overflowWeeks&&t===-1&&(t=xF),pe(e)._overflowWeekday&&t===-1&&(t=SF),pe(e).overflow=t),e}var gV=/^\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)?)?$/,vV=/^\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)?)?$/,yV=/Z|[+-]\d\d(?::?\d\d)?/,Sc=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/],["YYYYMM",/\d{6}/,!1],["YYYY",/\d{4}/,!1]],Ph=[["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/]],wV=/^\/?Date\((-?\d+)/i,_V=/^(?:(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}))$/,xV={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 bb(e){var t,r,n=e._i,i=gV.exec(n)||vV.exec(n),o,a,c,d,h=Sc.length,g=Ph.length;if(i){for(pe(e).iso=!0,t=0,r=h;tIa(a)||e._dayOfYear===0)&&(pe(e)._overflowDayOfYear=!0),r=al(a,0,e._dayOfYear),e._a[Fn]=r.getUTCMonth(),e._a[cn]=r.getUTCDate()),t=0;t<3&&e._a[t]==null;++t)e._a[t]=n[t]=i[t];for(;t<7;t++)e._a[t]=n[t]=e._a[t]==null?t===2?1:0:e._a[t];e._a[Ct]===24&&e._a[Gr]===0&&e._a[Vn]===0&&e._a[no]===0&&(e._nextDay=!0,e._a[Ct]=0),e._d=(e._useUTC?al:AF).apply(null,n),o=e._useUTC?e._d.getUTCDay():e._d.getDay(),e._tzm!=null&&e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),e._nextDay&&(e._a[Ct]=24),e._w&&typeof e._w.d<"u"&&e._w.d!==o&&(pe(e).weekdayMismatch=!0)}}function jV(e){var t,r,n,i,o,a,c,d,h;t=e._w,t.GG!=null||t.W!=null||t.E!=null?(o=1,a=4,r=Yo(t.GG,e._a[Wt],ll(Xe(),1,4).year),n=Yo(t.W,1),i=Yo(t.E,1),(i<1||i>7)&&(d=!0)):(o=e._locale._week.dow,a=e._locale._week.doy,h=ll(Xe(),o,a),r=Yo(t.gg,e._a[Wt],h.year),n=Yo(t.w,h.week),t.d!=null?(i=t.d,(i<0||i>6)&&(d=!0)):t.e!=null?(i=t.e+o,(t.e<0||t.e>6)&&(d=!0)):i=o),n<1||n>Bn(r,o,a)?pe(e)._overflowWeeks=!0:d!=null?pe(e)._overflowWeekday=!0:(c=yb(r,n,i,o,a),e._a[Wt]=c.year,e._dayOfYear=c.dayOfYear)}U.ISO_8601=function(){};U.RFC_2822=function(){};function Mg(e){if(e._f===U.ISO_8601){bb(e);return}if(e._f===U.RFC_2822){kb(e);return}e._a=[],pe(e).empty=!0;var t=""+e._i,r,n,i,o,a,c=t.length,d=0,h,g;for(i=ob(e._f,e._locale).match(bg)||[],g=i.length,r=0;r0&&pe(e).unusedInput.push(a),t=t.slice(t.indexOf(n)+n.length),d+=n.length),hs[o]?(n?pe(e).empty=!1:pe(e).unusedTokens.push(o),_F(o,n,e)):e._strict&&!n&&pe(e).unusedTokens.push(o);pe(e).charsLeftOver=c-d,t.length>0&&pe(e).unusedInput.push(t),e._a[Ct]<=12&&pe(e).bigHour===!0&&e._a[Ct]>0&&(pe(e).bigHour=void 0),pe(e).parsedDateParts=e._a.slice(0),pe(e).meridiem=e._meridiem,e._a[Ct]=OV(e._locale,e._a[Ct],e._meridiem),h=pe(e).era,h!==null&&(e._a[Wt]=e._locale.erasConvertYear(h,e._a[Wt])),Rg(e),Pg(e)}function OV(e,t,r){var n;return r==null?t:e.meridiemHour!=null?e.meridiemHour(t,r):(e.isPM!=null&&(n=e.isPM(r),n&&t<12&&(t+=12),!n&&t===12&&(t=0)),t)}function PV(e){var t,r,n,i,o,a,c=!1,d=e._f.length;if(d===0){pe(e).invalidFormat=!0,e._d=new Date(NaN);return}for(i=0;ithis?this:e:Bd()});function Eb(e,t){var r,n;if(t.length===1&&Zr(t[0])&&(t=t[0]),!t.length)return Xe();for(r=t[0],n=1;nthis.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function ZV(){if(!ar(this._isDSTShifted))return this._isDSTShifted;var e={},t;return xg(e,this),e=Cb(e),e._a?(t=e._isUTC?wn(e._a):Xe(e._a),this._isDSTShifted=this.isValid()&&VV(e._a,t.toArray())>0):this._isDSTShifted=!1,this._isDSTShifted}function JV(){return this.isValid()?!this._isUTC:!1}function e9(){return this.isValid()?this._isUTC:!1}function jb(){return this.isValid()?this._isUTC&&this._offset===0:!1}var t9=/^(-|\+)?(?:(\d*)[. ])?(\d+):(\d+)(?::(\d+)(\.\d*)?)?$/,r9=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;function en(e,t){var r=e,n=null,i,o,a;return Uc(e)?r={ms:e._milliseconds,d:e._days,M:e._months}:qn(e)||!isNaN(+e)?(r={},t?r[t]=+e:r.milliseconds=+e):(n=t9.exec(e))?(i=n[1]==="-"?-1:1,r={y:0,d:we(n[cn])*i,h:we(n[Ct])*i,m:we(n[Gr])*i,s:we(n[Vn])*i,ms:we(Ip(n[no]*1e3))*i}):(n=r9.exec(e))?(i=n[1]==="-"?-1:1,r={y:Xi(n[2],i),M:Xi(n[3],i),w:Xi(n[4],i),d:Xi(n[5],i),h:Xi(n[6],i),m:Xi(n[7],i),s:Xi(n[8],i)}):r==null?r={}:typeof r=="object"&&("from"in r||"to"in r)&&(a=n9(Xe(r.from),Xe(r.to)),r={},r.ms=a.milliseconds,r.M=a.months),o=new tf(r),Uc(e)&&Oe(e,"_locale")&&(o._locale=e._locale),Uc(e)&&Oe(e,"_isValid")&&(o._isValid=e._isValid),o}en.fn=tf.prototype;en.invalid=FV;function Xi(e,t){var r=e&&parseFloat(e.replace(",","."));return(isNaN(r)?0:r)*t}function dw(e,t){var r={};return r.months=t.month()-e.month()+(t.year()-e.year())*12,e.clone().add(r.months,"M").isAfter(t)&&--r.months,r.milliseconds=+t-+e.clone().add(r.months,"M"),r}function n9(e,t){var r;return e.isValid()&&t.isValid()?(t=Ag(t,e),e.isBefore(t)?r=dw(e,t):(r=dw(t,e),r.milliseconds=-r.milliseconds,r.months=-r.months),r):{milliseconds:0,months:0}}function Ob(e,t){return function(r,n){var i,o;return n!==null&&!isNaN(+n)&&(ib(t,"moment()."+t+"(period, number) is deprecated. Please use moment()."+t+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),o=r,r=n,n=o),i=en(r,n),Pb(this,i,e),this}}function Pb(e,t,r,n){var i=t._milliseconds,o=Ip(t._days),a=Ip(t._months);e.isValid()&&(n=n??!0,a&&mb(e,Mu(e,"Month")+a*r),o&&ab(e,"Date",Mu(e,"Date")+o*r),i&&e._d.setTime(e._d.valueOf()+i*r),n&&U.updateOffset(e,o||a))}var i9=Ob(1,"add"),o9=Ob(-1,"subtract");function Rb(e){return typeof e=="string"||e instanceof String}function s9(e){return Jr(e)||bl(e)||Rb(e)||qn(e)||l9(e)||a9(e)||e===null||e===void 0}function a9(e){var t=lo(e)&&!wg(e),r=!1,n=["years","year","y","months","month","M","days","day","d","dates","date","D","hours","hour","h","minutes","minute","m","seconds","second","s","milliseconds","millisecond","ms"],i,o,a=n.length;for(i=0;ir.valueOf():r.valueOf()9999?Wc(r,t?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):_n(Date.prototype.toISOString)?t?this.toDate().toISOString():new Date(this.valueOf()+this.utcOffset()*60*1e3).toISOString().replace("Z",Wc(r,"Z")):Wc(r,t?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")}function S9(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var e="moment",t="",r,n,i,o;return this.isLocal()||(e=this.utcOffset()===0?"moment.utc":"moment.parseZone",t="Z"),r="["+e+'("]',n=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",i="-MM-DD[T]HH:mm:ss.SSS",o=t+'[")]',this.format(r+n+i+o)}function b9(e){e||(e=this.isUtc()?U.defaultFormatUtc:U.defaultFormat);var t=Wc(this,e);return this.localeData().postformat(t)}function k9(e,t){return this.isValid()&&(Jr(e)&&e.isValid()||Xe(e).isValid())?en({to:this,from:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()}function C9(e){return this.from(Xe(),e)}function D9(e,t){return this.isValid()&&(Jr(e)&&e.isValid()||Xe(e).isValid())?en({from:this,to:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()}function E9(e){return this.to(Xe(),e)}function Mb(e){var t;return e===void 0?this._locale._abbr:(t=ri(e),t!=null&&(this._locale=t),this)}var Lb=Ar("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(e){return e===void 0?this.localeData():this.locale(e)});function Ab(){return this._locale}var Iu=1e3,ms=60*Iu,Nu=60*ms,Ib=(365*400+97)*24*Nu;function ps(e,t){return(e%t+t)%t}function Nb(e,t,r){return e<100&&e>=0?new Date(e+400,t,r)-Ib:new Date(e,t,r).valueOf()}function $b(e,t,r){return e<100&&e>=0?Date.UTC(e+400,t,r)-Ib:Date.UTC(e,t,r)}function T9(e){var t,r;if(e=Ir(e),e===void 0||e==="millisecond"||!this.isValid())return this;switch(r=this._isUTC?$b:Nb,e){case"year":t=r(this.year(),0,1);break;case"quarter":t=r(this.year(),this.month()-this.month()%3,1);break;case"month":t=r(this.year(),this.month(),1);break;case"week":t=r(this.year(),this.month(),this.date()-this.weekday());break;case"isoWeek":t=r(this.year(),this.month(),this.date()-(this.isoWeekday()-1));break;case"day":case"date":t=r(this.year(),this.month(),this.date());break;case"hour":t=this._d.valueOf(),t-=ps(t+(this._isUTC?0:this.utcOffset()*ms),Nu);break;case"minute":t=this._d.valueOf(),t-=ps(t,ms);break;case"second":t=this._d.valueOf(),t-=ps(t,Iu);break}return this._d.setTime(t),U.updateOffset(this,!0),this}function j9(e){var t,r;if(e=Ir(e),e===void 0||e==="millisecond"||!this.isValid())return this;switch(r=this._isUTC?$b:Nb,e){case"year":t=r(this.year()+1,0,1)-1;break;case"quarter":t=r(this.year(),this.month()-this.month()%3+3,1)-1;break;case"month":t=r(this.year(),this.month()+1,1)-1;break;case"week":t=r(this.year(),this.month(),this.date()-this.weekday()+7)-1;break;case"isoWeek":t=r(this.year(),this.month(),this.date()-(this.isoWeekday()-1)+7)-1;break;case"day":case"date":t=r(this.year(),this.month(),this.date()+1)-1;break;case"hour":t=this._d.valueOf(),t+=Nu-ps(t+(this._isUTC?0:this.utcOffset()*ms),Nu)-1;break;case"minute":t=this._d.valueOf(),t+=ms-ps(t,ms)-1;break;case"second":t=this._d.valueOf(),t+=Iu-ps(t,Iu)-1;break}return this._d.setTime(t),U.updateOffset(this,!0),this}function O9(){return this._d.valueOf()-(this._offset||0)*6e4}function P9(){return Math.floor(this.valueOf()/1e3)}function R9(){return new Date(this.valueOf())}function M9(){var e=this;return[e.year(),e.month(),e.date(),e.hour(),e.minute(),e.second(),e.millisecond()]}function L9(){var e=this;return{years:e.year(),months:e.month(),date:e.date(),hours:e.hours(),minutes:e.minutes(),seconds:e.seconds(),milliseconds:e.milliseconds()}}function A9(){return this.isValid()?this.toISOString():null}function I9(){return _g(this)}function N9(){return bi({},pe(this))}function $9(){return pe(this).overflow}function z9(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}}se("N",0,0,"eraAbbr");se("NN",0,0,"eraAbbr");se("NNN",0,0,"eraAbbr");se("NNNN",0,0,"eraName");se("NNNNN",0,0,"eraNarrow");se("y",["y",1],"yo","eraYear");se("y",["yy",2],0,"eraYear");se("y",["yyy",3],0,"eraYear");se("y",["yyyy",4],0,"eraYear");q("N",Ig);q("NN",Ig);q("NNN",Ig);q("NNNN",Q9);q("NNNNN",q9);He(["N","NN","NNN","NNNN","NNNNN"],function(e,t,r,n){var i=r._locale.erasParse(e,n,r._strict);i?pe(r).era=i:pe(r).invalidEra=e});q("y",Fs);q("yy",Fs);q("yyy",Fs);q("yyyy",Fs);q("yo",Z9);He(["y","yy","yyy","yyyy"],Wt);He(["yo"],function(e,t,r,n){var i;r._locale._eraYearOrdinalRegex&&(i=e.match(r._locale._eraYearOrdinalRegex)),r._locale.eraYearOrdinalParse?t[Wt]=r._locale.eraYearOrdinalParse(e,i):t[Wt]=parseInt(e,10)});function H9(e,t){var r,n,i,o=this._eras||ri("en")._eras;for(r=0,n=o.length;r=0)return o[n]}function F9(e,t){var r=e.since<=e.until?1:-1;return t===void 0?U(e.since).year():U(e.since).year()+(t-e.offset)*r}function V9(){var e,t,r,n=this.localeData().eras();for(e=0,t=n.length;eo&&(t=o),oW.call(this,e,t,r,n,i))}function oW(e,t,r,n,i){var o=yb(e,t,r,n,i),a=al(o.year,0,o.dayOfYear);return this.year(a.getUTCFullYear()),this.month(a.getUTCMonth()),this.date(a.getUTCDate()),this}se("Q",0,"Qo","quarter");Bt("quarter","Q");Gt("quarter",7);q("Q",lb);He("Q",function(e,t){t[Fn]=(we(e)-1)*3});function sW(e){return e==null?Math.ceil((this.month()+1)/3):this.month((e-1)*3+this.month()%3)}se("D",["DD",2],"Do","date");Bt("date","D");Gt("date",9);q("D",Ke);q("DD",Ke,kr);q("Do",function(e,t){return e?t._dayOfMonthOrdinalParse||t._ordinalParse:t._dayOfMonthOrdinalParseLenient});He(["D","DD"],cn);He("Do",function(e,t){t[cn]=we(e.match(Ke)[0])});var Hb=Ys("Date",!0);se("DDD",["DDDD",3],"DDDo","dayOfYear");Bt("dayOfYear","DDD");Gt("dayOfYear",4);q("DDD",Kd);q("DDDD",cb);He(["DDD","DDDD"],function(e,t,r){r._dayOfYear=we(e)});function aW(e){var t=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return e==null?t:this.add(e-t,"d")}se("m",["mm",2],0,"minute");Bt("minute","m");Gt("minute",14);q("m",Ke);q("mm",Ke,kr);He(["m","mm"],Gr);var lW=Ys("Minutes",!1);se("s",["ss",2],0,"second");Bt("second","s");Gt("second",15);q("s",Ke);q("ss",Ke,kr);He(["s","ss"],Vn);var cW=Ys("Seconds",!1);se("S",0,0,function(){return~~(this.millisecond()/100)});se(0,["SS",2],0,function(){return~~(this.millisecond()/10)});se(0,["SSS",3],0,"millisecond");se(0,["SSSS",4],0,function(){return this.millisecond()*10});se(0,["SSSSS",5],0,function(){return this.millisecond()*100});se(0,["SSSSSS",6],0,function(){return this.millisecond()*1e3});se(0,["SSSSSSS",7],0,function(){return this.millisecond()*1e4});se(0,["SSSSSSSS",8],0,function(){return this.millisecond()*1e5});se(0,["SSSSSSSSS",9],0,function(){return this.millisecond()*1e6});Bt("millisecond","ms");Gt("millisecond",16);q("S",Kd,lb);q("SS",Kd,kr);q("SSS",Kd,cb);var ki,Yb;for(ki="SSSS";ki.length<=9;ki+="S")q(ki,Fs);function uW(e,t){t[no]=we(("0."+e)*1e3)}for(ki="S";ki.length<=9;ki+="S")He(ki,uW);Yb=Ys("Milliseconds",!1);se("z",0,0,"zoneAbbr");se("zz",0,0,"zoneName");function dW(){return this._isUTC?"UTC":""}function fW(){return this._isUTC?"Coordinated Universal Time":""}var V=kl.prototype;V.add=i9;V.calendar=d9;V.clone=f9;V.diff=w9;V.endOf=j9;V.format=b9;V.from=k9;V.fromNow=C9;V.to=D9;V.toNow=E9;V.get=mF;V.invalidAt=$9;V.isAfter=h9;V.isBefore=m9;V.isBetween=p9;V.isSame=g9;V.isSameOrAfter=v9;V.isSameOrBefore=y9;V.isValid=I9;V.lang=Lb;V.locale=Mb;V.localeData=Ab;V.max=IV;V.min=AV;V.parsingFlags=N9;V.set=pF;V.startOf=T9;V.subtract=o9;V.toArray=M9;V.toObject=L9;V.toDate=R9;V.toISOString=x9;V.inspect=S9;typeof Symbol<"u"&&Symbol.for!=null&&(V[Symbol.for("nodejs.util.inspect.custom")]=function(){return"Moment<"+this.format()+">"});V.toJSON=A9;V.toString=_9;V.unix=P9;V.valueOf=O9;V.creationData=z9;V.eraName=V9;V.eraNarrow=W9;V.eraAbbr=U9;V.eraYear=B9;V.year=vb;V.isLeapYear=LF;V.weekYear=J9;V.isoWeekYear=eW;V.quarter=V.quarters=sW;V.month=pb;V.daysInMonth=PF;V.week=V.weeks=HF;V.isoWeek=V.isoWeeks=YF;V.weeksInYear=nW;V.weeksInWeekYear=iW;V.isoWeeksInYear=tW;V.isoWeeksInISOWeekYear=rW;V.date=Hb;V.day=V.days=eV;V.weekday=tV;V.isoWeekday=rV;V.dayOfYear=aW;V.hour=V.hours=cV;V.minute=V.minutes=lW;V.second=V.seconds=cW;V.millisecond=V.milliseconds=Yb;V.utcOffset=UV;V.utc=GV;V.local=XV;V.parseZone=KV;V.hasAlignedHourOffset=QV;V.isDST=qV;V.isLocal=JV;V.isUtcOffset=e9;V.isUtc=jb;V.isUTC=jb;V.zoneAbbr=dW;V.zoneName=fW;V.dates=Ar("dates accessor is deprecated. Use date instead.",Hb);V.months=Ar("months accessor is deprecated. Use month instead",pb);V.years=Ar("years accessor is deprecated. Use year instead",vb);V.zone=Ar("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",BV);V.isDSTShifted=Ar("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",ZV);function hW(e){return Xe(e*1e3)}function mW(){return Xe.apply(null,arguments).parseZone()}function Fb(e){return e}var Pe=Sg.prototype;Pe.calendar=eF;Pe.longDateFormat=iF;Pe.invalidDate=sF;Pe.ordinal=cF;Pe.preparse=Fb;Pe.postformat=Fb;Pe.relativeTime=dF;Pe.pastFuture=fF;Pe.set=ZY;Pe.eras=H9;Pe.erasParse=Y9;Pe.erasConvertYear=F9;Pe.erasAbbrRegex=X9;Pe.erasNameRegex=G9;Pe.erasNarrowRegex=K9;Pe.months=EF;Pe.monthsShort=TF;Pe.monthsParse=OF;Pe.monthsRegex=MF;Pe.monthsShortRegex=RF;Pe.week=IF;Pe.firstDayOfYear=zF;Pe.firstDayOfWeek=$F;Pe.weekdays=KF;Pe.weekdaysMin=qF;Pe.weekdaysShort=QF;Pe.weekdaysParse=JF;Pe.weekdaysRegex=nV;Pe.weekdaysShortRegex=iV;Pe.weekdaysMinRegex=oV;Pe.isPM=aV;Pe.meridiem=uV;function $u(e,t,r,n){var i=ri(),o=wn().set(n,t);return i[r](o,e)}function Vb(e,t,r){if(qn(e)&&(t=e,e=void 0),e=e||"",t!=null)return $u(e,t,r,"month");var n,i=[];for(n=0;n<12;n++)i[n]=$u(e,n,r,"month");return i}function $g(e,t,r,n){typeof e=="boolean"?(qn(t)&&(r=t,t=void 0),t=t||""):(t=e,r=t,e=!1,qn(t)&&(r=t,t=void 0),t=t||"");var i=ri(),o=e?i._week.dow:0,a,c=[];if(r!=null)return $u(t,(r+o)%7,n,"day");for(a=0;a<7;a++)c[a]=$u(t,(a+o)%7,n,"day");return c}function pW(e,t){return Vb(e,t,"months")}function gW(e,t){return Vb(e,t,"monthsShort")}function vW(e,t,r){return $g(e,t,r,"weekdays")}function yW(e,t,r){return $g(e,t,r,"weekdaysShort")}function wW(e,t,r){return $g(e,t,r,"weekdaysMin")}Li("en",{eras:[{since:"0001-01-01",until:1/0,offset:1,name:"Anno Domini",narrow:"AD",abbr:"AD"},{since:"0000-12-31",until:-1/0,offset:1,name:"Before Christ",narrow:"BC",abbr:"BC"}],dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(e){var t=e%10,r=we(e%100/10)===1?"th":t===1?"st":t===2?"nd":t===3?"rd":"th";return e+r}});U.lang=Ar("moment.lang is deprecated. Use moment.locale instead.",Li);U.langData=Ar("moment.langData is deprecated. Use moment.localeData instead.",ri);var Mn=Math.abs;function _W(){var e=this._data;return this._milliseconds=Mn(this._milliseconds),this._days=Mn(this._days),this._months=Mn(this._months),e.milliseconds=Mn(e.milliseconds),e.seconds=Mn(e.seconds),e.minutes=Mn(e.minutes),e.hours=Mn(e.hours),e.months=Mn(e.months),e.years=Mn(e.years),this}function Wb(e,t,r,n){var i=en(t,r);return e._milliseconds+=n*i._milliseconds,e._days+=n*i._days,e._months+=n*i._months,e._bubble()}function xW(e,t){return Wb(this,e,t,1)}function SW(e,t){return Wb(this,e,t,-1)}function fw(e){return e<0?Math.floor(e):Math.ceil(e)}function bW(){var e=this._milliseconds,t=this._days,r=this._months,n=this._data,i,o,a,c,d;return e>=0&&t>=0&&r>=0||e<=0&&t<=0&&r<=0||(e+=fw($p(r)+t)*864e5,t=0,r=0),n.milliseconds=e%1e3,i=Tr(e/1e3),n.seconds=i%60,o=Tr(i/60),n.minutes=o%60,a=Tr(o/60),n.hours=a%24,t+=Tr(a/24),d=Tr(Ub(t)),r+=d,t-=fw($p(d)),c=Tr(r/12),r%=12,n.days=t,n.months=r,n.years=c,this}function Ub(e){return e*4800/146097}function $p(e){return e*146097/4800}function kW(e){if(!this.isValid())return NaN;var t,r,n=this._milliseconds;if(e=Ir(e),e==="month"||e==="quarter"||e==="year")switch(t=this._days+n/864e5,r=this._months+Ub(t),e){case"month":return r;case"quarter":return r/3;case"year":return r/12}else switch(t=this._days+Math.round($p(this._months)),e){case"week":return t/7+n/6048e5;case"day":return t+n/864e5;case"hour":return t*24+n/36e5;case"minute":return t*1440+n/6e4;case"second":return t*86400+n/1e3;case"millisecond":return Math.floor(t*864e5)+n;default:throw new Error("Unknown unit "+e)}}function CW(){return this.isValid()?this._milliseconds+this._days*864e5+this._months%12*2592e6+we(this._months/12)*31536e6:NaN}function ni(e){return function(){return this.as(e)}}var DW=ni("ms"),EW=ni("s"),TW=ni("m"),jW=ni("h"),OW=ni("d"),PW=ni("w"),RW=ni("M"),MW=ni("Q"),LW=ni("y");function AW(){return en(this)}function IW(e){return e=Ir(e),this.isValid()?this[e+"s"]():NaN}function bo(e){return function(){return this.isValid()?this._data[e]:NaN}}var NW=bo("milliseconds"),$W=bo("seconds"),zW=bo("minutes"),HW=bo("hours"),YW=bo("days"),FW=bo("months"),VW=bo("years");function WW(){return Tr(this.days()/7)}var Nn=Math.round,is={ss:44,s:45,m:45,h:22,d:26,w:null,M:11};function UW(e,t,r,n,i){return i.relativeTime(t||1,!!r,e,n)}function BW(e,t,r,n){var i=en(e).abs(),o=Nn(i.as("s")),a=Nn(i.as("m")),c=Nn(i.as("h")),d=Nn(i.as("d")),h=Nn(i.as("M")),g=Nn(i.as("w")),v=Nn(i.as("y")),x=o<=r.ss&&["s",o]||o0,x[4]=n,UW.apply(null,x)}function GW(e){return e===void 0?Nn:typeof e=="function"?(Nn=e,!0):!1}function XW(e,t){return is[e]===void 0?!1:t===void 0?is[e]:(is[e]=t,e==="s"&&(is.ss=t-1),!0)}function KW(e,t){if(!this.isValid())return this.localeData().invalidDate();var r=!1,n=is,i,o;return typeof e=="object"&&(t=e,e=!1),typeof e=="boolean"&&(r=e),typeof t=="object"&&(n=Object.assign({},is,t),t.s!=null&&t.ss==null&&(n.ss=t.s-1)),i=this.localeData(),o=BW(this,!r,n,i),r&&(o=i.pastFuture(+this,o)),i.postformat(o)}var Rh=Math.abs;function Mo(e){return(e>0)-(e<0)||+e}function nf(){if(!this.isValid())return this.localeData().invalidDate();var e=Rh(this._milliseconds)/1e3,t=Rh(this._days),r=Rh(this._months),n,i,o,a,c=this.asSeconds(),d,h,g,v;return c?(n=Tr(e/60),i=Tr(n/60),e%=60,n%=60,o=Tr(r/12),r%=12,a=e?e.toFixed(3).replace(/\.?0+$/,""):"",d=c<0?"-":"",h=Mo(this._months)!==Mo(c)?"-":"",g=Mo(this._days)!==Mo(c)?"-":"",v=Mo(this._milliseconds)!==Mo(c)?"-":"",d+"P"+(o?h+o+"Y":"")+(r?h+r+"M":"")+(t?g+t+"D":"")+(i||n||e?"T":"")+(i?v+i+"H":"")+(n?v+n+"M":"")+(e?v+a+"S":"")):"P0D"}var De=tf.prototype;De.isValid=YV;De.abs=_W;De.add=xW;De.subtract=SW;De.as=kW;De.asMilliseconds=DW;De.asSeconds=EW;De.asMinutes=TW;De.asHours=jW;De.asDays=OW;De.asWeeks=PW;De.asMonths=RW;De.asQuarters=MW;De.asYears=LW;De.valueOf=CW;De._bubble=bW;De.clone=AW;De.get=IW;De.milliseconds=NW;De.seconds=$W;De.minutes=zW;De.hours=HW;De.days=YW;De.weeks=WW;De.months=FW;De.years=VW;De.humanize=KW;De.toISOString=nf;De.toString=nf;De.toJSON=nf;De.locale=Mb;De.localeData=Ab;De.toIsoString=Ar("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",nf);De.lang=Lb;se("X",0,0,"unix");se("x",0,0,"valueOf");q("x",qd);q("X",vF);He("X",function(e,t,r){r._d=new Date(parseFloat(e)*1e3)});He("x",function(e,t,r){r._d=new Date(we(e))});//! moment.js -U.version="2.29.4";QY(Xe);U.fn=V;U.min=NV;U.max=$V;U.now=zV;U.utc=wn;U.unix=hW;U.months=pW;U.isDate=bl;U.locale=Li;U.invalid=Bd;U.duration=en;U.isMoment=Jr;U.weekdays=vW;U.parseZone=mW;U.localeData=ri;U.isDuration=Uc;U.monthsShort=gW;U.weekdaysMin=wW;U.defineLocale=Og;U.updateLocale=mV;U.locales=pV;U.weekdaysShort=yW;U.normalizeUnits=Ir;U.relativeTimeRounding=GW;U.relativeTimeThreshold=XW;U.calendarFormat=u9;U.prototype=V;U.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"GGGG-[W]WW",MONTH:"YYYY-MM"};const QW="/zh-cn/assets/blog-cover-95d8a382.png",qW=new Map([["blogs","技术博客"],["events","活动预告"],["highlights","精彩回顾"],["news-honor-dynamic","新闻 / 荣誉"]]),ZW=f.main` +`+new Error().stack),r=!1}return t.apply(this,arguments)},t)}var cw={};function ib(e,t){U.deprecationHandler!=null&&U.deprecationHandler(e,t),cw[e]||(nb(t),cw[e]=!0)}U.suppressDeprecationWarnings=!1;U.deprecationHandler=null;function _n(e){return typeof Function<"u"&&e instanceof Function||Object.prototype.toString.call(e)==="[object Function]"}function JY(e){var t,r;for(r in e)Oe(e,r)&&(t=e[r],_n(t)?this[r]=t:this["_"+r]=t);this._config=e,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+"|"+/\d{1,2}/.source)}function Mp(e,t){var r=bi({},e),n;for(n in t)Oe(t,n)&&(lo(e[n])&&lo(t[n])?(r[n]={},bi(r[n],e[n]),bi(r[n],t[n])):t[n]!=null?r[n]=t[n]:delete r[n]);for(n in e)Oe(e,n)&&!Oe(t,n)&&lo(e[n])&&(r[n]=bi({},r[n]));return r}function Sg(e){e!=null&&this.set(e)}var Lp;Object.keys?Lp=Object.keys:Lp=function(e){var t,r=[];for(t in e)Oe(e,t)&&r.push(t);return r};var eF={sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"};function tF(e,t,r){var n=this._calendar[e]||this._calendar.sameElse;return _n(n)?n.call(t,r):n}function mn(e,t,r){var n=""+Math.abs(e),i=t-n.length,o=e>=0;return(o?r?"+":"":"-")+Math.pow(10,Math.max(0,i)).toString().substr(1)+n}var bg=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,xc=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,Oh={},hs={};function se(e,t,r,n){var i=n;typeof n=="string"&&(i=function(){return this[n]()}),e&&(hs[e]=i),t&&(hs[t[0]]=function(){return mn(i.apply(this,arguments),t[1],t[2])}),r&&(hs[r]=function(){return this.localeData().ordinal(i.apply(this,arguments),e)})}function rF(e){return e.match(/\[[\s\S]/)?e.replace(/^\[|\]$/g,""):e.replace(/\\/g,"")}function nF(e){var t=e.match(bg),r,n;for(r=0,n=t.length;r=0&&xc.test(e);)e=e.replace(xc,n),xc.lastIndex=0,r-=1;return e}var iF={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 oF(e){var t=this._longDateFormat[e],r=this._longDateFormat[e.toUpperCase()];return t||!r?t:(this._longDateFormat[e]=r.match(bg).map(function(n){return n==="MMMM"||n==="MM"||n==="DD"||n==="dddd"?n.slice(1):n}).join(""),this._longDateFormat[e])}var sF="Invalid date";function aF(){return this._invalidDate}var lF="%d",cF=/\d{1,2}/;function uF(e){return this._ordinal.replace("%d",e)}var dF={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 fF(e,t,r,n){var i=this._relativeTime[r];return _n(i)?i(e,t,r,n):i.replace(/%d/i,e)}function hF(e,t){var r=this._relativeTime[e>0?"future":"past"];return _n(r)?r(t):r.replace(/%s/i,t)}var Aa={};function Bt(e,t){var r=e.toLowerCase();Aa[r]=Aa[r+"s"]=Aa[t]=e}function Ir(e){return typeof e=="string"?Aa[e]||Aa[e.toLowerCase()]:void 0}function kg(e){var t={},r,n;for(n in e)Oe(e,n)&&(r=Ir(n),r&&(t[r]=e[n]));return t}var sb={};function Gt(e,t){sb[e]=t}function mF(e){var t=[],r;for(r in e)Oe(e,r)&&t.push({unit:r,priority:sb[r]});return t.sort(function(n,i){return n.priority-i.priority}),t}function Gd(e){return e%4===0&&e%100!==0||e%400===0}function Tr(e){return e<0?Math.ceil(e)||0:Math.floor(e)}function we(e){var t=+e,r=0;return t!==0&&isFinite(t)&&(r=Tr(t)),r}function Ys(e,t){return function(r){return r!=null?(ab(this,e,r),U.updateOffset(this,t),this):Mu(this,e)}}function Mu(e,t){return e.isValid()?e._d["get"+(e._isUTC?"UTC":"")+t]():NaN}function ab(e,t,r){e.isValid()&&!isNaN(r)&&(t==="FullYear"&&Gd(e.year())&&e.month()===1&&e.date()===29?(r=we(r),e._d["set"+(e._isUTC?"UTC":"")+t](r,e.month(),Jd(r,e.month()))):e._d["set"+(e._isUTC?"UTC":"")+t](r))}function pF(e){return e=Ir(e),_n(this[e])?this[e]():this}function gF(e,t){if(typeof e=="object"){e=kg(e);var r=mF(e),n,i=r.length;for(n=0;n68?1900:2e3)};var vb=Ys("FullYear",!0);function AF(){return Gd(this.year())}function IF(e,t,r,n,i,o,a){var c;return e<100&&e>=0?(c=new Date(e+400,t,r,n,i,o,a),isFinite(c.getFullYear())&&c.setFullYear(e)):c=new Date(e,t,r,n,i,o,a),c}function al(e){var t,r;return e<100&&e>=0?(r=Array.prototype.slice.call(arguments),r[0]=e+400,t=new Date(Date.UTC.apply(null,r)),isFinite(t.getUTCFullYear())&&t.setUTCFullYear(e)):t=new Date(Date.UTC.apply(null,arguments)),t}function Au(e,t,r){var n=7+t-r,i=(7+al(e,0,n).getUTCDay()-t)%7;return-i+n-1}function yb(e,t,r,n,i){var o=(7+r-n)%7,a=Au(e,n,i),c=1+7*(t-1)+o+a,d,h;return c<=0?(d=e-1,h=Ia(d)+c):c>Ia(e)?(d=e+1,h=c-Ia(e)):(d=e,h=c),{year:d,dayOfYear:h}}function ll(e,t,r){var n=Au(e.year(),t,r),i=Math.floor((e.dayOfYear()-n-1)/7)+1,o,a;return i<1?(a=e.year()-1,o=i+Bn(a,t,r)):i>Bn(e.year(),t,r)?(o=i-Bn(e.year(),t,r),a=e.year()+1):(a=e.year(),o=i),{week:o,year:a}}function Bn(e,t,r){var n=Au(e,t,r),i=Au(e+1,t,r);return(Ia(e)-n+i)/7}se("w",["ww",2],"wo","week");se("W",["WW",2],"Wo","isoWeek");Bt("week","w");Bt("isoWeek","W");Gt("week",5);Gt("isoWeek",5);q("w",Ke);q("ww",Ke,kr);q("W",Ke);q("WW",Ke,kr);Dl(["w","ww","W","WW"],function(e,t,r,n){t[n.substr(0,1)]=we(e)});function NF(e){return ll(e,this._week.dow,this._week.doy).week}var $F={dow:0,doy:6};function zF(){return this._week.dow}function HF(){return this._week.doy}function YF(e){var t=this.localeData().week(this);return e==null?t:this.add((e-t)*7,"d")}function FF(e){var t=ll(this,1,4).week;return e==null?t:this.add((e-t)*7,"d")}se("d",0,"do","day");se("dd",0,0,function(e){return this.localeData().weekdaysMin(this,e)});se("ddd",0,0,function(e){return this.localeData().weekdaysShort(this,e)});se("dddd",0,0,function(e){return this.localeData().weekdays(this,e)});se("e",0,0,"weekday");se("E",0,0,"isoWeekday");Bt("day","d");Bt("weekday","e");Bt("isoWeekday","E");Gt("day",11);Gt("weekday",11);Gt("isoWeekday",11);q("d",Ke);q("e",Ke);q("E",Ke);q("dd",function(e,t){return t.weekdaysMinRegex(e)});q("ddd",function(e,t){return t.weekdaysShortRegex(e)});q("dddd",function(e,t){return t.weekdaysRegex(e)});Dl(["dd","ddd","dddd"],function(e,t,r,n){var i=r._locale.weekdaysParse(e,n,r._strict);i!=null?t.d=i:pe(r).invalidWeekday=e});Dl(["d","e","E"],function(e,t,r,n){t[n]=we(e)});function VF(e,t){return typeof e!="string"?e:isNaN(e)?(e=t.weekdaysParse(e),typeof e=="number"?e:null):parseInt(e,10)}function WF(e,t){return typeof e=="string"?t.weekdaysParse(e)%7||7:isNaN(e)?null:e}function Eg(e,t){return e.slice(t,7).concat(e.slice(0,t))}var UF="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),wb="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),BF="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),GF=Cl,XF=Cl,KF=Cl;function QF(e,t){var r=Zr(this._weekdays)?this._weekdays:this._weekdays[e&&e!==!0&&this._weekdays.isFormat.test(t)?"format":"standalone"];return e===!0?Eg(r,this._week.dow):e?r[e.day()]:r}function qF(e){return e===!0?Eg(this._weekdaysShort,this._week.dow):e?this._weekdaysShort[e.day()]:this._weekdaysShort}function ZF(e){return e===!0?Eg(this._weekdaysMin,this._week.dow):e?this._weekdaysMin[e.day()]:this._weekdaysMin}function JF(e,t,r){var n,i,o,a=e.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],n=0;n<7;++n)o=wn([2e3,1]).day(n),this._minWeekdaysParse[n]=this.weekdaysMin(o,"").toLocaleLowerCase(),this._shortWeekdaysParse[n]=this.weekdaysShort(o,"").toLocaleLowerCase(),this._weekdaysParse[n]=this.weekdays(o,"").toLocaleLowerCase();return r?t==="dddd"?(i=dt.call(this._weekdaysParse,a),i!==-1?i:null):t==="ddd"?(i=dt.call(this._shortWeekdaysParse,a),i!==-1?i:null):(i=dt.call(this._minWeekdaysParse,a),i!==-1?i:null):t==="dddd"?(i=dt.call(this._weekdaysParse,a),i!==-1||(i=dt.call(this._shortWeekdaysParse,a),i!==-1)?i:(i=dt.call(this._minWeekdaysParse,a),i!==-1?i:null)):t==="ddd"?(i=dt.call(this._shortWeekdaysParse,a),i!==-1||(i=dt.call(this._weekdaysParse,a),i!==-1)?i:(i=dt.call(this._minWeekdaysParse,a),i!==-1?i:null)):(i=dt.call(this._minWeekdaysParse,a),i!==-1||(i=dt.call(this._weekdaysParse,a),i!==-1)?i:(i=dt.call(this._shortWeekdaysParse,a),i!==-1?i:null))}function eV(e,t,r){var n,i,o;if(this._weekdaysParseExact)return JF.call(this,e,t,r);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),n=0;n<7;n++){if(i=wn([2e3,1]).day(n),r&&!this._fullWeekdaysParse[n]&&(this._fullWeekdaysParse[n]=new RegExp("^"+this.weekdays(i,"").replace(".","\\.?")+"$","i"),this._shortWeekdaysParse[n]=new RegExp("^"+this.weekdaysShort(i,"").replace(".","\\.?")+"$","i"),this._minWeekdaysParse[n]=new RegExp("^"+this.weekdaysMin(i,"").replace(".","\\.?")+"$","i")),this._weekdaysParse[n]||(o="^"+this.weekdays(i,"")+"|^"+this.weekdaysShort(i,"")+"|^"+this.weekdaysMin(i,""),this._weekdaysParse[n]=new RegExp(o.replace(".",""),"i")),r&&t==="dddd"&&this._fullWeekdaysParse[n].test(e))return n;if(r&&t==="ddd"&&this._shortWeekdaysParse[n].test(e))return n;if(r&&t==="dd"&&this._minWeekdaysParse[n].test(e))return n;if(!r&&this._weekdaysParse[n].test(e))return n}}function tV(e){if(!this.isValid())return e!=null?this:NaN;var t=this._isUTC?this._d.getUTCDay():this._d.getDay();return e!=null?(e=VF(e,this.localeData()),this.add(e-t,"d")):t}function rV(e){if(!this.isValid())return e!=null?this:NaN;var t=(this.day()+7-this.localeData()._week.dow)%7;return e==null?t:this.add(e-t,"d")}function nV(e){if(!this.isValid())return e!=null?this:NaN;if(e!=null){var t=WF(e,this.localeData());return this.day(this.day()%7?t:t-7)}else return this.day()||7}function iV(e){return this._weekdaysParseExact?(Oe(this,"_weekdaysRegex")||Tg.call(this),e?this._weekdaysStrictRegex:this._weekdaysRegex):(Oe(this,"_weekdaysRegex")||(this._weekdaysRegex=GF),this._weekdaysStrictRegex&&e?this._weekdaysStrictRegex:this._weekdaysRegex)}function oV(e){return this._weekdaysParseExact?(Oe(this,"_weekdaysRegex")||Tg.call(this),e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(Oe(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=XF),this._weekdaysShortStrictRegex&&e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)}function sV(e){return this._weekdaysParseExact?(Oe(this,"_weekdaysRegex")||Tg.call(this),e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(Oe(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=KF),this._weekdaysMinStrictRegex&&e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)}function Tg(){function e(g,v){return v.length-g.length}var t=[],r=[],n=[],i=[],o,a,c,d,h;for(o=0;o<7;o++)a=wn([2e3,1]).day(o),c=gr(this.weekdaysMin(a,"")),d=gr(this.weekdaysShort(a,"")),h=gr(this.weekdays(a,"")),t.push(c),r.push(d),n.push(h),i.push(c),i.push(d),i.push(h);t.sort(e),r.sort(e),n.sort(e),i.sort(e),this._weekdaysRegex=new RegExp("^("+i.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+n.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+r.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+t.join("|")+")","i")}function jg(){return this.hours()%12||12}function aV(){return this.hours()||24}se("H",["HH",2],0,"hour");se("h",["hh",2],0,jg);se("k",["kk",2],0,aV);se("hmm",0,0,function(){return""+jg.apply(this)+mn(this.minutes(),2)});se("hmmss",0,0,function(){return""+jg.apply(this)+mn(this.minutes(),2)+mn(this.seconds(),2)});se("Hmm",0,0,function(){return""+this.hours()+mn(this.minutes(),2)});se("Hmmss",0,0,function(){return""+this.hours()+mn(this.minutes(),2)+mn(this.seconds(),2)});function _b(e,t){se(e,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),t)})}_b("a",!0);_b("A",!1);Bt("hour","h");Gt("hour",13);function xb(e,t){return t._meridiemParse}q("a",xb);q("A",xb);q("H",Ke);q("h",Ke);q("k",Ke);q("HH",Ke,kr);q("hh",Ke,kr);q("kk",Ke,kr);q("hmm",ub);q("hmmss",db);q("Hmm",ub);q("Hmmss",db);He(["H","HH"],Ct);He(["k","kk"],function(e,t,r){var n=we(e);t[Ct]=n===24?0:n});He(["a","A"],function(e,t,r){r._isPm=r._locale.isPM(e),r._meridiem=e});He(["h","hh"],function(e,t,r){t[Ct]=we(e),pe(r).bigHour=!0});He("hmm",function(e,t,r){var n=e.length-2;t[Ct]=we(e.substr(0,n)),t[Gr]=we(e.substr(n)),pe(r).bigHour=!0});He("hmmss",function(e,t,r){var n=e.length-4,i=e.length-2;t[Ct]=we(e.substr(0,n)),t[Gr]=we(e.substr(n,2)),t[Vn]=we(e.substr(i)),pe(r).bigHour=!0});He("Hmm",function(e,t,r){var n=e.length-2;t[Ct]=we(e.substr(0,n)),t[Gr]=we(e.substr(n))});He("Hmmss",function(e,t,r){var n=e.length-4,i=e.length-2;t[Ct]=we(e.substr(0,n)),t[Gr]=we(e.substr(n,2)),t[Vn]=we(e.substr(i))});function lV(e){return(e+"").toLowerCase().charAt(0)==="p"}var cV=/[ap]\.?m?\.?/i,uV=Ys("Hours",!0);function dV(e,t,r){return e>11?r?"pm":"PM":r?"am":"AM"}var Sb={calendar:eF,longDateFormat:iF,invalidDate:sF,ordinal:lF,dayOfMonthOrdinalParse:cF,relativeTime:dF,months:CF,monthsShort:fb,week:$F,weekdays:UF,weekdaysMin:BF,weekdaysShort:wb,meridiemParse:cV},qe={},ma={},cl;function fV(e,t){var r,n=Math.min(e.length,t.length);for(r=0;r0;){if(i=ef(o.slice(0,r).join("-")),i)return i;if(n&&n.length>=r&&fV(o,n)>=r-1)break;r--}t++}return cl}function mV(e){return e.match("^[^/\\\\]*$")!=null}function ef(e){var t=null,r;if(qe[e]===void 0&&typeof Gc<"u"&&Gc&&Gc.exports&&mV(e))try{t=cl._abbr,r=require,r("./locale/"+e),Li(t)}catch{qe[e]=null}return qe[e]}function Li(e,t){var r;return e&&(ar(t)?r=ri(e):r=Og(e,t),r?cl=r:typeof console<"u"&&console.warn&&console.warn("Locale "+e+" not found. Did you forget to load it?")),cl._abbr}function Og(e,t){if(t!==null){var r,n=Sb;if(t.abbr=e,qe[e]!=null)ib("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),n=qe[e]._config;else if(t.parentLocale!=null)if(qe[t.parentLocale]!=null)n=qe[t.parentLocale]._config;else if(r=ef(t.parentLocale),r!=null)n=r._config;else return ma[t.parentLocale]||(ma[t.parentLocale]=[]),ma[t.parentLocale].push({name:e,config:t}),null;return qe[e]=new Sg(Mp(n,t)),ma[e]&&ma[e].forEach(function(i){Og(i.name,i.config)}),Li(e),qe[e]}else return delete qe[e],null}function pV(e,t){if(t!=null){var r,n,i=Sb;qe[e]!=null&&qe[e].parentLocale!=null?qe[e].set(Mp(qe[e]._config,t)):(n=ef(e),n!=null&&(i=n._config),t=Mp(i,t),n==null&&(t.abbr=e),r=new Sg(t),r.parentLocale=qe[e],qe[e]=r),Li(e)}else qe[e]!=null&&(qe[e].parentLocale!=null?(qe[e]=qe[e].parentLocale,e===Li()&&Li(e)):qe[e]!=null&&delete qe[e]);return qe[e]}function ri(e){var t;if(e&&e._locale&&e._locale._abbr&&(e=e._locale._abbr),!e)return cl;if(!Zr(e)){if(t=ef(e),t)return t;e=[e]}return hV(e)}function gV(){return Lp(qe)}function Pg(e){var t,r=e._a;return r&&pe(e).overflow===-2&&(t=r[Fn]<0||r[Fn]>11?Fn:r[cn]<1||r[cn]>Jd(r[Wt],r[Fn])?cn:r[Ct]<0||r[Ct]>24||r[Ct]===24&&(r[Gr]!==0||r[Vn]!==0||r[no]!==0)?Ct:r[Gr]<0||r[Gr]>59?Gr:r[Vn]<0||r[Vn]>59?Vn:r[no]<0||r[no]>999?no:-1,pe(e)._overflowDayOfYear&&(tcn)&&(t=cn),pe(e)._overflowWeeks&&t===-1&&(t=SF),pe(e)._overflowWeekday&&t===-1&&(t=bF),pe(e).overflow=t),e}var vV=/^\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)?)?$/,yV=/^\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)?)?$/,wV=/Z|[+-]\d\d(?::?\d\d)?/,Sc=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/],["YYYYMM",/\d{6}/,!1],["YYYY",/\d{4}/,!1]],Ph=[["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/]],_V=/^\/?Date\((-?\d+)/i,xV=/^(?:(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}))$/,SV={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 bb(e){var t,r,n=e._i,i=vV.exec(n)||yV.exec(n),o,a,c,d,h=Sc.length,g=Ph.length;if(i){for(pe(e).iso=!0,t=0,r=h;tIa(a)||e._dayOfYear===0)&&(pe(e)._overflowDayOfYear=!0),r=al(a,0,e._dayOfYear),e._a[Fn]=r.getUTCMonth(),e._a[cn]=r.getUTCDate()),t=0;t<3&&e._a[t]==null;++t)e._a[t]=n[t]=i[t];for(;t<7;t++)e._a[t]=n[t]=e._a[t]==null?t===2?1:0:e._a[t];e._a[Ct]===24&&e._a[Gr]===0&&e._a[Vn]===0&&e._a[no]===0&&(e._nextDay=!0,e._a[Ct]=0),e._d=(e._useUTC?al:IF).apply(null,n),o=e._useUTC?e._d.getUTCDay():e._d.getDay(),e._tzm!=null&&e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),e._nextDay&&(e._a[Ct]=24),e._w&&typeof e._w.d<"u"&&e._w.d!==o&&(pe(e).weekdayMismatch=!0)}}function OV(e){var t,r,n,i,o,a,c,d,h;t=e._w,t.GG!=null||t.W!=null||t.E!=null?(o=1,a=4,r=Yo(t.GG,e._a[Wt],ll(Xe(),1,4).year),n=Yo(t.W,1),i=Yo(t.E,1),(i<1||i>7)&&(d=!0)):(o=e._locale._week.dow,a=e._locale._week.doy,h=ll(Xe(),o,a),r=Yo(t.gg,e._a[Wt],h.year),n=Yo(t.w,h.week),t.d!=null?(i=t.d,(i<0||i>6)&&(d=!0)):t.e!=null?(i=t.e+o,(t.e<0||t.e>6)&&(d=!0)):i=o),n<1||n>Bn(r,o,a)?pe(e)._overflowWeeks=!0:d!=null?pe(e)._overflowWeekday=!0:(c=yb(r,n,i,o,a),e._a[Wt]=c.year,e._dayOfYear=c.dayOfYear)}U.ISO_8601=function(){};U.RFC_2822=function(){};function Mg(e){if(e._f===U.ISO_8601){bb(e);return}if(e._f===U.RFC_2822){kb(e);return}e._a=[],pe(e).empty=!0;var t=""+e._i,r,n,i,o,a,c=t.length,d=0,h,g;for(i=ob(e._f,e._locale).match(bg)||[],g=i.length,r=0;r0&&pe(e).unusedInput.push(a),t=t.slice(t.indexOf(n)+n.length),d+=n.length),hs[o]?(n?pe(e).empty=!1:pe(e).unusedTokens.push(o),xF(o,n,e)):e._strict&&!n&&pe(e).unusedTokens.push(o);pe(e).charsLeftOver=c-d,t.length>0&&pe(e).unusedInput.push(t),e._a[Ct]<=12&&pe(e).bigHour===!0&&e._a[Ct]>0&&(pe(e).bigHour=void 0),pe(e).parsedDateParts=e._a.slice(0),pe(e).meridiem=e._meridiem,e._a[Ct]=PV(e._locale,e._a[Ct],e._meridiem),h=pe(e).era,h!==null&&(e._a[Wt]=e._locale.erasConvertYear(h,e._a[Wt])),Rg(e),Pg(e)}function PV(e,t,r){var n;return r==null?t:e.meridiemHour!=null?e.meridiemHour(t,r):(e.isPM!=null&&(n=e.isPM(r),n&&t<12&&(t+=12),!n&&t===12&&(t=0)),t)}function RV(e){var t,r,n,i,o,a,c=!1,d=e._f.length;if(d===0){pe(e).invalidFormat=!0,e._d=new Date(NaN);return}for(i=0;ithis?this:e:Bd()});function Eb(e,t){var r,n;if(t.length===1&&Zr(t[0])&&(t=t[0]),!t.length)return Xe();for(r=t[0],n=1;nthis.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function JV(){if(!ar(this._isDSTShifted))return this._isDSTShifted;var e={},t;return xg(e,this),e=Cb(e),e._a?(t=e._isUTC?wn(e._a):Xe(e._a),this._isDSTShifted=this.isValid()&&WV(e._a,t.toArray())>0):this._isDSTShifted=!1,this._isDSTShifted}function e9(){return this.isValid()?!this._isUTC:!1}function t9(){return this.isValid()?this._isUTC:!1}function jb(){return this.isValid()?this._isUTC&&this._offset===0:!1}var r9=/^(-|\+)?(?:(\d*)[. ])?(\d+):(\d+)(?::(\d+)(\.\d*)?)?$/,n9=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;function en(e,t){var r=e,n=null,i,o,a;return Uc(e)?r={ms:e._milliseconds,d:e._days,M:e._months}:qn(e)||!isNaN(+e)?(r={},t?r[t]=+e:r.milliseconds=+e):(n=r9.exec(e))?(i=n[1]==="-"?-1:1,r={y:0,d:we(n[cn])*i,h:we(n[Ct])*i,m:we(n[Gr])*i,s:we(n[Vn])*i,ms:we(Ip(n[no]*1e3))*i}):(n=n9.exec(e))?(i=n[1]==="-"?-1:1,r={y:Xi(n[2],i),M:Xi(n[3],i),w:Xi(n[4],i),d:Xi(n[5],i),h:Xi(n[6],i),m:Xi(n[7],i),s:Xi(n[8],i)}):r==null?r={}:typeof r=="object"&&("from"in r||"to"in r)&&(a=i9(Xe(r.from),Xe(r.to)),r={},r.ms=a.milliseconds,r.M=a.months),o=new tf(r),Uc(e)&&Oe(e,"_locale")&&(o._locale=e._locale),Uc(e)&&Oe(e,"_isValid")&&(o._isValid=e._isValid),o}en.fn=tf.prototype;en.invalid=VV;function Xi(e,t){var r=e&&parseFloat(e.replace(",","."));return(isNaN(r)?0:r)*t}function dw(e,t){var r={};return r.months=t.month()-e.month()+(t.year()-e.year())*12,e.clone().add(r.months,"M").isAfter(t)&&--r.months,r.milliseconds=+t-+e.clone().add(r.months,"M"),r}function i9(e,t){var r;return e.isValid()&&t.isValid()?(t=Ag(t,e),e.isBefore(t)?r=dw(e,t):(r=dw(t,e),r.milliseconds=-r.milliseconds,r.months=-r.months),r):{milliseconds:0,months:0}}function Ob(e,t){return function(r,n){var i,o;return n!==null&&!isNaN(+n)&&(ib(t,"moment()."+t+"(period, number) is deprecated. Please use moment()."+t+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),o=r,r=n,n=o),i=en(r,n),Pb(this,i,e),this}}function Pb(e,t,r,n){var i=t._milliseconds,o=Ip(t._days),a=Ip(t._months);e.isValid()&&(n=n??!0,a&&mb(e,Mu(e,"Month")+a*r),o&&ab(e,"Date",Mu(e,"Date")+o*r),i&&e._d.setTime(e._d.valueOf()+i*r),n&&U.updateOffset(e,o||a))}var o9=Ob(1,"add"),s9=Ob(-1,"subtract");function Rb(e){return typeof e=="string"||e instanceof String}function a9(e){return Jr(e)||bl(e)||Rb(e)||qn(e)||c9(e)||l9(e)||e===null||e===void 0}function l9(e){var t=lo(e)&&!wg(e),r=!1,n=["years","year","y","months","month","M","days","day","d","dates","date","D","hours","hour","h","minutes","minute","m","seconds","second","s","milliseconds","millisecond","ms"],i,o,a=n.length;for(i=0;ir.valueOf():r.valueOf()9999?Wc(r,t?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):_n(Date.prototype.toISOString)?t?this.toDate().toISOString():new Date(this.valueOf()+this.utcOffset()*60*1e3).toISOString().replace("Z",Wc(r,"Z")):Wc(r,t?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")}function b9(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var e="moment",t="",r,n,i,o;return this.isLocal()||(e=this.utcOffset()===0?"moment.utc":"moment.parseZone",t="Z"),r="["+e+'("]',n=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",i="-MM-DD[T]HH:mm:ss.SSS",o=t+'[")]',this.format(r+n+i+o)}function k9(e){e||(e=this.isUtc()?U.defaultFormatUtc:U.defaultFormat);var t=Wc(this,e);return this.localeData().postformat(t)}function C9(e,t){return this.isValid()&&(Jr(e)&&e.isValid()||Xe(e).isValid())?en({to:this,from:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()}function D9(e){return this.from(Xe(),e)}function E9(e,t){return this.isValid()&&(Jr(e)&&e.isValid()||Xe(e).isValid())?en({from:this,to:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()}function T9(e){return this.to(Xe(),e)}function Mb(e){var t;return e===void 0?this._locale._abbr:(t=ri(e),t!=null&&(this._locale=t),this)}var Lb=Ar("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(e){return e===void 0?this.localeData():this.locale(e)});function Ab(){return this._locale}var Iu=1e3,ms=60*Iu,Nu=60*ms,Ib=(365*400+97)*24*Nu;function ps(e,t){return(e%t+t)%t}function Nb(e,t,r){return e<100&&e>=0?new Date(e+400,t,r)-Ib:new Date(e,t,r).valueOf()}function $b(e,t,r){return e<100&&e>=0?Date.UTC(e+400,t,r)-Ib:Date.UTC(e,t,r)}function j9(e){var t,r;if(e=Ir(e),e===void 0||e==="millisecond"||!this.isValid())return this;switch(r=this._isUTC?$b:Nb,e){case"year":t=r(this.year(),0,1);break;case"quarter":t=r(this.year(),this.month()-this.month()%3,1);break;case"month":t=r(this.year(),this.month(),1);break;case"week":t=r(this.year(),this.month(),this.date()-this.weekday());break;case"isoWeek":t=r(this.year(),this.month(),this.date()-(this.isoWeekday()-1));break;case"day":case"date":t=r(this.year(),this.month(),this.date());break;case"hour":t=this._d.valueOf(),t-=ps(t+(this._isUTC?0:this.utcOffset()*ms),Nu);break;case"minute":t=this._d.valueOf(),t-=ps(t,ms);break;case"second":t=this._d.valueOf(),t-=ps(t,Iu);break}return this._d.setTime(t),U.updateOffset(this,!0),this}function O9(e){var t,r;if(e=Ir(e),e===void 0||e==="millisecond"||!this.isValid())return this;switch(r=this._isUTC?$b:Nb,e){case"year":t=r(this.year()+1,0,1)-1;break;case"quarter":t=r(this.year(),this.month()-this.month()%3+3,1)-1;break;case"month":t=r(this.year(),this.month()+1,1)-1;break;case"week":t=r(this.year(),this.month(),this.date()-this.weekday()+7)-1;break;case"isoWeek":t=r(this.year(),this.month(),this.date()-(this.isoWeekday()-1)+7)-1;break;case"day":case"date":t=r(this.year(),this.month(),this.date()+1)-1;break;case"hour":t=this._d.valueOf(),t+=Nu-ps(t+(this._isUTC?0:this.utcOffset()*ms),Nu)-1;break;case"minute":t=this._d.valueOf(),t+=ms-ps(t,ms)-1;break;case"second":t=this._d.valueOf(),t+=Iu-ps(t,Iu)-1;break}return this._d.setTime(t),U.updateOffset(this,!0),this}function P9(){return this._d.valueOf()-(this._offset||0)*6e4}function R9(){return Math.floor(this.valueOf()/1e3)}function M9(){return new Date(this.valueOf())}function L9(){var e=this;return[e.year(),e.month(),e.date(),e.hour(),e.minute(),e.second(),e.millisecond()]}function A9(){var e=this;return{years:e.year(),months:e.month(),date:e.date(),hours:e.hours(),minutes:e.minutes(),seconds:e.seconds(),milliseconds:e.milliseconds()}}function I9(){return this.isValid()?this.toISOString():null}function N9(){return _g(this)}function $9(){return bi({},pe(this))}function z9(){return pe(this).overflow}function H9(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}}se("N",0,0,"eraAbbr");se("NN",0,0,"eraAbbr");se("NNN",0,0,"eraAbbr");se("NNNN",0,0,"eraName");se("NNNNN",0,0,"eraNarrow");se("y",["y",1],"yo","eraYear");se("y",["yy",2],0,"eraYear");se("y",["yyy",3],0,"eraYear");se("y",["yyyy",4],0,"eraYear");q("N",Ig);q("NN",Ig);q("NNN",Ig);q("NNNN",q9);q("NNNNN",Z9);He(["N","NN","NNN","NNNN","NNNNN"],function(e,t,r,n){var i=r._locale.erasParse(e,n,r._strict);i?pe(r).era=i:pe(r).invalidEra=e});q("y",Fs);q("yy",Fs);q("yyy",Fs);q("yyyy",Fs);q("yo",J9);He(["y","yy","yyy","yyyy"],Wt);He(["yo"],function(e,t,r,n){var i;r._locale._eraYearOrdinalRegex&&(i=e.match(r._locale._eraYearOrdinalRegex)),r._locale.eraYearOrdinalParse?t[Wt]=r._locale.eraYearOrdinalParse(e,i):t[Wt]=parseInt(e,10)});function Y9(e,t){var r,n,i,o=this._eras||ri("en")._eras;for(r=0,n=o.length;r=0)return o[n]}function V9(e,t){var r=e.since<=e.until?1:-1;return t===void 0?U(e.since).year():U(e.since).year()+(t-e.offset)*r}function W9(){var e,t,r,n=this.localeData().eras();for(e=0,t=n.length;eo&&(t=o),sW.call(this,e,t,r,n,i))}function sW(e,t,r,n,i){var o=yb(e,t,r,n,i),a=al(o.year,0,o.dayOfYear);return this.year(a.getUTCFullYear()),this.month(a.getUTCMonth()),this.date(a.getUTCDate()),this}se("Q",0,"Qo","quarter");Bt("quarter","Q");Gt("quarter",7);q("Q",lb);He("Q",function(e,t){t[Fn]=(we(e)-1)*3});function aW(e){return e==null?Math.ceil((this.month()+1)/3):this.month((e-1)*3+this.month()%3)}se("D",["DD",2],"Do","date");Bt("date","D");Gt("date",9);q("D",Ke);q("DD",Ke,kr);q("Do",function(e,t){return e?t._dayOfMonthOrdinalParse||t._ordinalParse:t._dayOfMonthOrdinalParseLenient});He(["D","DD"],cn);He("Do",function(e,t){t[cn]=we(e.match(Ke)[0])});var Hb=Ys("Date",!0);se("DDD",["DDDD",3],"DDDo","dayOfYear");Bt("dayOfYear","DDD");Gt("dayOfYear",4);q("DDD",Kd);q("DDDD",cb);He(["DDD","DDDD"],function(e,t,r){r._dayOfYear=we(e)});function lW(e){var t=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return e==null?t:this.add(e-t,"d")}se("m",["mm",2],0,"minute");Bt("minute","m");Gt("minute",14);q("m",Ke);q("mm",Ke,kr);He(["m","mm"],Gr);var cW=Ys("Minutes",!1);se("s",["ss",2],0,"second");Bt("second","s");Gt("second",15);q("s",Ke);q("ss",Ke,kr);He(["s","ss"],Vn);var uW=Ys("Seconds",!1);se("S",0,0,function(){return~~(this.millisecond()/100)});se(0,["SS",2],0,function(){return~~(this.millisecond()/10)});se(0,["SSS",3],0,"millisecond");se(0,["SSSS",4],0,function(){return this.millisecond()*10});se(0,["SSSSS",5],0,function(){return this.millisecond()*100});se(0,["SSSSSS",6],0,function(){return this.millisecond()*1e3});se(0,["SSSSSSS",7],0,function(){return this.millisecond()*1e4});se(0,["SSSSSSSS",8],0,function(){return this.millisecond()*1e5});se(0,["SSSSSSSSS",9],0,function(){return this.millisecond()*1e6});Bt("millisecond","ms");Gt("millisecond",16);q("S",Kd,lb);q("SS",Kd,kr);q("SSS",Kd,cb);var ki,Yb;for(ki="SSSS";ki.length<=9;ki+="S")q(ki,Fs);function dW(e,t){t[no]=we(("0."+e)*1e3)}for(ki="S";ki.length<=9;ki+="S")He(ki,dW);Yb=Ys("Milliseconds",!1);se("z",0,0,"zoneAbbr");se("zz",0,0,"zoneName");function fW(){return this._isUTC?"UTC":""}function hW(){return this._isUTC?"Coordinated Universal Time":""}var V=kl.prototype;V.add=o9;V.calendar=f9;V.clone=h9;V.diff=_9;V.endOf=O9;V.format=k9;V.from=C9;V.fromNow=D9;V.to=E9;V.toNow=T9;V.get=pF;V.invalidAt=z9;V.isAfter=m9;V.isBefore=p9;V.isBetween=g9;V.isSame=v9;V.isSameOrAfter=y9;V.isSameOrBefore=w9;V.isValid=N9;V.lang=Lb;V.locale=Mb;V.localeData=Ab;V.max=NV;V.min=IV;V.parsingFlags=$9;V.set=gF;V.startOf=j9;V.subtract=s9;V.toArray=L9;V.toObject=A9;V.toDate=M9;V.toISOString=S9;V.inspect=b9;typeof Symbol<"u"&&Symbol.for!=null&&(V[Symbol.for("nodejs.util.inspect.custom")]=function(){return"Moment<"+this.format()+">"});V.toJSON=I9;V.toString=x9;V.unix=R9;V.valueOf=P9;V.creationData=H9;V.eraName=W9;V.eraNarrow=U9;V.eraAbbr=B9;V.eraYear=G9;V.year=vb;V.isLeapYear=AF;V.weekYear=eW;V.isoWeekYear=tW;V.quarter=V.quarters=aW;V.month=pb;V.daysInMonth=RF;V.week=V.weeks=YF;V.isoWeek=V.isoWeeks=FF;V.weeksInYear=iW;V.weeksInWeekYear=oW;V.isoWeeksInYear=rW;V.isoWeeksInISOWeekYear=nW;V.date=Hb;V.day=V.days=tV;V.weekday=rV;V.isoWeekday=nV;V.dayOfYear=lW;V.hour=V.hours=uV;V.minute=V.minutes=cW;V.second=V.seconds=uW;V.millisecond=V.milliseconds=Yb;V.utcOffset=BV;V.utc=XV;V.local=KV;V.parseZone=QV;V.hasAlignedHourOffset=qV;V.isDST=ZV;V.isLocal=e9;V.isUtcOffset=t9;V.isUtc=jb;V.isUTC=jb;V.zoneAbbr=fW;V.zoneName=hW;V.dates=Ar("dates accessor is deprecated. Use date instead.",Hb);V.months=Ar("months accessor is deprecated. Use month instead",pb);V.years=Ar("years accessor is deprecated. Use year instead",vb);V.zone=Ar("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",GV);V.isDSTShifted=Ar("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",JV);function mW(e){return Xe(e*1e3)}function pW(){return Xe.apply(null,arguments).parseZone()}function Fb(e){return e}var Pe=Sg.prototype;Pe.calendar=tF;Pe.longDateFormat=oF;Pe.invalidDate=aF;Pe.ordinal=uF;Pe.preparse=Fb;Pe.postformat=Fb;Pe.relativeTime=fF;Pe.pastFuture=hF;Pe.set=JY;Pe.eras=Y9;Pe.erasParse=F9;Pe.erasConvertYear=V9;Pe.erasAbbrRegex=K9;Pe.erasNameRegex=X9;Pe.erasNarrowRegex=Q9;Pe.months=TF;Pe.monthsShort=jF;Pe.monthsParse=PF;Pe.monthsRegex=LF;Pe.monthsShortRegex=MF;Pe.week=NF;Pe.firstDayOfYear=HF;Pe.firstDayOfWeek=zF;Pe.weekdays=QF;Pe.weekdaysMin=ZF;Pe.weekdaysShort=qF;Pe.weekdaysParse=eV;Pe.weekdaysRegex=iV;Pe.weekdaysShortRegex=oV;Pe.weekdaysMinRegex=sV;Pe.isPM=lV;Pe.meridiem=dV;function $u(e,t,r,n){var i=ri(),o=wn().set(n,t);return i[r](o,e)}function Vb(e,t,r){if(qn(e)&&(t=e,e=void 0),e=e||"",t!=null)return $u(e,t,r,"month");var n,i=[];for(n=0;n<12;n++)i[n]=$u(e,n,r,"month");return i}function $g(e,t,r,n){typeof e=="boolean"?(qn(t)&&(r=t,t=void 0),t=t||""):(t=e,r=t,e=!1,qn(t)&&(r=t,t=void 0),t=t||"");var i=ri(),o=e?i._week.dow:0,a,c=[];if(r!=null)return $u(t,(r+o)%7,n,"day");for(a=0;a<7;a++)c[a]=$u(t,(a+o)%7,n,"day");return c}function gW(e,t){return Vb(e,t,"months")}function vW(e,t){return Vb(e,t,"monthsShort")}function yW(e,t,r){return $g(e,t,r,"weekdays")}function wW(e,t,r){return $g(e,t,r,"weekdaysShort")}function _W(e,t,r){return $g(e,t,r,"weekdaysMin")}Li("en",{eras:[{since:"0001-01-01",until:1/0,offset:1,name:"Anno Domini",narrow:"AD",abbr:"AD"},{since:"0000-12-31",until:-1/0,offset:1,name:"Before Christ",narrow:"BC",abbr:"BC"}],dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(e){var t=e%10,r=we(e%100/10)===1?"th":t===1?"st":t===2?"nd":t===3?"rd":"th";return e+r}});U.lang=Ar("moment.lang is deprecated. Use moment.locale instead.",Li);U.langData=Ar("moment.langData is deprecated. Use moment.localeData instead.",ri);var Mn=Math.abs;function xW(){var e=this._data;return this._milliseconds=Mn(this._milliseconds),this._days=Mn(this._days),this._months=Mn(this._months),e.milliseconds=Mn(e.milliseconds),e.seconds=Mn(e.seconds),e.minutes=Mn(e.minutes),e.hours=Mn(e.hours),e.months=Mn(e.months),e.years=Mn(e.years),this}function Wb(e,t,r,n){var i=en(t,r);return e._milliseconds+=n*i._milliseconds,e._days+=n*i._days,e._months+=n*i._months,e._bubble()}function SW(e,t){return Wb(this,e,t,1)}function bW(e,t){return Wb(this,e,t,-1)}function fw(e){return e<0?Math.floor(e):Math.ceil(e)}function kW(){var e=this._milliseconds,t=this._days,r=this._months,n=this._data,i,o,a,c,d;return e>=0&&t>=0&&r>=0||e<=0&&t<=0&&r<=0||(e+=fw($p(r)+t)*864e5,t=0,r=0),n.milliseconds=e%1e3,i=Tr(e/1e3),n.seconds=i%60,o=Tr(i/60),n.minutes=o%60,a=Tr(o/60),n.hours=a%24,t+=Tr(a/24),d=Tr(Ub(t)),r+=d,t-=fw($p(d)),c=Tr(r/12),r%=12,n.days=t,n.months=r,n.years=c,this}function Ub(e){return e*4800/146097}function $p(e){return e*146097/4800}function CW(e){if(!this.isValid())return NaN;var t,r,n=this._milliseconds;if(e=Ir(e),e==="month"||e==="quarter"||e==="year")switch(t=this._days+n/864e5,r=this._months+Ub(t),e){case"month":return r;case"quarter":return r/3;case"year":return r/12}else switch(t=this._days+Math.round($p(this._months)),e){case"week":return t/7+n/6048e5;case"day":return t+n/864e5;case"hour":return t*24+n/36e5;case"minute":return t*1440+n/6e4;case"second":return t*86400+n/1e3;case"millisecond":return Math.floor(t*864e5)+n;default:throw new Error("Unknown unit "+e)}}function DW(){return this.isValid()?this._milliseconds+this._days*864e5+this._months%12*2592e6+we(this._months/12)*31536e6:NaN}function ni(e){return function(){return this.as(e)}}var EW=ni("ms"),TW=ni("s"),jW=ni("m"),OW=ni("h"),PW=ni("d"),RW=ni("w"),MW=ni("M"),LW=ni("Q"),AW=ni("y");function IW(){return en(this)}function NW(e){return e=Ir(e),this.isValid()?this[e+"s"]():NaN}function bo(e){return function(){return this.isValid()?this._data[e]:NaN}}var $W=bo("milliseconds"),zW=bo("seconds"),HW=bo("minutes"),YW=bo("hours"),FW=bo("days"),VW=bo("months"),WW=bo("years");function UW(){return Tr(this.days()/7)}var Nn=Math.round,is={ss:44,s:45,m:45,h:22,d:26,w:null,M:11};function BW(e,t,r,n,i){return i.relativeTime(t||1,!!r,e,n)}function GW(e,t,r,n){var i=en(e).abs(),o=Nn(i.as("s")),a=Nn(i.as("m")),c=Nn(i.as("h")),d=Nn(i.as("d")),h=Nn(i.as("M")),g=Nn(i.as("w")),v=Nn(i.as("y")),x=o<=r.ss&&["s",o]||o0,x[4]=n,BW.apply(null,x)}function XW(e){return e===void 0?Nn:typeof e=="function"?(Nn=e,!0):!1}function KW(e,t){return is[e]===void 0?!1:t===void 0?is[e]:(is[e]=t,e==="s"&&(is.ss=t-1),!0)}function QW(e,t){if(!this.isValid())return this.localeData().invalidDate();var r=!1,n=is,i,o;return typeof e=="object"&&(t=e,e=!1),typeof e=="boolean"&&(r=e),typeof t=="object"&&(n=Object.assign({},is,t),t.s!=null&&t.ss==null&&(n.ss=t.s-1)),i=this.localeData(),o=GW(this,!r,n,i),r&&(o=i.pastFuture(+this,o)),i.postformat(o)}var Rh=Math.abs;function Mo(e){return(e>0)-(e<0)||+e}function nf(){if(!this.isValid())return this.localeData().invalidDate();var e=Rh(this._milliseconds)/1e3,t=Rh(this._days),r=Rh(this._months),n,i,o,a,c=this.asSeconds(),d,h,g,v;return c?(n=Tr(e/60),i=Tr(n/60),e%=60,n%=60,o=Tr(r/12),r%=12,a=e?e.toFixed(3).replace(/\.?0+$/,""):"",d=c<0?"-":"",h=Mo(this._months)!==Mo(c)?"-":"",g=Mo(this._days)!==Mo(c)?"-":"",v=Mo(this._milliseconds)!==Mo(c)?"-":"",d+"P"+(o?h+o+"Y":"")+(r?h+r+"M":"")+(t?g+t+"D":"")+(i||n||e?"T":"")+(i?v+i+"H":"")+(n?v+n+"M":"")+(e?v+a+"S":"")):"P0D"}var De=tf.prototype;De.isValid=FV;De.abs=xW;De.add=SW;De.subtract=bW;De.as=CW;De.asMilliseconds=EW;De.asSeconds=TW;De.asMinutes=jW;De.asHours=OW;De.asDays=PW;De.asWeeks=RW;De.asMonths=MW;De.asQuarters=LW;De.asYears=AW;De.valueOf=DW;De._bubble=kW;De.clone=IW;De.get=NW;De.milliseconds=$W;De.seconds=zW;De.minutes=HW;De.hours=YW;De.days=FW;De.weeks=UW;De.months=VW;De.years=WW;De.humanize=QW;De.toISOString=nf;De.toString=nf;De.toJSON=nf;De.locale=Mb;De.localeData=Ab;De.toIsoString=Ar("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",nf);De.lang=Lb;se("X",0,0,"unix");se("x",0,0,"valueOf");q("x",qd);q("X",yF);He("X",function(e,t,r){r._d=new Date(parseFloat(e)*1e3)});He("x",function(e,t,r){r._d=new Date(we(e))});//! moment.js +U.version="2.29.4";qY(Xe);U.fn=V;U.min=$V;U.max=zV;U.now=HV;U.utc=wn;U.unix=mW;U.months=gW;U.isDate=bl;U.locale=Li;U.invalid=Bd;U.duration=en;U.isMoment=Jr;U.weekdays=yW;U.parseZone=pW;U.localeData=ri;U.isDuration=Uc;U.monthsShort=vW;U.weekdaysMin=_W;U.defineLocale=Og;U.updateLocale=pV;U.locales=gV;U.weekdaysShort=wW;U.normalizeUnits=Ir;U.relativeTimeRounding=XW;U.relativeTimeThreshold=KW;U.calendarFormat=d9;U.prototype=V;U.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"GGGG-[W]WW",MONTH:"YYYY-MM"};const qW="/zh-cn/assets/blog-cover-95d8a382.png",ZW=new Map([["blogs","技术博客"],["events","活动预告"],["highlights","精彩回顾"],["news-honor-dynamic","新闻 / 荣誉"]]),JW=f.main` background: #fff; -`,JW=f.div` +`,eU=f.div` max-width: 1440px; margin-inline: auto; padding: 0.96rem 1.65rem 1.56rem; -`,eU=f.div` +`,tU=f.div` display: flex; flex-direction: row-reverse; justify-content: space-between; @@ -2119,23 +2119,23 @@ U.version="2.29.4";QY(Xe);U.fn=V;U.min=NV;U.max=$V;U.now=zV;U.utc=wn;U.unix=hW;U &:last-child { margin-bottom: 0; } -`,tU=f.img` +`,rU=f.img` padding-left: 0.47rem; width: 4.35rem; height: min-content; border-radius: 0.08rem; -`,rU=f.div` +`,nU=f.div` width: 56%; flex: 1; padding-top: calc(1.22rem - 0.96rem); padding-bottom: calc(0.53rem - 0.27rem); -`,nU=f.div` +`,iU=f.div` padding-bottom: 0.05rem; font-size: 0.15rem; line-height: 0.3rem; font-weight: 500; color: #1c5cff; -`,iU=f.div` +`,oU=f.div` padding-bottom: 0.26rem; font-size: 0.27rem; line-height: 0.33rem; @@ -2145,13 +2145,13 @@ U.version="2.29.4";QY(Xe);U.fn=V;U.min=NV;U.max=$V;U.now=zV;U.utc=wn;U.unix=hW;U &:hover { color: #531dab; } -`,oU=f.div` +`,sU=f.div` padding-bottom: 0.13rem; font-size: 0.135rem; line-height: 0.24rem; font-weight: 400; color: #7d7d7d; -`,sU=f.div` +`,aU=f.div` display: flex; align-items: center; font-size: 0.12rem; @@ -2166,36 +2166,36 @@ U.version="2.29.4";QY(Xe);U.fn=V;U.min=NV;U.max=$V;U.now=zV;U.utc=wn;U.unix=hW;U height: 0.08rem; background: #797979; border-radius: 50%; -`,aU=f.div` +`,lU=f.div` padding-inline: 0.08rem; color: #2f54eb; border: 0.01rem solid #2f54eb; background: #d6e4ff; border-radius: 0.04rem; text-transform: capitalize; -`,lU=Object.assign({"/src/articles/blogs/2022-05-17-Rust-Implementation-of-RDMA/index.md":()=>D(()=>import("./index-8702c933.js"),[]),"/src/articles/blogs/2022-05-27-Crossbeam-Epoch-Algorithm-for-Lock-Free-Programming-in-Rust/index.md":()=>D(()=>import("./index-28c4b418.js"),[]),"/src/articles/blogs/2022-05-27-Managing-RDMA-Memory-in-Rust/index.md":()=>D(()=>import("./index-de3329ad.js"),[]),"/src/articles/blogs/2022-05-27-Memory-Management-for-Lock-Free-Data-Structures-in-the-Rust-Language/index.md":()=>D(()=>import("./index-fe9ae8f0.js"),[]),"/src/articles/blogs/2022-05-27-Rethinking-How-Rust-Async-Enables-High-Performance-IO/index.md":()=>D(()=>import("./index-d81ed83c.js"),[]),"/src/articles/blogs/2022-05-27-Rust-Implementation-of-K8S-Scheduling-Extensions/index.md":()=>D(()=>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":()=>D(()=>import("./index-fd018bec.js"),[]),"/src/articles/blogs/2022-05-27-async-Rust-wraps-UCX-communication-library/index.md":()=>D(()=>import("./index-8c82e7c7.js"),[]),"/src/articles/blogs/2022-05-27-io_uring-Rust-Asynchronous-Library-Implementation/index.md":()=>D(()=>import("./index-e7093119.js"),[]),"/src/articles/blogs/2022-06-11-Computer-Architecture-l-MIT-Training-Q&A-and-Tips/index.md":()=>D(()=>import("./index-29c0b7ce.js"),[]),"/src/articles/blogs/2022-06-15-Etcd-client-cache-practice/index.md":()=>D(()=>import("./index-bfe04780.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-and-lock-free-programming-(1)/index.md":()=>D(()=>import("./index-147df4a9.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-in-lock-free-programming-scenarios-(2)/index.md":()=>D(()=>import("./index-b51a8ea2.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(1)/index.md":()=>D(()=>import("./index-5dd90a8c.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(2)/index.md":()=>D(()=>import("./index-426f092b.js"),[]),"/src/articles/blogs/2022-06-15-Using-BPF-to-implement-user-mode-tracing/index.md":()=>D(()=>import("./index-06215d3e.js"),[]),"/src/articles/blogs/2022-06-24-Why-should-a-startup-choose-Rust-for-an-RDMA-library/index.md":()=>D(()=>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":()=>D(()=>import("./index-2ee8a4ba.js"),[]),"/src/articles/blogs/2022-07-07-Rethinking-of-the-Curp-Consensus-Protocol/index.md":()=>D(()=>import("./index-f6eeef5e.js"),[]),"/src/articles/blogs/2022-08-11-DatenLord-|-Xline-Geo-distributed-KV-Storage/index.md":()=>D(()=>import("./index-9cd4971b.js"),[]),"/src/articles/blogs/2022-10-11-Rust-Chat-Room:-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>D(()=>import("./index-0bd243e2.js"),[]),"/src/articles/blogs/2022-10-20-Wonderful-review-l-Rust-chat-room:-Xline-cross-data-center-consistency-management/index.md":()=>D(()=>import("./index-fa30bf44.js"),[]),"/src/articles/blogs/2022-12-15-Distributed-state-machine-consensus-protocol-Copilot/index.md":()=>D(()=>import("./index-24694c1f.js"),[]),"/src/articles/blogs/2023-01-19-From-Cloud-Computing-to-Sky-Computing-(1)/index.md":()=>D(()=>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":()=>D(()=>import("./index-39390118.js"),[]),"/src/articles/blogs/2023-02-16-Database-isolation-level-and-MVCC/index.md":()=>D(()=>import("./index-1dde53bb.js"),[]),"/src/articles/blogs/2023-02-16-Xline-v0.2.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>D(()=>import("./index-6f20c5b7.js"),[]),"/src/articles/blogs/2023-03-02-Thinking-about-programs-mathematically-and-verifying-correctness/index.md":()=>D(()=>import("./index-82a24597.js"),[]),"/src/articles/blogs/2023-03-23-Xline-v0.3.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>D(()=>import("./index-72b88898.js"),[]),"/src/articles/blogs/2023-04-20-How-to-elegantly-organize-asynchronous-code-in-a-Rust-project/index.md":()=>D(()=>import("./index-7582b288.js"),[]),"/src/articles/blogs/2023-04-24-DatenLord-open-source-product-technology-sharing-l-Xline-source-code-interpretation/index.md":()=>D(()=>import("./index-015cf939.js"),[]),"/src/articles/blogs/2023-05-11-Xline-v0.4.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>D(()=>import("./index-1e192479.js"),[]),"/src/articles/blogs/2023-05-17-Computer-Architecture|MIT6.175-and-MIT6.375-Study-Notes/index.md":()=>D(()=>import("./index-e6f44fee.js"),[]),"/src/articles/blogs/2023-05-25-Xline-Persistent-Storage-Design-and-Implementation/index.md":()=>D(()=>import("./index-90593fbc.js"),[]),"/src/articles/blogs/2023-06-01-From-Cloud-Computing-to-Sky-Computing-(2)/index.md":()=>D(()=>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":()=>D(()=>import("./index-a8e1cc23.js"),[]),"/src/articles/blogs/2023-06-21-Xline-v0.4.1:-A-distributed-KV-store-for-metadata-management/index.md":()=>D(()=>import("./index-148365b0.js"),[]),"/src/articles/blogs/2023-07-13-Interpretation-of-Xline-source-code-(1)——Introduction-to-CURP-protocol/index.md":()=>D(()=>import("./index-5076d4ea.js"),[]),"/src/articles/blogs/2023-07-20-Xline-Source-Code-Interpretation-(II)-Lease-Mechanism-and-Implementation/index.md":()=>D(()=>import("./index-0074c42d.js"),[]),"/src/articles/blogs/2023-07-27-BSV-based-high-performance-parallel-CRC-hardware-circuit-generator/index.md":()=>D(()=>import("./index-dcc07e36.js"),[]),"/src/articles/blogs/2023-08-15-Xline-v0.5.0-a-distributed-KV-store-for-metadata-management/index.md":()=>D(()=>import("./index-7a7fbe77.js"),[]),"/src/articles/blogs/2023-08-31-Fountain-Code/index.md":()=>D(()=>import("./index-0850e6f5.js"),[]),"/src/articles/blogs/2023-09-14-Xline-Source-Code-Interpretation-(III)--CURP-Server-Implementation/index.md":()=>D(()=>import("./index-277ae463.js"),[]),"/src/articles/blogs/2023-09-28-Bluespec-SytemVerilog-Handshake-Protocol-Interface-Conversion/index.md":()=>D(()=>import("./index-3139538f.js"),[]),"/src/articles/blogs/2023-10-12-Software-and-hardware-co-simulation-l-Overview-of-principles-and-main-components/index.md":()=>D(()=>import("./index-1ec93936.js"),[]),"/src/articles/blogs/2023-10-19-Xline-Source-Code-Interpretation-(IV)-CURP-state-machine-engine/index.md":()=>D(()=>import("./index-6618c0b5.js"),[]),"/src/articles/blogs/2023-10-26-Application-of-data-flow-programming-in-hardware-design/index.md":()=>D(()=>import("./index-a27a1569.js"),[]),"/src/articles/blogs/2023-11-02-blue-ethernet-High-Performance-FPGA-Network-Packet-Processing-Project-Details/index.md":()=>D(()=>import("./index-0c28844a.js"),[]),"/src/articles/blogs/2023-11-23-Xline-v0.6.0:-a-distributed-KV-store-for-metadata-management/index.md":()=>D(()=>import("./index-b73b42f4.js"),[])}),hw=Object.assign({"/src/articles/events/2022-05-17-RDMA-Software-Interface-High-Level-Package/index.md":()=>D(()=>import("./index-a84bdbd8.js"),[]),"/src/articles/events/2022-08-04-When-RDMA-meets-Rust/index.md":()=>D(()=>import("./index-c832920a.js"),[]),"/src/articles/events/2022-08-23-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>D(()=>import("./index-5968a39d.js"),[]),"/src/articles/events/2022-10-11-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>D(()=>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":()=>D(()=>import("./index-b9cc4e07.js"),[]),"/src/articles/events/2022-11-24-The-Rust-China-Hackathon-2022-Datan-Technology-Group-Air-Presentation-is-here/index.md":()=>D(()=>import("./index-cf17c7a4.js"),[]),"/src/articles/events/2022-12-08-SpinalHDL-Application-Prospect-Exploration-Online-Seminar/index.md":()=>D(()=>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":()=>D(()=>import("./index-4b956329.js"),[]),"/src/articles/events/2023-01-06-Datan-Technology-2023-Open-Source-Graduation-Design-Internship-Recruitment/index.md":()=>D(()=>import("./index-b2f220f4.js"),[]),"/src/articles/events/2023-01-12-Welcome-to-join-Datan-Technology-hardware-design-learning-community/index.md":()=>D(()=>import("./index-1179d885.js"),[]),"/src/articles/events/2023-02-01-Consensus-Algorithms-and-Metadata-Management-for-Cross-Data-Center-Consistency/index.md":()=>D(()=>import("./index-5689e7f4.js"),[]),"/src/articles/events/2023-03-31-4.8-Beijing-Rust-Meetup-|-Call-For-Presenters/index.md":()=>D(()=>import("./index-ffd93bc8.js"),[]),"/src/articles/events/2023-04-05-Beijing-Rust-Meetup/index.md":()=>D(()=>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":()=>D(()=>import("./index-3dea6c6a.js"),[]),"/src/articles/events/2023-06-11-Countdown-to-Rust-X-DatenLord-l-Rust-China-Conf-2023/index.md":()=>D(()=>import("./index-0c25eea3.js"),[]),"/src/articles/events/2023-07-03-SpinalHDL-usage-and-development-experience-workshop/index.md":()=>D(()=>import("./index-0b4fd2ad.js"),[]),"/src/articles/events/2023-08-01-Countdown-to-6-days-l-Opportunities-and-Challenges-The-Development-Trend-of-Generative-AI-and-its-Application-on-the-Ground/index.md":()=>D(()=>import("./index-16f06676.js"),[]),"/src/articles/events/2023-08-15-DatenLord-X-Segmentfault-Live-Stream-Preview-l-CURP-Protocol-in-Industrial-Practice/index.md":()=>D(()=>import("./index-b9ee750d.js"),[]),"/src/articles/events/2023-08-20-Upcoming-Events-l-2nd-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>D(()=>import("./index-5f61d62d.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":()=>D(()=>import("./index-a154d453.js"),[]),"/src/articles/events/2023-09-19-MIT-Coursework-Orientation-for-Newcomers/index.md":()=>D(()=>import("./index-65e0a878.js"),[]),"/src/articles/events/2023-11-09-Exploring-the-Future-of-SpinalHDL-Applications-in-2023-Online-Workshop/index.md":()=>D(()=>import("./index-2530d06d.js"),[]),"/src/articles/events/2023-11-17-Ding!-You've-received-a-Hackthon-invitation-from-Dartan-Technologies!/index.md":()=>D(()=>import("./index-28dd2373.js"),[]),"/src/articles/events/2023-12-05-Countdown-to-5-days:-SpinalHDL-application-prospect-exploration-online-seminar/index.md":()=>D(()=>import("./index-1c57aced.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":()=>D(()=>import("./index-b8dbda9f.js"),[]),"/src/articles/events/2023-12-14-MIT-Architecture-Open-Course-Learning-Community-Version-2.0-is-officially-launched~/index.md":()=>D(()=>import("./index-50ad21f0.js"),[]),"/src/articles/events/2024-01-02-Highlights-I-DatenLord-Hackathon-2023-came-to-a-successful-conclusion!/index.md":()=>D(()=>import("./index-1c51c928.js"),[])}),cU=Object.assign({"/src/articles/highlights/2022-07-28-Creatively-fine-tuned-wheels:-RDMA's-Rust-safety-practices/index.md":()=>D(()=>import("./index-37f93c7b.js"),[]),"/src/articles/highlights/2022-08-04-Rust-X-Datenlord:-Review-of-the-Second-China-Rust-Developer-Conference/index.md":()=>D(()=>import("./index-8f0491cb.js"),[]),"/src/articles/highlights/2022-09-08-Discussion-on-Hardware-Agile-Development-and-Verification-Methodology/index.md":()=>D(()=>import("./index-284b9c1c.js"),[]),"/src/articles/highlights/2022-10-20-Rust-Chatterbox:-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>D(()=>import("./index-e7ccea1d.js"),[]),"/src/articles/highlights/2022-12-12-SpinalHDL-Application-Prospect-Exploration-Online-Seminar/index.md":()=>D(()=>import("./index-ffd70994.js"),[]),"/src/articles/highlights/2023-01-12-Rust-China-Hackathon-2022-Datan-Technology-Group/index.md":()=>D(()=>import("./index-354c3565.js"),[]),"/src/articles/highlights/2023-04-13-4.8-Beijing-Rust-Meetup/index.md":()=>D(()=>import("./index-4ada4a0c.js"),[]),"/src/articles/highlights/2023-12-21-Highlights:-2023-SpinalHDL-Application-Prospect-Exploration-Workshop/index.md":()=>D(()=>import("./index-67a528fa.js"),[])}),uU=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":()=>D(()=>import("./index-1f712296.js"),[]),"/src/articles/news-honor-dynamic/2023-03-31-Datan-Technology-Entrepreneurship-is-a-rock-and-roll-in-the-soul/index.md":()=>D(()=>import("./index-012df9e2.js"),[])}),dU=()=>{const e=wt(),t=ti(),{title:r}=gn();N.useEffect(()=>{window.scrollTo(0,0)},[]);const i=(()=>{switch(r){case"blogs":return lU;case"events":return hw;case"highlights":return cU;case"news-honor-dynamic":return uU;default:return hw}})(),[o,a]=N.useState([]),c=async()=>{a(await Promise.all(Object.keys(i).map(d=>i[d]())))};return N.useEffect(()=>{c()},[t.pathname]),l.jsxs(l.Fragment,{children:[l.jsx(yn,{cover:QW,children:r&&qW.get(r)}),l.jsx(ZW,{children:l.jsx(JW,{children:o.reverse().map(({metadata:d,assetURLs:h})=>{const{date:g,title:v,label:x,description:b,author:k,editor:C,location:E,cover:y,tags:w}=d;return l.jsxs(eU,{children:[y&&l.jsx(tU,{src:y&&h[0]}),l.jsxs(rU,{children:[l.jsx(nU,{children:U(g).format("YYYY.M.D")}),l.jsx(iU,{onClick:()=>{e(`${g}-${v.split(" ").join("-")}`)},children:x}),l.jsx(oU,{children:b}),l.jsxs(sU,{children:[k&&l.jsxs(l.Fragment,{children:[l.jsxs(Mh,{children:["嘉宾:",k[0]]}),l.jsx(Lh,{})]}),C&&l.jsxs(l.Fragment,{children:[l.jsxs(Mh,{children:["编辑:",C[0]]}),l.jsx(Lh,{})]}),l.jsxs(Mh,{children:["发表于",E]}),w&&l.jsxs(l.Fragment,{children:[l.jsx(Lh,{}),w.map(S=>l.jsx(aU,{children:S},S))]})]})]})]},v)})})})]})},fU=(e,t)=>{const r=N.useRef({});N.useEffect(()=>{const n=c=>{r.current=c.reduce((g,v)=>(g[v.target.innerHTML]=v,g),r.current);const d=[];Object.keys(r.current).forEach(g=>{const v=r.current[g];v.isIntersecting&&d.push(v)});const h=g=>a.findIndex(v=>v.id===g);if(d.length===1)e(d[0].target.id);else if(d.length>1){const g=d.sort((v,x)=>h(v.target.id)-h(x.target.id));e(g[0].target.id)}},i={rootMargin:"0px 0px -40% 0px"},o=new IntersectionObserver(n,i),a=Array.from(document.querySelectorAll("h2, h3"));return a.forEach(c=>o.observe(c)),()=>o.disconnect()},[t])},hU=f.div``,mU=f.div` +`,cU=Object.assign({"/src/articles/blogs/2022-05-17-Rust-Implementation-of-RDMA/index.md":()=>D(()=>import("./index-8702c933.js"),[]),"/src/articles/blogs/2022-05-27-Crossbeam-Epoch-Algorithm-for-Lock-Free-Programming-in-Rust/index.md":()=>D(()=>import("./index-28c4b418.js"),[]),"/src/articles/blogs/2022-05-27-Managing-RDMA-Memory-in-Rust/index.md":()=>D(()=>import("./index-de3329ad.js"),[]),"/src/articles/blogs/2022-05-27-Memory-Management-for-Lock-Free-Data-Structures-in-the-Rust-Language/index.md":()=>D(()=>import("./index-fe9ae8f0.js"),[]),"/src/articles/blogs/2022-05-27-Rethinking-How-Rust-Async-Enables-High-Performance-IO/index.md":()=>D(()=>import("./index-d81ed83c.js"),[]),"/src/articles/blogs/2022-05-27-Rust-Implementation-of-K8S-Scheduling-Extensions/index.md":()=>D(()=>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":()=>D(()=>import("./index-fd018bec.js"),[]),"/src/articles/blogs/2022-05-27-async-Rust-wraps-UCX-communication-library/index.md":()=>D(()=>import("./index-8c82e7c7.js"),[]),"/src/articles/blogs/2022-05-27-io_uring-Rust-Asynchronous-Library-Implementation/index.md":()=>D(()=>import("./index-e7093119.js"),[]),"/src/articles/blogs/2022-06-11-Computer-Architecture-l-MIT-Training-Q&A-and-Tips/index.md":()=>D(()=>import("./index-ddfbefca.js"),[]),"/src/articles/blogs/2022-06-15-Etcd-client-cache-practice/index.md":()=>D(()=>import("./index-bfe04780.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-and-lock-free-programming-(1)/index.md":()=>D(()=>import("./index-147df4a9.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-in-lock-free-programming-scenarios-(2)/index.md":()=>D(()=>import("./index-b51a8ea2.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(1)/index.md":()=>D(()=>import("./index-5dd90a8c.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(2)/index.md":()=>D(()=>import("./index-426f092b.js"),[]),"/src/articles/blogs/2022-06-15-Using-BPF-to-implement-user-mode-tracing/index.md":()=>D(()=>import("./index-06215d3e.js"),[]),"/src/articles/blogs/2022-06-24-Why-should-a-startup-choose-Rust-for-an-RDMA-library/index.md":()=>D(()=>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":()=>D(()=>import("./index-aa8ef45e.js"),[]),"/src/articles/blogs/2022-07-07-Rethinking-of-the-Curp-Consensus-Protocol/index.md":()=>D(()=>import("./index-c719bd5c.js"),[]),"/src/articles/blogs/2022-08-11-DatenLord-|-Xline-Geo-distributed-KV-Storage/index.md":()=>D(()=>import("./index-9cd4971b.js"),[]),"/src/articles/blogs/2022-10-11-Rust-Chat-Room:-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>D(()=>import("./index-38e8d7df.js"),[]),"/src/articles/blogs/2022-10-20-Wonderful-review-l-Rust-chat-room:-Xline-cross-data-center-consistency-management/index.md":()=>D(()=>import("./index-fa30bf44.js"),[]),"/src/articles/blogs/2022-12-15-Distributed-state-machine-consensus-protocol-Copilot/index.md":()=>D(()=>import("./index-24694c1f.js"),[]),"/src/articles/blogs/2023-01-19-From-Cloud-Computing-to-Sky-Computing-(1)/index.md":()=>D(()=>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":()=>D(()=>import("./index-4270ced0.js"),[]),"/src/articles/blogs/2023-02-16-Database-isolation-level-and-MVCC/index.md":()=>D(()=>import("./index-1dde53bb.js"),[]),"/src/articles/blogs/2023-02-16-Xline-v0.2.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>D(()=>import("./index-9cbd4195.js"),[]),"/src/articles/blogs/2023-03-02-Thinking-about-programs-mathematically-and-verifying-correctness/index.md":()=>D(()=>import("./index-b28c82c1.js"),[]),"/src/articles/blogs/2023-03-23-Xline-v0.3.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>D(()=>import("./index-72b88898.js"),[]),"/src/articles/blogs/2023-04-20-How-to-elegantly-organize-asynchronous-code-in-a-Rust-project/index.md":()=>D(()=>import("./index-7582b288.js"),[]),"/src/articles/blogs/2023-04-24-DatenLord-open-source-product-technology-sharing-l-Xline-source-code-interpretation/index.md":()=>D(()=>import("./index-015cf939.js"),[]),"/src/articles/blogs/2023-05-11-Xline-v0.4.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>D(()=>import("./index-494dac65.js"),[]),"/src/articles/blogs/2023-05-17-Computer-Architecture|MIT6.175-and-MIT6.375-Study-Notes/index.md":()=>D(()=>import("./index-38c14a45.js"),[]),"/src/articles/blogs/2023-05-25-Xline-Persistent-Storage-Design-and-Implementation/index.md":()=>D(()=>import("./index-86e42443.js"),[]),"/src/articles/blogs/2023-06-01-From-Cloud-Computing-to-Sky-Computing-(2)/index.md":()=>D(()=>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":()=>D(()=>import("./index-a8e1cc23.js"),[]),"/src/articles/blogs/2023-06-21-Xline-v0.4.1:-A-distributed-KV-store-for-metadata-management/index.md":()=>D(()=>import("./index-148365b0.js"),[]),"/src/articles/blogs/2023-07-13-Interpretation-of-Xline-source-code-(1)——Introduction-to-CURP-protocol/index.md":()=>D(()=>import("./index-90047cd2.js"),[]),"/src/articles/blogs/2023-07-20-Xline-Source-Code-Interpretation-(II)-Lease-Mechanism-and-Implementation/index.md":()=>D(()=>import("./index-0074c42d.js"),[]),"/src/articles/blogs/2023-07-27-BSV-based-high-performance-parallel-CRC-hardware-circuit-generator/index.md":()=>D(()=>import("./index-aaba7b29.js"),[]),"/src/articles/blogs/2023-08-15-Xline-v0.5.0-a-distributed-KV-store-for-metadata-management/index.md":()=>D(()=>import("./index-7a7fbe77.js"),[]),"/src/articles/blogs/2023-08-31-Fountain-Code/index.md":()=>D(()=>import("./index-bccae718.js"),[]),"/src/articles/blogs/2023-09-14-Xline-Source-Code-Interpretation-(III)--CURP-Server-Implementation/index.md":()=>D(()=>import("./index-277ae463.js"),[]),"/src/articles/blogs/2023-09-28-Bluespec-SytemVerilog-Handshake-Protocol-Interface-Conversion/index.md":()=>D(()=>import("./index-3139538f.js"),[]),"/src/articles/blogs/2023-10-12-Software-and-hardware-co-simulation-l-Overview-of-principles-and-main-components/index.md":()=>D(()=>import("./index-1ec93936.js"),[]),"/src/articles/blogs/2023-10-19-Xline-Source-Code-Interpretation-(IV)-CURP-state-machine-engine/index.md":()=>D(()=>import("./index-6618c0b5.js"),[]),"/src/articles/blogs/2023-10-26-Application-of-data-flow-programming-in-hardware-design/index.md":()=>D(()=>import("./index-4c405f89.js"),[]),"/src/articles/blogs/2023-11-02-blue-ethernet-High-Performance-FPGA-Network-Packet-Processing-Project-Details/index.md":()=>D(()=>import("./index-b21d7686.js"),[]),"/src/articles/blogs/2023-11-23-Xline-v0.6.0:-a-distributed-KV-store-for-metadata-management/index.md":()=>D(()=>import("./index-b73b42f4.js"),[]),"/src/articles/blogs/2023-12-28-Xline-command-de-duplication-mechanism-(I)-Introduction-to-RIFL/index.md":()=>D(()=>import("./index-1b00c887.js"),[])}),hw=Object.assign({"/src/articles/events/2022-05-17-RDMA-Software-Interface-High-Level-Package/index.md":()=>D(()=>import("./index-a84bdbd8.js"),[]),"/src/articles/events/2022-08-04-When-RDMA-meets-Rust/index.md":()=>D(()=>import("./index-c832920a.js"),[]),"/src/articles/events/2022-08-23-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>D(()=>import("./index-5968a39d.js"),[]),"/src/articles/events/2022-10-11-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>D(()=>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":()=>D(()=>import("./index-b9cc4e07.js"),[]),"/src/articles/events/2022-11-24-The-Rust-China-Hackathon-2022-Datan-Technology-Group-Air-Presentation-is-here/index.md":()=>D(()=>import("./index-cf17c7a4.js"),[]),"/src/articles/events/2022-12-08-SpinalHDL-Application-Prospect-Exploration-Online-Seminar/index.md":()=>D(()=>import("./index-a9e0a78f.js"),[]),"/src/articles/events/2022-12-08-Welcome-to-sign-up-for-the-Rust-China-Hackathon-2022-Datan-Technology-Group/index.md":()=>D(()=>import("./index-4b956329.js"),[]),"/src/articles/events/2023-01-06-Datan-Technology-2023-Open-Source-Graduation-Design-Internship-Recruitment/index.md":()=>D(()=>import("./index-d735fd77.js"),[]),"/src/articles/events/2023-01-12-Welcome-to-join-Datan-Technology-hardware-design-learning-community/index.md":()=>D(()=>import("./index-4e03f569.js"),[]),"/src/articles/events/2023-02-01-Consensus-Algorithms-and-Metadata-Management-for-Cross-Data-Center-Consistency/index.md":()=>D(()=>import("./index-5689e7f4.js"),[]),"/src/articles/events/2023-03-31-4.8-Beijing-Rust-Meetup-|-Call-For-Presenters/index.md":()=>D(()=>import("./index-a1a1a279.js"),[]),"/src/articles/events/2023-04-05-Beijing-Rust-Meetup/index.md":()=>D(()=>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":()=>D(()=>import("./index-3dea6c6a.js"),[]),"/src/articles/events/2023-06-11-Countdown-to-Rust-X-DatenLord-l-Rust-China-Conf-2023/index.md":()=>D(()=>import("./index-0c25eea3.js"),[]),"/src/articles/events/2023-07-03-SpinalHDL-usage-and-development-experience-workshop/index.md":()=>D(()=>import("./index-cc44974b.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":()=>D(()=>import("./index-4d1333f2.js"),[]),"/src/articles/events/2023-08-15-DatenLord-X-Segmentfault-Live-Stream-Preview-l-CURP-Protocol-in-Industrial-Practice/index.md":()=>D(()=>import("./index-20f01f19.js"),[]),"/src/articles/events/2023-08-20-Upcoming-Events-l-2nd-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>D(()=>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":()=>D(()=>import("./index-696ef44a.js"),[]),"/src/articles/events/2023-09-19-MIT-Coursework-Orientation-for-Newcomers/index.md":()=>D(()=>import("./index-5fa4b651.js"),[]),"/src/articles/events/2023-11-09-Exploring-the-Future-of-SpinalHDL-Applications-in-2023-Online-Workshop/index.md":()=>D(()=>import("./index-dfd283a0.js"),[]),"/src/articles/events/2023-11-17-Ding!-You've-received-a-Hackthon-invitation-from-Dartan-Technologies!/index.md":()=>D(()=>import("./index-69ce89cf.js"),[]),"/src/articles/events/2023-12-05-Countdown-to-5-days:-SpinalHDL-application-prospect-exploration-online-seminar/index.md":()=>D(()=>import("./index-ef7b41da.js"),[]),"/src/articles/events/2023-12-05-Ding!-2023-hackathon-tips-fresh-from-the-oven!-Last-week-to-sign-up-before-it's-too-late!/index.md":()=>D(()=>import("./index-b8dbda9f.js"),[]),"/src/articles/events/2023-12-14-MIT-Architecture-Open-Course-Learning-Community-Version-2.0-is-officially-launched~/index.md":()=>D(()=>import("./index-1061b5bb.js"),[]),"/src/articles/events/2024-01-02-Highlights-I-DatenLord-Hackathon-2023-came-to-a-successful-conclusion!/index.md":()=>D(()=>import("./index-1c51c928.js"),[])}),uU=Object.assign({"/src/articles/highlights/2022-07-28-Creatively-fine-tuned-wheels:-RDMA's-Rust-safety-practices/index.md":()=>D(()=>import("./index-37f93c7b.js"),[]),"/src/articles/highlights/2022-08-04-Rust-X-Datenlord:-Review-of-the-Second-China-Rust-Developer-Conference/index.md":()=>D(()=>import("./index-8f0491cb.js"),[]),"/src/articles/highlights/2022-09-08-Discussion-on-Hardware-Agile-Development-and-Verification-Methodology/index.md":()=>D(()=>import("./index-28c77317.js"),[]),"/src/articles/highlights/2022-10-20-Rust-Chatterbox:-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>D(()=>import("./index-eb1ecfd7.js"),[]),"/src/articles/highlights/2022-12-12-SpinalHDL-Application-Prospect-Exploration-Online-Seminar/index.md":()=>D(()=>import("./index-3b5176dc.js"),[]),"/src/articles/highlights/2023-01-12-Rust-China-Hackathon-2022-Datan-Technology-Group/index.md":()=>D(()=>import("./index-354c3565.js"),[]),"/src/articles/highlights/2023-04-13-4.8-Beijing-Rust-Meetup/index.md":()=>D(()=>import("./index-4ada4a0c.js"),[]),"/src/articles/highlights/2023-12-21-Highlights:-2023-SpinalHDL-Application-Prospect-Exploration-Workshop/index.md":()=>D(()=>import("./index-67a528fa.js"),[])}),dU=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":()=>D(()=>import("./index-d758c903.js"),[]),"/src/articles/news-honor-dynamic/2023-03-31-Datan-Technology-Entrepreneurship-is-a-rock-and-roll-in-the-soul/index.md":()=>D(()=>import("./index-012df9e2.js"),[])}),fU=()=>{const e=wt(),t=ti(),{title:r}=gn();N.useEffect(()=>{window.scrollTo(0,0)},[]);const i=(()=>{switch(r){case"blogs":return cU;case"events":return hw;case"highlights":return uU;case"news-honor-dynamic":return dU;default:return hw}})(),[o,a]=N.useState([]),c=async()=>{a(await Promise.all(Object.keys(i).map(d=>i[d]())))};return N.useEffect(()=>{c()},[t.pathname]),l.jsxs(l.Fragment,{children:[l.jsx(yn,{cover:qW,children:r&&ZW.get(r)}),l.jsx(JW,{children:l.jsx(eU,{children:o.reverse().map(({metadata:d,assetURLs:h})=>{const{date:g,title:v,label:x,description:b,author:k,editor:C,location:E,cover:y,tags:w}=d;return l.jsxs(tU,{children:[y&&l.jsx(rU,{src:y&&h[0]}),l.jsxs(nU,{children:[l.jsx(iU,{children:U(g).format("YYYY.M.D")}),l.jsx(oU,{onClick:()=>{e(`${g}-${v.split(" ").join("-")}`)},children:x}),l.jsx(sU,{children:b}),l.jsxs(aU,{children:[k&&l.jsxs(l.Fragment,{children:[l.jsxs(Mh,{children:["嘉宾:",k[0]]}),l.jsx(Lh,{})]}),C&&l.jsxs(l.Fragment,{children:[l.jsxs(Mh,{children:["编辑:",C[0]]}),l.jsx(Lh,{})]}),l.jsxs(Mh,{children:["发表于",E]}),w&&l.jsxs(l.Fragment,{children:[l.jsx(Lh,{}),w.map(S=>l.jsx(lU,{children:S},S))]})]})]})]},v)})})})]})},hU=(e,t)=>{const r=N.useRef({});N.useEffect(()=>{const n=c=>{r.current=c.reduce((g,v)=>(g[v.target.innerHTML]=v,g),r.current);const d=[];Object.keys(r.current).forEach(g=>{const v=r.current[g];v.isIntersecting&&d.push(v)});const h=g=>a.findIndex(v=>v.id===g);if(d.length===1)e(d[0].target.id);else if(d.length>1){const g=d.sort((v,x)=>h(v.target.id)-h(x.target.id));e(g[0].target.id)}},i={rootMargin:"0px 0px -40% 0px"},o=new IntersectionObserver(n,i),a=Array.from(document.querySelectorAll("h2, h3"));return a.forEach(c=>o.observe(c)),()=>o.disconnect()},[t])},mU=f.div``,pU=f.div` display: flex; max-width: 1440px; margin-inline: auto; padding-block: 0.64rem; padding-inline: 1.22rem; padding-top: 1.2rem; -`,pU=f.div` +`,gU=f.div` flex-grow: 1; padding-inline: 0.64rem; -`,gU=f.h1` +`,vU=f.h1` margin-bottom: 0.96rem; color: #1e1e1e; font-size: 0.4rem; line-height: 0.48rem; font-weight: 600; -`,vU=f.div` +`,yU=f.div` background: #fff; border-radius: 0.08rem; -`,yU=f.div` +`,wU=f.div` flex-shrink: 0; width: 300px; -`,wU=f.div` +`,_U=f.div` position: sticky; top: 1.2rem; left: 0; @@ -2204,7 +2204,7 @@ U.version="2.29.4";QY(Xe);U.fn=V;U.min=NV;U.max=$V;U.now=zV;U.utc=wn;U.unix=hW;U border-radius: 0.08rem; max-height: 60vh; overflow-y: scroll; -`,_U=f.div` +`,xU=f.div` display: block; margin-block: 0.16rem; padding-left: ${({level:e})=>e===3?"48px":"16px"}; @@ -2214,14 +2214,14 @@ U.version="2.29.4";QY(Xe);U.fn=V;U.min=NV;U.max=$V;U.now=zV;U.utc=wn;U.unix=hW;U font-size: 0.18rem; line-height: 1.5; cursor: pointer; -`,xU=Object.assign({"/src/articles/blogs/2022-05-17-Rust-Implementation-of-RDMA/index.md":()=>D(()=>import("./index-8702c933.js"),[]),"/src/articles/blogs/2022-05-27-Crossbeam-Epoch-Algorithm-for-Lock-Free-Programming-in-Rust/index.md":()=>D(()=>import("./index-28c4b418.js"),[]),"/src/articles/blogs/2022-05-27-Managing-RDMA-Memory-in-Rust/index.md":()=>D(()=>import("./index-de3329ad.js"),[]),"/src/articles/blogs/2022-05-27-Memory-Management-for-Lock-Free-Data-Structures-in-the-Rust-Language/index.md":()=>D(()=>import("./index-fe9ae8f0.js"),[]),"/src/articles/blogs/2022-05-27-Rethinking-How-Rust-Async-Enables-High-Performance-IO/index.md":()=>D(()=>import("./index-d81ed83c.js"),[]),"/src/articles/blogs/2022-05-27-Rust-Implementation-of-K8S-Scheduling-Extensions/index.md":()=>D(()=>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":()=>D(()=>import("./index-fd018bec.js"),[]),"/src/articles/blogs/2022-05-27-async-Rust-wraps-UCX-communication-library/index.md":()=>D(()=>import("./index-8c82e7c7.js"),[]),"/src/articles/blogs/2022-05-27-io_uring-Rust-Asynchronous-Library-Implementation/index.md":()=>D(()=>import("./index-e7093119.js"),[]),"/src/articles/blogs/2022-06-11-Computer-Architecture-l-MIT-Training-Q&A-and-Tips/index.md":()=>D(()=>import("./index-29c0b7ce.js"),[]),"/src/articles/blogs/2022-06-15-Etcd-client-cache-practice/index.md":()=>D(()=>import("./index-bfe04780.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-and-lock-free-programming-(1)/index.md":()=>D(()=>import("./index-147df4a9.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-in-lock-free-programming-scenarios-(2)/index.md":()=>D(()=>import("./index-b51a8ea2.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(1)/index.md":()=>D(()=>import("./index-5dd90a8c.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(2)/index.md":()=>D(()=>import("./index-426f092b.js"),[]),"/src/articles/blogs/2022-06-15-Using-BPF-to-implement-user-mode-tracing/index.md":()=>D(()=>import("./index-06215d3e.js"),[]),"/src/articles/blogs/2022-06-24-Why-should-a-startup-choose-Rust-for-an-RDMA-library/index.md":()=>D(()=>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":()=>D(()=>import("./index-2ee8a4ba.js"),[]),"/src/articles/blogs/2022-07-07-Rethinking-of-the-Curp-Consensus-Protocol/index.md":()=>D(()=>import("./index-f6eeef5e.js"),[]),"/src/articles/blogs/2022-08-11-DatenLord-|-Xline-Geo-distributed-KV-Storage/index.md":()=>D(()=>import("./index-9cd4971b.js"),[]),"/src/articles/blogs/2022-10-11-Rust-Chat-Room:-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>D(()=>import("./index-0bd243e2.js"),[]),"/src/articles/blogs/2022-10-20-Wonderful-review-l-Rust-chat-room:-Xline-cross-data-center-consistency-management/index.md":()=>D(()=>import("./index-fa30bf44.js"),[]),"/src/articles/blogs/2022-12-15-Distributed-state-machine-consensus-protocol-Copilot/index.md":()=>D(()=>import("./index-24694c1f.js"),[]),"/src/articles/blogs/2023-01-19-From-Cloud-Computing-to-Sky-Computing-(1)/index.md":()=>D(()=>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":()=>D(()=>import("./index-39390118.js"),[]),"/src/articles/blogs/2023-02-16-Database-isolation-level-and-MVCC/index.md":()=>D(()=>import("./index-1dde53bb.js"),[]),"/src/articles/blogs/2023-02-16-Xline-v0.2.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>D(()=>import("./index-6f20c5b7.js"),[]),"/src/articles/blogs/2023-03-02-Thinking-about-programs-mathematically-and-verifying-correctness/index.md":()=>D(()=>import("./index-82a24597.js"),[]),"/src/articles/blogs/2023-03-23-Xline-v0.3.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>D(()=>import("./index-72b88898.js"),[]),"/src/articles/blogs/2023-04-20-How-to-elegantly-organize-asynchronous-code-in-a-Rust-project/index.md":()=>D(()=>import("./index-7582b288.js"),[]),"/src/articles/blogs/2023-04-24-DatenLord-open-source-product-technology-sharing-l-Xline-source-code-interpretation/index.md":()=>D(()=>import("./index-015cf939.js"),[]),"/src/articles/blogs/2023-05-11-Xline-v0.4.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>D(()=>import("./index-1e192479.js"),[]),"/src/articles/blogs/2023-05-17-Computer-Architecture|MIT6.175-and-MIT6.375-Study-Notes/index.md":()=>D(()=>import("./index-e6f44fee.js"),[]),"/src/articles/blogs/2023-05-25-Xline-Persistent-Storage-Design-and-Implementation/index.md":()=>D(()=>import("./index-90593fbc.js"),[]),"/src/articles/blogs/2023-06-01-From-Cloud-Computing-to-Sky-Computing-(2)/index.md":()=>D(()=>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":()=>D(()=>import("./index-a8e1cc23.js"),[]),"/src/articles/blogs/2023-06-21-Xline-v0.4.1:-A-distributed-KV-store-for-metadata-management/index.md":()=>D(()=>import("./index-148365b0.js"),[]),"/src/articles/blogs/2023-07-13-Interpretation-of-Xline-source-code-(1)——Introduction-to-CURP-protocol/index.md":()=>D(()=>import("./index-5076d4ea.js"),[]),"/src/articles/blogs/2023-07-20-Xline-Source-Code-Interpretation-(II)-Lease-Mechanism-and-Implementation/index.md":()=>D(()=>import("./index-0074c42d.js"),[]),"/src/articles/blogs/2023-07-27-BSV-based-high-performance-parallel-CRC-hardware-circuit-generator/index.md":()=>D(()=>import("./index-dcc07e36.js"),[]),"/src/articles/blogs/2023-08-15-Xline-v0.5.0-a-distributed-KV-store-for-metadata-management/index.md":()=>D(()=>import("./index-7a7fbe77.js"),[]),"/src/articles/blogs/2023-08-31-Fountain-Code/index.md":()=>D(()=>import("./index-0850e6f5.js"),[]),"/src/articles/blogs/2023-09-14-Xline-Source-Code-Interpretation-(III)--CURP-Server-Implementation/index.md":()=>D(()=>import("./index-277ae463.js"),[]),"/src/articles/blogs/2023-09-28-Bluespec-SytemVerilog-Handshake-Protocol-Interface-Conversion/index.md":()=>D(()=>import("./index-3139538f.js"),[]),"/src/articles/blogs/2023-10-12-Software-and-hardware-co-simulation-l-Overview-of-principles-and-main-components/index.md":()=>D(()=>import("./index-1ec93936.js"),[]),"/src/articles/blogs/2023-10-19-Xline-Source-Code-Interpretation-(IV)-CURP-state-machine-engine/index.md":()=>D(()=>import("./index-6618c0b5.js"),[]),"/src/articles/blogs/2023-10-26-Application-of-data-flow-programming-in-hardware-design/index.md":()=>D(()=>import("./index-a27a1569.js"),[]),"/src/articles/blogs/2023-11-02-blue-ethernet-High-Performance-FPGA-Network-Packet-Processing-Project-Details/index.md":()=>D(()=>import("./index-0c28844a.js"),[]),"/src/articles/blogs/2023-11-23-Xline-v0.6.0:-a-distributed-KV-store-for-metadata-management/index.md":()=>D(()=>import("./index-b73b42f4.js"),[])}),SU=Object.assign({"/src/articles/events/2022-05-17-RDMA-Software-Interface-High-Level-Package/index.md":()=>D(()=>import("./index-a84bdbd8.js"),[]),"/src/articles/events/2022-08-04-When-RDMA-meets-Rust/index.md":()=>D(()=>import("./index-c832920a.js"),[]),"/src/articles/events/2022-08-23-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>D(()=>import("./index-5968a39d.js"),[]),"/src/articles/events/2022-10-11-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>D(()=>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":()=>D(()=>import("./index-b9cc4e07.js"),[]),"/src/articles/events/2022-11-24-The-Rust-China-Hackathon-2022-Datan-Technology-Group-Air-Presentation-is-here/index.md":()=>D(()=>import("./index-cf17c7a4.js"),[]),"/src/articles/events/2022-12-08-SpinalHDL-Application-Prospect-Exploration-Online-Seminar/index.md":()=>D(()=>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":()=>D(()=>import("./index-4b956329.js"),[]),"/src/articles/events/2023-01-06-Datan-Technology-2023-Open-Source-Graduation-Design-Internship-Recruitment/index.md":()=>D(()=>import("./index-b2f220f4.js"),[]),"/src/articles/events/2023-01-12-Welcome-to-join-Datan-Technology-hardware-design-learning-community/index.md":()=>D(()=>import("./index-1179d885.js"),[]),"/src/articles/events/2023-02-01-Consensus-Algorithms-and-Metadata-Management-for-Cross-Data-Center-Consistency/index.md":()=>D(()=>import("./index-5689e7f4.js"),[]),"/src/articles/events/2023-03-31-4.8-Beijing-Rust-Meetup-|-Call-For-Presenters/index.md":()=>D(()=>import("./index-ffd93bc8.js"),[]),"/src/articles/events/2023-04-05-Beijing-Rust-Meetup/index.md":()=>D(()=>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":()=>D(()=>import("./index-3dea6c6a.js"),[]),"/src/articles/events/2023-06-11-Countdown-to-Rust-X-DatenLord-l-Rust-China-Conf-2023/index.md":()=>D(()=>import("./index-0c25eea3.js"),[]),"/src/articles/events/2023-07-03-SpinalHDL-usage-and-development-experience-workshop/index.md":()=>D(()=>import("./index-0b4fd2ad.js"),[]),"/src/articles/events/2023-08-01-Countdown-to-6-days-l-Opportunities-and-Challenges-The-Development-Trend-of-Generative-AI-and-its-Application-on-the-Ground/index.md":()=>D(()=>import("./index-16f06676.js"),[]),"/src/articles/events/2023-08-15-DatenLord-X-Segmentfault-Live-Stream-Preview-l-CURP-Protocol-in-Industrial-Practice/index.md":()=>D(()=>import("./index-b9ee750d.js"),[]),"/src/articles/events/2023-08-20-Upcoming-Events-l-2nd-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>D(()=>import("./index-5f61d62d.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":()=>D(()=>import("./index-a154d453.js"),[]),"/src/articles/events/2023-09-19-MIT-Coursework-Orientation-for-Newcomers/index.md":()=>D(()=>import("./index-65e0a878.js"),[]),"/src/articles/events/2023-11-09-Exploring-the-Future-of-SpinalHDL-Applications-in-2023-Online-Workshop/index.md":()=>D(()=>import("./index-2530d06d.js"),[]),"/src/articles/events/2023-11-17-Ding!-You've-received-a-Hackthon-invitation-from-Dartan-Technologies!/index.md":()=>D(()=>import("./index-28dd2373.js"),[]),"/src/articles/events/2023-12-05-Countdown-to-5-days:-SpinalHDL-application-prospect-exploration-online-seminar/index.md":()=>D(()=>import("./index-1c57aced.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":()=>D(()=>import("./index-b8dbda9f.js"),[]),"/src/articles/events/2023-12-14-MIT-Architecture-Open-Course-Learning-Community-Version-2.0-is-officially-launched~/index.md":()=>D(()=>import("./index-50ad21f0.js"),[]),"/src/articles/events/2024-01-02-Highlights-I-DatenLord-Hackathon-2023-came-to-a-successful-conclusion!/index.md":()=>D(()=>import("./index-1c51c928.js"),[])}),bU=Object.assign({"/src/articles/highlights/2022-07-28-Creatively-fine-tuned-wheels:-RDMA's-Rust-safety-practices/index.md":()=>D(()=>import("./index-37f93c7b.js"),[]),"/src/articles/highlights/2022-08-04-Rust-X-Datenlord:-Review-of-the-Second-China-Rust-Developer-Conference/index.md":()=>D(()=>import("./index-8f0491cb.js"),[]),"/src/articles/highlights/2022-09-08-Discussion-on-Hardware-Agile-Development-and-Verification-Methodology/index.md":()=>D(()=>import("./index-284b9c1c.js"),[]),"/src/articles/highlights/2022-10-20-Rust-Chatterbox:-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>D(()=>import("./index-e7ccea1d.js"),[]),"/src/articles/highlights/2022-12-12-SpinalHDL-Application-Prospect-Exploration-Online-Seminar/index.md":()=>D(()=>import("./index-ffd70994.js"),[]),"/src/articles/highlights/2023-01-12-Rust-China-Hackathon-2022-Datan-Technology-Group/index.md":()=>D(()=>import("./index-354c3565.js"),[]),"/src/articles/highlights/2023-04-13-4.8-Beijing-Rust-Meetup/index.md":()=>D(()=>import("./index-4ada4a0c.js"),[]),"/src/articles/highlights/2023-12-21-Highlights:-2023-SpinalHDL-Application-Prospect-Exploration-Workshop/index.md":()=>D(()=>import("./index-67a528fa.js"),[])}),kU=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":()=>D(()=>import("./index-1f712296.js"),[]),"/src/articles/news-honor-dynamic/2023-03-31-Datan-Technology-Entrepreneurship-is-a-rock-and-roll-in-the-soul/index.md":()=>D(()=>import("./index-012df9e2.js"),[])}),CU=()=>{const{section:e,title:t}=gn(),[r,n]=N.useState(),[i,o]=N.useState("");fU(o,r);const a=async()=>{console.log(`/src/articles/${e}/${t}/index.md`);const h=await(async()=>{switch(e){case"blogs":return await xU[`/src/articles/${e}/${t}/index.md`]();case"events":return await SU[`/src/articles/${e}/${t}/index.md`]();case"highlights":return await bU[`/src/articles/${e}/${t}/index.md`]();case"news-honor-dynamic":return await kU[`/src/articles/${e}/${t}/index.md`]()}})();n(h)};N.useEffect(()=>{console.log(r)},[]),N.useEffect(()=>{a(),window.scrollTo(0,0)},[]);const c=d=>{var h;(h=document.querySelector(`#${d}`))==null||h.scrollIntoView({})};return l.jsx(hU,{children:l.jsxs(mU,{children:[(r==null?void 0:r.toc.length)!==0&&l.jsx(yU,{children:l.jsx(wU,{children:((r==null?void 0:r.toc)||[]).map(({label:d,level:h})=>{const g=d.split(" ").join("-").toLowerCase();return l.jsx(_U,{level:h,isActive:i===g,onClick:()=>c(g),children:d},d)})})}),l.jsxs(pU,{children:[l.jsx(gU,{children:r==null?void 0:r.metadata.label}),l.jsx(vU,{className:"content",dangerouslySetInnerHTML:{__html:(r==null?void 0:r.default)||""}})]})]})})};function Bb(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={},DU={get exports(){return zu},set exports(e){zu=e}},mw;function EU(){return mw||(mw=1,function(e,t){(function(r,n){e.exports=n()})(Fo,function(){var r;function n(){return r.apply(null,arguments)}function i(s){r=s}function o(s){return s instanceof Array||Object.prototype.toString.call(s)==="[object Array]"}function a(s){return s!=null&&Object.prototype.toString.call(s)==="[object Object]"}function c(s,u){return Object.prototype.hasOwnProperty.call(s,u)}function d(s){if(Object.getOwnPropertyNames)return Object.getOwnPropertyNames(s).length===0;var u;for(u in s)if(c(s,u))return!1;return!0}function h(s){return s===void 0}function g(s){return typeof s=="number"||Object.prototype.toString.call(s)==="[object Number]"}function v(s){return s instanceof Date||Object.prototype.toString.call(s)==="[object Date]"}function x(s,u){var m=[],p,_=s.length;for(p=0;p<_;++p)m.push(u(s[p],p));return m}function b(s,u){for(var m in u)c(u,m)&&(s[m]=u[m]);return c(u,"toString")&&(s.toString=u.toString),c(u,"valueOf")&&(s.valueOf=u.valueOf),s}function k(s,u,m,p){return av(s,u,m,p,!0).utc()}function C(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidEra:null,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1,parsedDateParts:[],era:null,meridiem:null,rfc2822:!1,weekdayMismatch:!1}}function E(s){return s._pf==null&&(s._pf=C()),s._pf}var y;Array.prototype.some?y=Array.prototype.some:y=function(s){var u=Object(this),m=u.length>>>0,p;for(p=0;p0)for(m=0;mD(()=>import("./index-8702c933.js"),[]),"/src/articles/blogs/2022-05-27-Crossbeam-Epoch-Algorithm-for-Lock-Free-Programming-in-Rust/index.md":()=>D(()=>import("./index-28c4b418.js"),[]),"/src/articles/blogs/2022-05-27-Managing-RDMA-Memory-in-Rust/index.md":()=>D(()=>import("./index-de3329ad.js"),[]),"/src/articles/blogs/2022-05-27-Memory-Management-for-Lock-Free-Data-Structures-in-the-Rust-Language/index.md":()=>D(()=>import("./index-fe9ae8f0.js"),[]),"/src/articles/blogs/2022-05-27-Rethinking-How-Rust-Async-Enables-High-Performance-IO/index.md":()=>D(()=>import("./index-d81ed83c.js"),[]),"/src/articles/blogs/2022-05-27-Rust-Implementation-of-K8S-Scheduling-Extensions/index.md":()=>D(()=>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":()=>D(()=>import("./index-fd018bec.js"),[]),"/src/articles/blogs/2022-05-27-async-Rust-wraps-UCX-communication-library/index.md":()=>D(()=>import("./index-8c82e7c7.js"),[]),"/src/articles/blogs/2022-05-27-io_uring-Rust-Asynchronous-Library-Implementation/index.md":()=>D(()=>import("./index-e7093119.js"),[]),"/src/articles/blogs/2022-06-11-Computer-Architecture-l-MIT-Training-Q&A-and-Tips/index.md":()=>D(()=>import("./index-ddfbefca.js"),[]),"/src/articles/blogs/2022-06-15-Etcd-client-cache-practice/index.md":()=>D(()=>import("./index-bfe04780.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-and-lock-free-programming-(1)/index.md":()=>D(()=>import("./index-147df4a9.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-in-lock-free-programming-scenarios-(2)/index.md":()=>D(()=>import("./index-b51a8ea2.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(1)/index.md":()=>D(()=>import("./index-5dd90a8c.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(2)/index.md":()=>D(()=>import("./index-426f092b.js"),[]),"/src/articles/blogs/2022-06-15-Using-BPF-to-implement-user-mode-tracing/index.md":()=>D(()=>import("./index-06215d3e.js"),[]),"/src/articles/blogs/2022-06-24-Why-should-a-startup-choose-Rust-for-an-RDMA-library/index.md":()=>D(()=>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":()=>D(()=>import("./index-aa8ef45e.js"),[]),"/src/articles/blogs/2022-07-07-Rethinking-of-the-Curp-Consensus-Protocol/index.md":()=>D(()=>import("./index-c719bd5c.js"),[]),"/src/articles/blogs/2022-08-11-DatenLord-|-Xline-Geo-distributed-KV-Storage/index.md":()=>D(()=>import("./index-9cd4971b.js"),[]),"/src/articles/blogs/2022-10-11-Rust-Chat-Room:-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>D(()=>import("./index-38e8d7df.js"),[]),"/src/articles/blogs/2022-10-20-Wonderful-review-l-Rust-chat-room:-Xline-cross-data-center-consistency-management/index.md":()=>D(()=>import("./index-fa30bf44.js"),[]),"/src/articles/blogs/2022-12-15-Distributed-state-machine-consensus-protocol-Copilot/index.md":()=>D(()=>import("./index-24694c1f.js"),[]),"/src/articles/blogs/2023-01-19-From-Cloud-Computing-to-Sky-Computing-(1)/index.md":()=>D(()=>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":()=>D(()=>import("./index-4270ced0.js"),[]),"/src/articles/blogs/2023-02-16-Database-isolation-level-and-MVCC/index.md":()=>D(()=>import("./index-1dde53bb.js"),[]),"/src/articles/blogs/2023-02-16-Xline-v0.2.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>D(()=>import("./index-9cbd4195.js"),[]),"/src/articles/blogs/2023-03-02-Thinking-about-programs-mathematically-and-verifying-correctness/index.md":()=>D(()=>import("./index-b28c82c1.js"),[]),"/src/articles/blogs/2023-03-23-Xline-v0.3.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>D(()=>import("./index-72b88898.js"),[]),"/src/articles/blogs/2023-04-20-How-to-elegantly-organize-asynchronous-code-in-a-Rust-project/index.md":()=>D(()=>import("./index-7582b288.js"),[]),"/src/articles/blogs/2023-04-24-DatenLord-open-source-product-technology-sharing-l-Xline-source-code-interpretation/index.md":()=>D(()=>import("./index-015cf939.js"),[]),"/src/articles/blogs/2023-05-11-Xline-v0.4.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>D(()=>import("./index-494dac65.js"),[]),"/src/articles/blogs/2023-05-17-Computer-Architecture|MIT6.175-and-MIT6.375-Study-Notes/index.md":()=>D(()=>import("./index-38c14a45.js"),[]),"/src/articles/blogs/2023-05-25-Xline-Persistent-Storage-Design-and-Implementation/index.md":()=>D(()=>import("./index-86e42443.js"),[]),"/src/articles/blogs/2023-06-01-From-Cloud-Computing-to-Sky-Computing-(2)/index.md":()=>D(()=>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":()=>D(()=>import("./index-a8e1cc23.js"),[]),"/src/articles/blogs/2023-06-21-Xline-v0.4.1:-A-distributed-KV-store-for-metadata-management/index.md":()=>D(()=>import("./index-148365b0.js"),[]),"/src/articles/blogs/2023-07-13-Interpretation-of-Xline-source-code-(1)——Introduction-to-CURP-protocol/index.md":()=>D(()=>import("./index-90047cd2.js"),[]),"/src/articles/blogs/2023-07-20-Xline-Source-Code-Interpretation-(II)-Lease-Mechanism-and-Implementation/index.md":()=>D(()=>import("./index-0074c42d.js"),[]),"/src/articles/blogs/2023-07-27-BSV-based-high-performance-parallel-CRC-hardware-circuit-generator/index.md":()=>D(()=>import("./index-aaba7b29.js"),[]),"/src/articles/blogs/2023-08-15-Xline-v0.5.0-a-distributed-KV-store-for-metadata-management/index.md":()=>D(()=>import("./index-7a7fbe77.js"),[]),"/src/articles/blogs/2023-08-31-Fountain-Code/index.md":()=>D(()=>import("./index-bccae718.js"),[]),"/src/articles/blogs/2023-09-14-Xline-Source-Code-Interpretation-(III)--CURP-Server-Implementation/index.md":()=>D(()=>import("./index-277ae463.js"),[]),"/src/articles/blogs/2023-09-28-Bluespec-SytemVerilog-Handshake-Protocol-Interface-Conversion/index.md":()=>D(()=>import("./index-3139538f.js"),[]),"/src/articles/blogs/2023-10-12-Software-and-hardware-co-simulation-l-Overview-of-principles-and-main-components/index.md":()=>D(()=>import("./index-1ec93936.js"),[]),"/src/articles/blogs/2023-10-19-Xline-Source-Code-Interpretation-(IV)-CURP-state-machine-engine/index.md":()=>D(()=>import("./index-6618c0b5.js"),[]),"/src/articles/blogs/2023-10-26-Application-of-data-flow-programming-in-hardware-design/index.md":()=>D(()=>import("./index-4c405f89.js"),[]),"/src/articles/blogs/2023-11-02-blue-ethernet-High-Performance-FPGA-Network-Packet-Processing-Project-Details/index.md":()=>D(()=>import("./index-b21d7686.js"),[]),"/src/articles/blogs/2023-11-23-Xline-v0.6.0:-a-distributed-KV-store-for-metadata-management/index.md":()=>D(()=>import("./index-b73b42f4.js"),[]),"/src/articles/blogs/2023-12-28-Xline-command-de-duplication-mechanism-(I)-Introduction-to-RIFL/index.md":()=>D(()=>import("./index-1b00c887.js"),[])}),bU=Object.assign({"/src/articles/events/2022-05-17-RDMA-Software-Interface-High-Level-Package/index.md":()=>D(()=>import("./index-a84bdbd8.js"),[]),"/src/articles/events/2022-08-04-When-RDMA-meets-Rust/index.md":()=>D(()=>import("./index-c832920a.js"),[]),"/src/articles/events/2022-08-23-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>D(()=>import("./index-5968a39d.js"),[]),"/src/articles/events/2022-10-11-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>D(()=>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":()=>D(()=>import("./index-b9cc4e07.js"),[]),"/src/articles/events/2022-11-24-The-Rust-China-Hackathon-2022-Datan-Technology-Group-Air-Presentation-is-here/index.md":()=>D(()=>import("./index-cf17c7a4.js"),[]),"/src/articles/events/2022-12-08-SpinalHDL-Application-Prospect-Exploration-Online-Seminar/index.md":()=>D(()=>import("./index-a9e0a78f.js"),[]),"/src/articles/events/2022-12-08-Welcome-to-sign-up-for-the-Rust-China-Hackathon-2022-Datan-Technology-Group/index.md":()=>D(()=>import("./index-4b956329.js"),[]),"/src/articles/events/2023-01-06-Datan-Technology-2023-Open-Source-Graduation-Design-Internship-Recruitment/index.md":()=>D(()=>import("./index-d735fd77.js"),[]),"/src/articles/events/2023-01-12-Welcome-to-join-Datan-Technology-hardware-design-learning-community/index.md":()=>D(()=>import("./index-4e03f569.js"),[]),"/src/articles/events/2023-02-01-Consensus-Algorithms-and-Metadata-Management-for-Cross-Data-Center-Consistency/index.md":()=>D(()=>import("./index-5689e7f4.js"),[]),"/src/articles/events/2023-03-31-4.8-Beijing-Rust-Meetup-|-Call-For-Presenters/index.md":()=>D(()=>import("./index-a1a1a279.js"),[]),"/src/articles/events/2023-04-05-Beijing-Rust-Meetup/index.md":()=>D(()=>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":()=>D(()=>import("./index-3dea6c6a.js"),[]),"/src/articles/events/2023-06-11-Countdown-to-Rust-X-DatenLord-l-Rust-China-Conf-2023/index.md":()=>D(()=>import("./index-0c25eea3.js"),[]),"/src/articles/events/2023-07-03-SpinalHDL-usage-and-development-experience-workshop/index.md":()=>D(()=>import("./index-cc44974b.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":()=>D(()=>import("./index-4d1333f2.js"),[]),"/src/articles/events/2023-08-15-DatenLord-X-Segmentfault-Live-Stream-Preview-l-CURP-Protocol-in-Industrial-Practice/index.md":()=>D(()=>import("./index-20f01f19.js"),[]),"/src/articles/events/2023-08-20-Upcoming-Events-l-2nd-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>D(()=>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":()=>D(()=>import("./index-696ef44a.js"),[]),"/src/articles/events/2023-09-19-MIT-Coursework-Orientation-for-Newcomers/index.md":()=>D(()=>import("./index-5fa4b651.js"),[]),"/src/articles/events/2023-11-09-Exploring-the-Future-of-SpinalHDL-Applications-in-2023-Online-Workshop/index.md":()=>D(()=>import("./index-dfd283a0.js"),[]),"/src/articles/events/2023-11-17-Ding!-You've-received-a-Hackthon-invitation-from-Dartan-Technologies!/index.md":()=>D(()=>import("./index-69ce89cf.js"),[]),"/src/articles/events/2023-12-05-Countdown-to-5-days:-SpinalHDL-application-prospect-exploration-online-seminar/index.md":()=>D(()=>import("./index-ef7b41da.js"),[]),"/src/articles/events/2023-12-05-Ding!-2023-hackathon-tips-fresh-from-the-oven!-Last-week-to-sign-up-before-it's-too-late!/index.md":()=>D(()=>import("./index-b8dbda9f.js"),[]),"/src/articles/events/2023-12-14-MIT-Architecture-Open-Course-Learning-Community-Version-2.0-is-officially-launched~/index.md":()=>D(()=>import("./index-1061b5bb.js"),[]),"/src/articles/events/2024-01-02-Highlights-I-DatenLord-Hackathon-2023-came-to-a-successful-conclusion!/index.md":()=>D(()=>import("./index-1c51c928.js"),[])}),kU=Object.assign({"/src/articles/highlights/2022-07-28-Creatively-fine-tuned-wheels:-RDMA's-Rust-safety-practices/index.md":()=>D(()=>import("./index-37f93c7b.js"),[]),"/src/articles/highlights/2022-08-04-Rust-X-Datenlord:-Review-of-the-Second-China-Rust-Developer-Conference/index.md":()=>D(()=>import("./index-8f0491cb.js"),[]),"/src/articles/highlights/2022-09-08-Discussion-on-Hardware-Agile-Development-and-Verification-Methodology/index.md":()=>D(()=>import("./index-28c77317.js"),[]),"/src/articles/highlights/2022-10-20-Rust-Chatterbox:-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>D(()=>import("./index-eb1ecfd7.js"),[]),"/src/articles/highlights/2022-12-12-SpinalHDL-Application-Prospect-Exploration-Online-Seminar/index.md":()=>D(()=>import("./index-3b5176dc.js"),[]),"/src/articles/highlights/2023-01-12-Rust-China-Hackathon-2022-Datan-Technology-Group/index.md":()=>D(()=>import("./index-354c3565.js"),[]),"/src/articles/highlights/2023-04-13-4.8-Beijing-Rust-Meetup/index.md":()=>D(()=>import("./index-4ada4a0c.js"),[]),"/src/articles/highlights/2023-12-21-Highlights:-2023-SpinalHDL-Application-Prospect-Exploration-Workshop/index.md":()=>D(()=>import("./index-67a528fa.js"),[])}),CU=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":()=>D(()=>import("./index-d758c903.js"),[]),"/src/articles/news-honor-dynamic/2023-03-31-Datan-Technology-Entrepreneurship-is-a-rock-and-roll-in-the-soul/index.md":()=>D(()=>import("./index-012df9e2.js"),[])}),DU=()=>{const{section:e,title:t}=gn(),[r,n]=N.useState(),[i,o]=N.useState("");hU(o,r);const a=async()=>{console.log(`/src/articles/${e}/${t}/index.md`);const h=await(async()=>{switch(e){case"blogs":return await SU[`/src/articles/${e}/${t}/index.md`]();case"events":return await bU[`/src/articles/${e}/${t}/index.md`]();case"highlights":return await kU[`/src/articles/${e}/${t}/index.md`]();case"news-honor-dynamic":return await CU[`/src/articles/${e}/${t}/index.md`]()}})();n(h)};N.useEffect(()=>{console.log(r)},[]),N.useEffect(()=>{a(),window.scrollTo(0,0)},[]);const c=d=>{var h;(h=document.querySelector(`#${d}`))==null||h.scrollIntoView({})};return l.jsx(mU,{children:l.jsxs(pU,{children:[(r==null?void 0:r.toc.length)!==0&&l.jsx(wU,{children:l.jsx(_U,{children:((r==null?void 0:r.toc)||[]).map(({label:d,level:h})=>{const g=d.split(" ").join("-").toLowerCase();return l.jsx(xU,{level:h,isActive:i===g,onClick:()=>c(g),children:d},d)})})}),l.jsxs(gU,{children:[l.jsx(vU,{children:r==null?void 0:r.metadata.label}),l.jsx(yU,{className:"content",dangerouslySetInnerHTML:{__html:(r==null?void 0:r.default)||""}})]})]})})};function Bb(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={},EU={get exports(){return zu},set exports(e){zu=e}},mw;function TU(){return mw||(mw=1,function(e,t){(function(r,n){e.exports=n()})(Fo,function(){var r;function n(){return r.apply(null,arguments)}function i(s){r=s}function o(s){return s instanceof Array||Object.prototype.toString.call(s)==="[object Array]"}function a(s){return s!=null&&Object.prototype.toString.call(s)==="[object Object]"}function c(s,u){return Object.prototype.hasOwnProperty.call(s,u)}function d(s){if(Object.getOwnPropertyNames)return Object.getOwnPropertyNames(s).length===0;var u;for(u in s)if(c(s,u))return!1;return!0}function h(s){return s===void 0}function g(s){return typeof s=="number"||Object.prototype.toString.call(s)==="[object Number]"}function v(s){return s instanceof Date||Object.prototype.toString.call(s)==="[object Date]"}function x(s,u){var m=[],p,_=s.length;for(p=0;p<_;++p)m.push(u(s[p],p));return m}function b(s,u){for(var m in u)c(u,m)&&(s[m]=u[m]);return c(u,"toString")&&(s.toString=u.toString),c(u,"valueOf")&&(s.valueOf=u.valueOf),s}function k(s,u,m,p){return av(s,u,m,p,!0).utc()}function C(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidEra:null,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1,parsedDateParts:[],era:null,meridiem:null,rfc2822:!1,weekdayMismatch:!1}}function E(s){return s._pf==null&&(s._pf=C()),s._pf}var y;Array.prototype.some?y=Array.prototype.some:y=function(s){var u=Object(this),m=u.length>>>0,p;for(p=0;p0)for(m=0;m=0;return(j?m?"+":"":"-")+Math.pow(10,Math.max(0,_)).toString().substr(1)+p}var ue=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,he=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,st={},Fe={};function X(s,u,m,p){var _=p;typeof p=="string"&&(_=function(){return this[p]()}),s&&(Fe[s]=_),u&&(Fe[u[0]]=function(){return Q(_.apply(this,arguments),u[1],u[2])}),m&&(Fe[m]=function(){return this.localeData().ordinal(_.apply(this,arguments),s)})}function $t(s){return s.match(/\[[\s\S]/)?s.replace(/^\[|\]$/g,""):s.replace(/\\/g,"")}function tr(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 hr={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"};function Vi(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 Cr="Invalid date";function mr(){return this._invalidDate}var Us="%d",Bs=/\d{1,2}/;function Gs(s){return this._ordinal.replace("%d",s)}var ii={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 Ol(s,u,m,p){var _=this._relativeTime[m];return G(_)?_(s,u,m,p):_.replace(/%d/i,s)}function Pl(s,u){var m=this._relativeTime[s>0?"future":"past"];return G(m)?m(u):m.replace(/%s/i,u)}var oi={};function Dt(s,u){var m=s.toLowerCase();oi[m]=oi[m+"s"]=oi[u]=s}function Et(s){return typeof s=="string"?oi[s]||oi[s.toLowerCase()]:void 0}function si(s){var u={},m,p;for(p in s)c(s,p)&&(m=Et(p),m&&(u[m]=s[p]));return u}var Xs={};function mt(s,u){Xs[s]=u}function af(s){var u=[],m;for(m in s)c(s,m)&&u.push({unit:m,priority:Xs[m]});return u.sort(function(p,_){return p.priority-_.priority}),u}function Co(s){return s%4===0&&s%100!==0||s%400===0}function Xt(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=Xt(u)),m}function L(s,u){return function(m){return m!=null?(H(this,s,m),n.updateOffset(this,u),this):I(this,s)}}function I(s,u){return s.isValid()?s._d["get"+(s._isUTC?"UTC":"")+u]():NaN}function H(s,u,m){s.isValid()&&!isNaN(m)&&(u==="FullYear"&&Co(s.year())&&s.month()===1&&s.date()===29?(m=ge(m),s._d["set"+(s._isUTC?"UTC":"")+u](m,s.month(),Ml(m,s.month()))):s._d["set"+(s._isUTC?"UTC":"")+u](m))}function J(s){return s=Et(s),G(this[s])?this[s]():this}function re(s,u){if(typeof s=="object"){s=si(s);var m=af(s),p,_=m.length;for(p=0;p<_;p++)this[m[p].unit](s[m[p].unit])}else if(s=Et(s),G(this[s]))return this[s](u);return this}var fe=/\d/,ie=/\d\d/,ce=/\d{3}/,ne=/\d{4}/,_e=/[+-]?\d{6}/,ae=/\d\d?/,_t=/\d\d\d\d?/,ct=/\d\d\d\d\d\d?/,tt=/\d{1,3}/,zt=/\d{1,4}/,tn=/[+-]?\d{1,6}/,rn=/\d+/,xn=/[+-]?\d+/,nn=/Z|[+-]\d\d:?\d\d/gi,Sn=/Z|[+-]\d\d(?::?\d\d)?/gi,Ks=/[+-]?\d+(\.\d{1,3})?/,bn=/[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i,ai;ai={};function K(s,u,m){ai[s]=G(u)?u:function(p,_){return p&&m?m:u}}function Ve(s,u){return c(ai,s)?ai[s](u._strict,u._locale):new RegExp(rr(s))}function rr(s){return pt(s.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(u,m,p,_,j){return m||p||_||j}))}function pt(s){return s.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}var Wi={};function me(s,u){var m,p=u,_;for(typeof s=="string"&&(s=[s]),g(u)&&(p=function(j,A){A[u]=ge(j)}),_=s.length,m=0;m<_;m++)Wi[s[m]]=p}function kn(s,u){me(s,function(m,p,_,j){_._w=_._w||{},u(m,_._w,_,j)})}function Rl(s,u,m){u!=null&&c(Wi,s)&&Wi[s](u,m._a,m,s)}var Tt=0,Cn=1,on=2,xt=3,zr=4,Dn=5,Ui=6,yk=7,wk=8;function _k(s,u){return(s%u+u)%u}var ut;Array.prototype.indexOf?ut=Array.prototype.indexOf:ut=function(s){var u;for(u=0;u68?1900:2e3)};var qg=L("FullYear",!0);function Pk(){return Co(this.year())}function Rk(s,u,m,p,_,j,A){var oe;return s<100&&s>=0?(oe=new Date(s+400,u,m,p,_,j,A),isFinite(oe.getFullYear())&&oe.setFullYear(s)):oe=new Date(s,u,m,p,_,j,A),oe}function qs(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 Ll(s,u,m){var p=7+u-m,_=(7+qs(s,0,p).getUTCDay()-u)%7;return-_+p-1}function Zg(s,u,m,p,_){var j=(7+m-p)%7,A=Ll(s,p,_),oe=1+7*(u-1)+j+A,ve,ze;return oe<=0?(ve=s-1,ze=Qs(ve)+oe):oe>Qs(s)?(ve=s+1,ze=oe-Qs(s)):(ve=s,ze=oe),{year:ve,dayOfYear:ze}}function Zs(s,u,m){var p=Ll(s.year(),u,m),_=Math.floor((s.dayOfYear()-p-1)/7)+1,j,A;return _<1?(A=s.year()-1,j=_+En(A,u,m)):_>En(s.year(),u,m)?(j=_-En(s.year(),u,m),A=s.year()+1):(A=s.year(),j=_),{week:j,year:A}}function En(s,u,m){var p=Ll(s,u,m),_=Ll(s+1,u,m);return(Qs(s)-p+_)/7}X("w",["ww",2],"wo","week"),X("W",["WW",2],"Wo","isoWeek"),Dt("week","w"),Dt("isoWeek","W"),mt("week",5),mt("isoWeek",5),K("w",ae),K("ww",ae,ie),K("W",ae),K("WW",ae,ie),kn(["w","ww","W","WW"],function(s,u,m,p){u[p.substr(0,1)]=ge(s)});function Mk(s){return Zs(s,this._week.dow,this._week.doy).week}var Lk={dow:0,doy:6};function Ak(){return this._week.dow}function Ik(){return this._week.doy}function Nk(s){var u=this.localeData().week(this);return s==null?u:this.add((s-u)*7,"d")}function $k(s){var u=Zs(this,1,4).week;return s==null?u:this.add((s-u)*7,"d")}X("d",0,"do","day"),X("dd",0,0,function(s){return this.localeData().weekdaysMin(this,s)}),X("ddd",0,0,function(s){return this.localeData().weekdaysShort(this,s)}),X("dddd",0,0,function(s){return this.localeData().weekdays(this,s)}),X("e",0,0,"weekday"),X("E",0,0,"isoWeekday"),Dt("day","d"),Dt("weekday","e"),Dt("isoWeekday","E"),mt("day",11),mt("weekday",11),mt("isoWeekday",11),K("d",ae),K("e",ae),K("E",ae),K("dd",function(s,u){return u.weekdaysMinRegex(s)}),K("ddd",function(s,u){return u.weekdaysShortRegex(s)}),K("dddd",function(s,u){return u.weekdaysRegex(s)}),kn(["dd","ddd","dddd"],function(s,u,m,p){var _=m._locale.weekdaysParse(s,p,m._strict);_!=null?u.d=_:E(m).invalidWeekday=s}),kn(["d","e","E"],function(s,u,m,p){u[p]=ge(s)});function zk(s,u){return typeof s!="string"?s:isNaN(s)?(s=u.weekdaysParse(s),typeof s=="number"?s:null):parseInt(s,10)}function Hk(s,u){return typeof s=="string"?u.weekdaysParse(s)%7||7:isNaN(s)?null:s}function lf(s,u){return s.slice(u,7).concat(s.slice(0,u))}var Yk="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),Jg="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),Fk="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),Vk=bn,Wk=bn,Uk=bn;function Bk(s,u){var m=o(this._weekdays)?this._weekdays:this._weekdays[s&&s!==!0&&this._weekdays.isFormat.test(u)?"format":"standalone"];return s===!0?lf(m,this._week.dow):s?m[s.day()]:m}function Gk(s){return s===!0?lf(this._weekdaysShort,this._week.dow):s?this._weekdaysShort[s.day()]:this._weekdaysShort}function Xk(s){return s===!0?lf(this._weekdaysMin,this._week.dow):s?this._weekdaysMin[s.day()]:this._weekdaysMin}function Kk(s,u,m){var p,_,j,A=s.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],p=0;p<7;++p)j=k([2e3,1]).day(p),this._minWeekdaysParse[p]=this.weekdaysMin(j,"").toLocaleLowerCase(),this._shortWeekdaysParse[p]=this.weekdaysShort(j,"").toLocaleLowerCase(),this._weekdaysParse[p]=this.weekdays(j,"").toLocaleLowerCase();return m?u==="dddd"?(_=ut.call(this._weekdaysParse,A),_!==-1?_:null):u==="ddd"?(_=ut.call(this._shortWeekdaysParse,A),_!==-1?_:null):(_=ut.call(this._minWeekdaysParse,A),_!==-1?_:null):u==="dddd"?(_=ut.call(this._weekdaysParse,A),_!==-1||(_=ut.call(this._shortWeekdaysParse,A),_!==-1)?_:(_=ut.call(this._minWeekdaysParse,A),_!==-1?_:null)):u==="ddd"?(_=ut.call(this._shortWeekdaysParse,A),_!==-1||(_=ut.call(this._weekdaysParse,A),_!==-1)?_:(_=ut.call(this._minWeekdaysParse,A),_!==-1?_:null)):(_=ut.call(this._minWeekdaysParse,A),_!==-1||(_=ut.call(this._weekdaysParse,A),_!==-1)?_:(_=ut.call(this._shortWeekdaysParse,A),_!==-1?_:null))}function Qk(s,u,m){var p,_,j;if(this._weekdaysParseExact)return Kk.call(this,s,u,m);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),p=0;p<7;p++){if(_=k([2e3,1]).day(p),m&&!this._fullWeekdaysParse[p]&&(this._fullWeekdaysParse[p]=new RegExp("^"+this.weekdays(_,"").replace(".","\\.?")+"$","i"),this._shortWeekdaysParse[p]=new RegExp("^"+this.weekdaysShort(_,"").replace(".","\\.?")+"$","i"),this._minWeekdaysParse[p]=new RegExp("^"+this.weekdaysMin(_,"").replace(".","\\.?")+"$","i")),this._weekdaysParse[p]||(j="^"+this.weekdays(_,"")+"|^"+this.weekdaysShort(_,"")+"|^"+this.weekdaysMin(_,""),this._weekdaysParse[p]=new RegExp(j.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 qk(s){if(!this.isValid())return s!=null?this:NaN;var u=this._isUTC?this._d.getUTCDay():this._d.getDay();return s!=null?(s=zk(s,this.localeData()),this.add(s-u,"d")):u}function Zk(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 Jk(s){if(!this.isValid())return s!=null?this:NaN;if(s!=null){var u=Hk(s,this.localeData());return this.day(this.day()%7?u:u-7)}else return this.day()||7}function eC(s){return this._weekdaysParseExact?(c(this,"_weekdaysRegex")||cf.call(this),s?this._weekdaysStrictRegex:this._weekdaysRegex):(c(this,"_weekdaysRegex")||(this._weekdaysRegex=Vk),this._weekdaysStrictRegex&&s?this._weekdaysStrictRegex:this._weekdaysRegex)}function tC(s){return this._weekdaysParseExact?(c(this,"_weekdaysRegex")||cf.call(this),s?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(c(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=Wk),this._weekdaysShortStrictRegex&&s?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)}function rC(s){return this._weekdaysParseExact?(c(this,"_weekdaysRegex")||cf.call(this),s?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(c(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=Uk),this._weekdaysMinStrictRegex&&s?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)}function cf(){function s(Kt,Rn){return Rn.length-Kt.length}var u=[],m=[],p=[],_=[],j,A,oe,ve,ze;for(j=0;j<7;j++)A=k([2e3,1]).day(j),oe=pt(this.weekdaysMin(A,"")),ve=pt(this.weekdaysShort(A,"")),ze=pt(this.weekdays(A,"")),u.push(oe),m.push(ve),p.push(ze),_.push(oe),_.push(ve),_.push(ze);u.sort(s),m.sort(s),p.sort(s),_.sort(s),this._weekdaysRegex=new RegExp("^("+_.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+p.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+m.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+u.join("|")+")","i")}function uf(){return this.hours()%12||12}function nC(){return this.hours()||24}X("H",["HH",2],0,"hour"),X("h",["hh",2],0,uf),X("k",["kk",2],0,nC),X("hmm",0,0,function(){return""+uf.apply(this)+Q(this.minutes(),2)}),X("hmmss",0,0,function(){return""+uf.apply(this)+Q(this.minutes(),2)+Q(this.seconds(),2)}),X("Hmm",0,0,function(){return""+this.hours()+Q(this.minutes(),2)}),X("Hmmss",0,0,function(){return""+this.hours()+Q(this.minutes(),2)+Q(this.seconds(),2)});function ev(s,u){X(s,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),u)})}ev("a",!0),ev("A",!1),Dt("hour","h"),mt("hour",13);function tv(s,u){return u._meridiemParse}K("a",tv),K("A",tv),K("H",ae),K("h",ae),K("k",ae),K("HH",ae,ie),K("hh",ae,ie),K("kk",ae,ie),K("hmm",_t),K("hmmss",ct),K("Hmm",_t),K("Hmmss",ct),me(["H","HH"],xt),me(["k","kk"],function(s,u,m){var p=ge(s);u[xt]=p===24?0:p}),me(["a","A"],function(s,u,m){m._isPm=m._locale.isPM(s),m._meridiem=s}),me(["h","hh"],function(s,u,m){u[xt]=ge(s),E(m).bigHour=!0}),me("hmm",function(s,u,m){var p=s.length-2;u[xt]=ge(s.substr(0,p)),u[zr]=ge(s.substr(p)),E(m).bigHour=!0}),me("hmmss",function(s,u,m){var p=s.length-4,_=s.length-2;u[xt]=ge(s.substr(0,p)),u[zr]=ge(s.substr(p,2)),u[Dn]=ge(s.substr(_)),E(m).bigHour=!0}),me("Hmm",function(s,u,m){var p=s.length-2;u[xt]=ge(s.substr(0,p)),u[zr]=ge(s.substr(p))}),me("Hmmss",function(s,u,m){var p=s.length-4,_=s.length-2;u[xt]=ge(s.substr(0,p)),u[zr]=ge(s.substr(p,2)),u[Dn]=ge(s.substr(_))});function iC(s){return(s+"").toLowerCase().charAt(0)==="p"}var oC=/[ap]\.?m?\.?/i,sC=L("Hours",!0);function aC(s,u,m){return s>11?m?"pm":"PM":m?"am":"AM"}var rv={calendar:W,longDateFormat:hr,invalidDate:Cr,ordinal:Us,dayOfMonthOrdinalParse:Bs,relativeTime:ii,months:xk,monthsShort:Bg,week:Lk,weekdays:Yk,weekdaysMin:Fk,weekdaysShort:Jg,meridiemParse:oC},Qe={},Js={},ea;function lC(s,u){var m,p=Math.min(s.length,u.length);for(m=0;m0;){if(_=Al(j.slice(0,m).join("-")),_)return _;if(p&&p.length>=m&&lC(j,p)>=m-1)break;m--}u++}return ea}function uC(s){return s.match("^[^/\\\\]*$")!=null}function Al(s){var u=null,m;if(Qe[s]===void 0&&e&&e.exports&&uC(s))try{u=ea._abbr,m=Bb,m("./locale/"+s),li(u)}catch{Qe[s]=null}return Qe[s]}function li(s,u){var m;return s&&(h(u)?m=Tn(s):m=df(s,u),m?ea=m:typeof console<"u"&&console.warn&&console.warn("Locale "+s+" not found. Did you forget to load it?")),ea._abbr}function df(s,u){if(u!==null){var m,p=rv;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=Al(u.parentLocale),m!=null)p=m._config;else return Js[u.parentLocale]||(Js[u.parentLocale]=[]),Js[u.parentLocale].push({name:s,config:u}),null;return Qe[s]=new $e(Te(p,u)),Js[s]&&Js[s].forEach(function(_){df(_.name,_.config)}),li(s),Qe[s]}else return delete Qe[s],null}function dC(s,u){if(u!=null){var m,p,_=rv;Qe[s]!=null&&Qe[s].parentLocale!=null?Qe[s].set(Te(Qe[s]._config,u)):(p=Al(s),p!=null&&(_=p._config),u=Te(_,u),p==null&&(u.abbr=s),m=new $e(u),m.parentLocale=Qe[s],Qe[s]=m),li(s)}else Qe[s]!=null&&(Qe[s].parentLocale!=null?(Qe[s]=Qe[s].parentLocale,s===li()&&li(s)):Qe[s]!=null&&delete Qe[s]);return Qe[s]}function Tn(s){var u;if(s&&s._locale&&s._locale._abbr&&(s=s._locale._abbr),!s)return ea;if(!o(s)){if(u=Al(s),u)return u;s=[s]}return cC(s)}function fC(){return ht(Qe)}function ff(s){var u,m=s._a;return m&&E(s).overflow===-2&&(u=m[Cn]<0||m[Cn]>11?Cn:m[on]<1||m[on]>Ml(m[Tt],m[Cn])?on:m[xt]<0||m[xt]>24||m[xt]===24&&(m[zr]!==0||m[Dn]!==0||m[Ui]!==0)?xt:m[zr]<0||m[zr]>59?zr:m[Dn]<0||m[Dn]>59?Dn:m[Ui]<0||m[Ui]>999?Ui:-1,E(s)._overflowDayOfYear&&(uon)&&(u=on),E(s)._overflowWeeks&&u===-1&&(u=yk),E(s)._overflowWeekday&&u===-1&&(u=wk),E(s).overflow=u),s}var hC=/^\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)?)?$/,mC=/^\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)?)?$/,pC=/Z|[+-]\d\d(?::?\d\d)?/,Il=[["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]],hf=[["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/]],gC=/^\/?Date\((-?\d+)/i,vC=/^(?:(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}))$/,yC={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 iv(s){var u,m,p=s._i,_=hC.exec(p)||mC.exec(p),j,A,oe,ve,ze=Il.length,Kt=hf.length;if(_){for(E(s).iso=!0,u=0,m=ze;uQs(A)||s._dayOfYear===0)&&(E(s)._overflowDayOfYear=!0),m=qs(A,0,s._dayOfYear),s._a[Cn]=m.getUTCMonth(),s._a[on]=m.getUTCDate()),u=0;u<3&&s._a[u]==null;++u)s._a[u]=p[u]=_[u];for(;u<7;u++)s._a[u]=p[u]=s._a[u]==null?u===2?1:0:s._a[u];s._a[xt]===24&&s._a[zr]===0&&s._a[Dn]===0&&s._a[Ui]===0&&(s._nextDay=!0,s._a[xt]=0),s._d=(s._useUTC?qs:Rk).apply(null,p),j=s._useUTC?s._d.getUTCDay():s._d.getDay(),s._tzm!=null&&s._d.setUTCMinutes(s._d.getUTCMinutes()-s._tzm),s._nextDay&&(s._a[xt]=24),s._w&&typeof s._w.d<"u"&&s._w.d!==j&&(E(s).weekdayMismatch=!0)}}function DC(s){var u,m,p,_,j,A,oe,ve,ze;u=s._w,u.GG!=null||u.W!=null||u.E!=null?(j=1,A=4,m=Do(u.GG,s._a[Tt],Zs(We(),1,4).year),p=Do(u.W,1),_=Do(u.E,1),(_<1||_>7)&&(ve=!0)):(j=s._locale._week.dow,A=s._locale._week.doy,ze=Zs(We(),j,A),m=Do(u.gg,s._a[Tt],ze.year),p=Do(u.w,ze.week),u.d!=null?(_=u.d,(_<0||_>6)&&(ve=!0)):u.e!=null?(_=u.e+j,(u.e<0||u.e>6)&&(ve=!0)):_=j),p<1||p>En(m,j,A)?E(s)._overflowWeeks=!0:ve!=null?E(s)._overflowWeekday=!0:(oe=Zg(m,p,_,j,A),s._a[Tt]=oe.year,s._dayOfYear=oe.dayOfYear)}n.ISO_8601=function(){},n.RFC_2822=function(){};function pf(s){if(s._f===n.ISO_8601){iv(s);return}if(s._f===n.RFC_2822){ov(s);return}s._a=[],E(s).empty=!0;var u=""+s._i,m,p,_,j,A,oe=u.length,ve=0,ze,Kt;for(_=$r(s._f,s._locale).match(ue)||[],Kt=_.length,m=0;m0&&E(s).unusedInput.push(A),u=u.slice(u.indexOf(p)+p.length),ve+=p.length),Fe[j]?(p?E(s).empty=!1:E(s).unusedTokens.push(j),Rl(j,p,s)):s._strict&&!p&&E(s).unusedTokens.push(j);E(s).charsLeftOver=oe-ve,u.length>0&&E(s).unusedInput.push(u),s._a[xt]<=12&&E(s).bigHour===!0&&s._a[xt]>0&&(E(s).bigHour=void 0),E(s).parsedDateParts=s._a.slice(0),E(s).meridiem=s._meridiem,s._a[xt]=EC(s._locale,s._a[xt],s._meridiem),ze=E(s).era,ze!==null&&(s._a[Tt]=s._locale.erasConvertYear(ze,s._a[Tt])),mf(s),ff(s)}function EC(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 TC(s){var u,m,p,_,j,A,oe=!1,ve=s._f.length;if(ve===0){E(s).invalidFormat=!0,s._d=new Date(NaN);return}for(_=0;_this?this:s:S()});function lv(s,u){var m,p;if(u.length===1&&o(u[0])&&(u=u[0]),!u.length)return We();for(m=u[0],p=1;pthis.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function KC(){if(!h(this._isDSTShifted))return this._isDSTShifted;var s={},u;return P(s,this),s=sv(s),s._a?(u=s._isUTC?k(s._a):We(s._a),this._isDSTShifted=this.isValid()&&HC(s._a,u.toArray())>0):this._isDSTShifted=!1,this._isDSTShifted}function QC(){return this.isValid()?!this._isUTC:!1}function qC(){return this.isValid()?this._isUTC:!1}function uv(){return this.isValid()?this._isUTC&&this._offset===0:!1}var ZC=/^(-|\+)?(?:(\d*)[. ])?(\d+):(\d+)(?::(\d+)(\.\d*)?)?$/,JC=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;function Hr(s,u){var m=s,p=null,_,j,A;return $l(s)?m={ms:s._milliseconds,d:s._days,M:s._months}:g(s)||!isNaN(+s)?(m={},u?m[u]=+s:m.milliseconds=+s):(p=ZC.exec(s))?(_=p[1]==="-"?-1:1,m={y:0,d:ge(p[on])*_,h:ge(p[xt])*_,m:ge(p[zr])*_,s:ge(p[Dn])*_,ms:ge(gf(p[Ui]*1e3))*_}):(p=JC.exec(s))?(_=p[1]==="-"?-1:1,m={y:Bi(p[2],_),M:Bi(p[3],_),w:Bi(p[4],_),d:Bi(p[5],_),h:Bi(p[6],_),m:Bi(p[7],_),s:Bi(p[8],_)}):m==null?m={}:typeof m=="object"&&("from"in m||"to"in m)&&(A=eD(We(m.from),We(m.to)),m={},m.ms=A.milliseconds,m.M=A.months),j=new Nl(m),$l(s)&&c(s,"_locale")&&(j._locale=s._locale),$l(s)&&c(s,"_isValid")&&(j._isValid=s._isValid),j}Hr.fn=Nl.prototype,Hr.invalid=zC;function Bi(s,u){var m=s&&parseFloat(s.replace(",","."));return(isNaN(m)?0:m)*u}function dv(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 eD(s,u){var m;return s.isValid()&&u.isValid()?(u=yf(u,s),s.isBefore(u)?m=dv(s,u):(m=dv(u,s),m.milliseconds=-m.milliseconds,m.months=-m.months),m):{milliseconds:0,months:0}}function fv(s,u){return function(m,p){var _,j;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."),j=m,m=p,p=j),_=Hr(m,p),hv(this,_,s),this}}function hv(s,u,m,p){var _=u._milliseconds,j=gf(u._days),A=gf(u._months);s.isValid()&&(p=p??!0,A&&Xg(s,I(s,"Month")+A*m),j&&H(s,"Date",I(s,"Date")+j*m),_&&s._d.setTime(s._d.valueOf()+_*m),p&&n.updateOffset(s,j||A))}var tD=fv(1,"add"),rD=fv(-1,"subtract");function mv(s){return typeof s=="string"||s instanceof String}function nD(s){return R(s)||v(s)||mv(s)||g(s)||oD(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"],_,j,A=p.length;for(_=0;_m.valueOf():m.valueOf()9999?Nr(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",Nr(m,"Z")):Nr(m,u?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")}function wD(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var s="moment",u="",m,p,_,j;return this.isLocal()||(s=this.utcOffset()===0?"moment.utc":"moment.parseZone",u="Z"),m="["+s+'("]',p=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",_="-MM-DD[T]HH:mm:ss.SSS",j=u+'[")]',this.format(m+p+_+j)}function _D(s){s||(s=this.isUtc()?n.defaultFormatUtc:n.defaultFormat);var u=Nr(this,s);return this.localeData().postformat(u)}function xD(s,u){return this.isValid()&&(R(s)&&s.isValid()||We(s).isValid())?Hr({to:this,from:s}).locale(this.locale()).humanize(!u):this.localeData().invalidDate()}function SD(s){return this.from(We(),s)}function bD(s,u){return this.isValid()&&(R(s)&&s.isValid()||We(s).isValid())?Hr({from:this,to:s}).locale(this.locale()).humanize(!u):this.localeData().invalidDate()}function kD(s){return this.to(We(),s)}function pv(s){var u;return s===void 0?this._locale._abbr:(u=Tn(s),u!=null&&(this._locale=u),this)}var gv=z("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 Hl=1e3,Eo=60*Hl,Yl=60*Eo,yv=(365*400+97)*24*Yl;function To(s,u){return(s%u+u)%u}function wv(s,u,m){return s<100&&s>=0?new Date(s+400,u,m)-yv:new Date(s,u,m).valueOf()}function _v(s,u,m){return s<100&&s>=0?Date.UTC(s+400,u,m)-yv:Date.UTC(s,u,m)}function CD(s){var u,m;if(s=Et(s),s===void 0||s==="millisecond"||!this.isValid())return this;switch(m=this._isUTC?_v:wv,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-=To(u+(this._isUTC?0:this.utcOffset()*Eo),Yl);break;case"minute":u=this._d.valueOf(),u-=To(u,Eo);break;case"second":u=this._d.valueOf(),u-=To(u,Hl);break}return this._d.setTime(u),n.updateOffset(this,!0),this}function DD(s){var u,m;if(s=Et(s),s===void 0||s==="millisecond"||!this.isValid())return this;switch(m=this._isUTC?_v:wv,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+=Yl-To(u+(this._isUTC?0:this.utcOffset()*Eo),Yl)-1;break;case"minute":u=this._d.valueOf(),u+=Eo-To(u,Eo)-1;break;case"second":u=this._d.valueOf(),u+=Hl-To(u,Hl)-1;break}return this._d.setTime(u),n.updateOffset(this,!0),this}function ED(){return this._d.valueOf()-(this._offset||0)*6e4}function TD(){return Math.floor(this.valueOf()/1e3)}function jD(){return new Date(this.valueOf())}function OD(){var s=this;return[s.year(),s.month(),s.date(),s.hour(),s.minute(),s.second(),s.millisecond()]}function PD(){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 RD(){return this.isValid()?this.toISOString():null}function MD(){return w(this)}function LD(){return b({},E(this))}function AD(){return E(this).overflow}function ID(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}}X("N",0,0,"eraAbbr"),X("NN",0,0,"eraAbbr"),X("NNN",0,0,"eraAbbr"),X("NNNN",0,0,"eraName"),X("NNNNN",0,0,"eraNarrow"),X("y",["y",1],"yo","eraYear"),X("y",["yy",2],0,"eraYear"),X("y",["yyy",3],0,"eraYear"),X("y",["yyyy",4],0,"eraYear"),K("N",_f),K("NN",_f),K("NNN",_f),K("NNNN",GD),K("NNNNN",XD),me(["N","NN","NNN","NNNN","NNNNN"],function(s,u,m,p){var _=m._locale.erasParse(s,p,m._strict);_?E(m).era=_:E(m).invalidEra=s}),K("y",rn),K("yy",rn),K("yyy",rn),K("yyyy",rn),K("yo",KD),me(["y","yy","yyy","yyyy"],Tt),me(["yo"],function(s,u,m,p){var _;m._locale._eraYearOrdinalRegex&&(_=s.match(m._locale._eraYearOrdinalRegex)),m._locale.eraYearOrdinalParse?u[Tt]=m._locale.eraYearOrdinalParse(s,_):u[Tt]=parseInt(s,10)});function ND(s,u){var m,p,_,j=this._eras||Tn("en")._eras;for(m=0,p=j.length;m=0)return j[p]}function zD(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 HD(){var s,u,m,p=this.localeData().eras();for(s=0,u=p.length;sj&&(u=j),rE.call(this,s,u,m,p,_))}function rE(s,u,m,p,_){var j=Zg(s,u,m,p,_),A=qs(j.year,0,j.dayOfYear);return this.year(A.getUTCFullYear()),this.month(A.getUTCMonth()),this.date(A.getUTCDate()),this}X("Q",0,"Qo","quarter"),Dt("quarter","Q"),mt("quarter",7),K("Q",fe),me("Q",function(s,u){u[Cn]=(ge(s)-1)*3});function nE(s){return s==null?Math.ceil((this.month()+1)/3):this.month((s-1)*3+this.month()%3)}X("D",["DD",2],"Do","date"),Dt("date","D"),mt("date",9),K("D",ae),K("DD",ae,ie),K("Do",function(s,u){return s?u._dayOfMonthOrdinalParse||u._ordinalParse:u._dayOfMonthOrdinalParseLenient}),me(["D","DD"],on),me("Do",function(s,u){u[on]=ge(s.match(ae)[0])});var Sv=L("Date",!0);X("DDD",["DDDD",3],"DDDo","dayOfYear"),Dt("dayOfYear","DDD"),mt("dayOfYear",4),K("DDD",tt),K("DDDD",ce),me(["DDD","DDDD"],function(s,u,m){m._dayOfYear=ge(s)});function iE(s){var u=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return s==null?u:this.add(s-u,"d")}X("m",["mm",2],0,"minute"),Dt("minute","m"),mt("minute",14),K("m",ae),K("mm",ae,ie),me(["m","mm"],zr);var oE=L("Minutes",!1);X("s",["ss",2],0,"second"),Dt("second","s"),mt("second",15),K("s",ae),K("ss",ae,ie),me(["s","ss"],Dn);var sE=L("Seconds",!1);X("S",0,0,function(){return~~(this.millisecond()/100)}),X(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),X(0,["SSS",3],0,"millisecond"),X(0,["SSSS",4],0,function(){return this.millisecond()*10}),X(0,["SSSSS",5],0,function(){return this.millisecond()*100}),X(0,["SSSSSS",6],0,function(){return this.millisecond()*1e3}),X(0,["SSSSSSS",7],0,function(){return this.millisecond()*1e4}),X(0,["SSSSSSSS",8],0,function(){return this.millisecond()*1e5}),X(0,["SSSSSSSSS",9],0,function(){return this.millisecond()*1e6}),Dt("millisecond","ms"),mt("millisecond",16),K("S",tt,fe),K("SS",tt,ie),K("SSS",tt,ce);var ci,bv;for(ci="SSSS";ci.length<=9;ci+="S")K(ci,rn);function aE(s,u){u[Ui]=ge(("0."+s)*1e3)}for(ci="S";ci.length<=9;ci+="S")me(ci,aE);bv=L("Milliseconds",!1),X("z",0,0,"zoneAbbr"),X("zz",0,0,"zoneName");function lE(){return this._isUTC?"UTC":""}function cE(){return this._isUTC?"Coordinated Universal Time":""}var F=M.prototype;F.add=tD,F.calendar=lD,F.clone=cD,F.diff=gD,F.endOf=DD,F.format=_D,F.from=xD,F.fromNow=SD,F.to=bD,F.toNow=kD,F.get=J,F.invalidAt=AD,F.isAfter=uD,F.isBefore=dD,F.isBetween=fD,F.isSame=hD,F.isSameOrAfter=mD,F.isSameOrBefore=pD,F.isValid=MD,F.lang=gv,F.locale=pv,F.localeData=vv,F.max=MC,F.min=RC,F.parsingFlags=LD,F.set=re,F.startOf=CD,F.subtract=rD,F.toArray=OD,F.toObject=PD,F.toDate=jD,F.toISOString=yD,F.inspect=wD,typeof Symbol<"u"&&Symbol.for!=null&&(F[Symbol.for("nodejs.util.inspect.custom")]=function(){return"Moment<"+this.format()+">"}),F.toJSON=RD,F.toString=vD,F.unix=TD,F.valueOf=ED,F.creationData=ID,F.eraName=HD,F.eraNarrow=YD,F.eraAbbr=FD,F.eraYear=VD,F.year=qg,F.isLeapYear=Pk,F.weekYear=QD,F.isoWeekYear=qD,F.quarter=F.quarters=nE,F.month=Kg,F.daysInMonth=Tk,F.week=F.weeks=Nk,F.isoWeek=F.isoWeeks=$k,F.weeksInYear=eE,F.weeksInWeekYear=tE,F.isoWeeksInYear=ZD,F.isoWeeksInISOWeekYear=JD,F.date=Sv,F.day=F.days=qk,F.weekday=Zk,F.isoWeekday=Jk,F.dayOfYear=iE,F.hour=F.hours=sC,F.minute=F.minutes=oE,F.second=F.seconds=sE,F.millisecond=F.milliseconds=bv,F.utcOffset=FC,F.utc=WC,F.local=UC,F.parseZone=BC,F.hasAlignedHourOffset=GC,F.isDST=XC,F.isLocal=QC,F.isUtcOffset=qC,F.isUtc=uv,F.isUTC=uv,F.zoneAbbr=lE,F.zoneName=cE,F.dates=z("dates accessor is deprecated. Use date instead.",Sv),F.months=z("months accessor is deprecated. Use month instead",Kg),F.years=z("years accessor is deprecated. Use year instead",qg),F.zone=z("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",VC),F.isDSTShifted=z("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",KC);function uE(s){return We(s*1e3)}function dE(){return We.apply(null,arguments).parseZone()}function kv(s){return s}var je=$e.prototype;je.calendar=le,je.longDateFormat=Vi,je.invalidDate=mr,je.ordinal=Gs,je.preparse=kv,je.postformat=kv,je.relativeTime=Ol,je.pastFuture=Pl,je.set=lt,je.eras=ND,je.erasParse=$D,je.erasConvertYear=zD,je.erasAbbrRegex=UD,je.erasNameRegex=WD,je.erasNarrowRegex=BD,je.months=kk,je.monthsShort=Ck,je.monthsParse=Ek,je.monthsRegex=Ok,je.monthsShortRegex=jk,je.week=Mk,je.firstDayOfYear=Ik,je.firstDayOfWeek=Ak,je.weekdays=Bk,je.weekdaysMin=Xk,je.weekdaysShort=Gk,je.weekdaysParse=Qk,je.weekdaysRegex=eC,je.weekdaysShortRegex=tC,je.weekdaysMinRegex=rC,je.isPM=iC,je.meridiem=aC;function Vl(s,u,m,p){var _=Tn(),j=k().set(p,u);return _[m](j,s)}function Cv(s,u,m){if(g(s)&&(u=s,s=void 0),s=s||"",u!=null)return Vl(s,u,m,"month");var p,_=[];for(p=0;p<12;p++)_[p]=Vl(s,p,m,"month");return _}function Sf(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 _=Tn(),j=s?_._week.dow:0,A,oe=[];if(m!=null)return Vl(u,(m+j)%7,p,"day");for(A=0;A<7;A++)oe[A]=Vl(u,(A+j)%7,p,"day");return oe}function fE(s,u){return Cv(s,u,"months")}function hE(s,u){return Cv(s,u,"monthsShort")}function mE(s,u,m){return Sf(s,u,m,"weekdays")}function pE(s,u,m){return Sf(s,u,m,"weekdaysShort")}function gE(s,u,m){return Sf(s,u,m,"weekdaysMin")}li("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=z("moment.lang is deprecated. Use moment.locale instead.",li),n.langData=z("moment.langData is deprecated. Use moment.localeData instead.",Tn);var jn=Math.abs;function vE(){var s=this._data;return this._milliseconds=jn(this._milliseconds),this._days=jn(this._days),this._months=jn(this._months),s.milliseconds=jn(s.milliseconds),s.seconds=jn(s.seconds),s.minutes=jn(s.minutes),s.hours=jn(s.hours),s.months=jn(s.months),s.years=jn(s.years),this}function Dv(s,u,m,p){var _=Hr(u,m);return s._milliseconds+=p*_._milliseconds,s._days+=p*_._days,s._months+=p*_._months,s._bubble()}function yE(s,u){return Dv(this,s,u,1)}function wE(s,u){return Dv(this,s,u,-1)}function Ev(s){return s<0?Math.floor(s):Math.ceil(s)}function _E(){var s=this._milliseconds,u=this._days,m=this._months,p=this._data,_,j,A,oe,ve;return s>=0&&u>=0&&m>=0||s<=0&&u<=0&&m<=0||(s+=Ev(bf(m)+u)*864e5,u=0,m=0),p.milliseconds=s%1e3,_=Xt(s/1e3),p.seconds=_%60,j=Xt(_/60),p.minutes=j%60,A=Xt(j/60),p.hours=A%24,u+=Xt(A/24),ve=Xt(Tv(u)),m+=ve,u-=Ev(bf(ve)),oe=Xt(m/12),m%=12,p.days=u,p.months=m,p.years=oe,this}function Tv(s){return s*4800/146097}function bf(s){return s*146097/4800}function xE(s){if(!this.isValid())return NaN;var u,m,p=this._milliseconds;if(s=Et(s),s==="month"||s==="quarter"||s==="year")switch(u=this._days+p/864e5,m=this._months+Tv(u),s){case"month":return m;case"quarter":return m/3;case"year":return m/12}else switch(u=this._days+Math.round(bf(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 SE(){return this.isValid()?this._milliseconds+this._days*864e5+this._months%12*2592e6+ge(this._months/12)*31536e6:NaN}function On(s){return function(){return this.as(s)}}var bE=On("ms"),kE=On("s"),CE=On("m"),DE=On("h"),EE=On("d"),TE=On("w"),jE=On("M"),OE=On("Q"),PE=On("y");function RE(){return Hr(this)}function ME(s){return s=Et(s),this.isValid()?this[s+"s"]():NaN}function Gi(s){return function(){return this.isValid()?this._data[s]:NaN}}var LE=Gi("milliseconds"),AE=Gi("seconds"),IE=Gi("minutes"),NE=Gi("hours"),$E=Gi("days"),zE=Gi("months"),HE=Gi("years");function YE(){return Xt(this.days()/7)}var Pn=Math.round,jo={ss:44,s:45,m:45,h:22,d:26,w:null,M:11};function FE(s,u,m,p,_){return _.relativeTime(u||1,!!m,s,p)}function VE(s,u,m,p){var _=Hr(s).abs(),j=Pn(_.as("s")),A=Pn(_.as("m")),oe=Pn(_.as("h")),ve=Pn(_.as("d")),ze=Pn(_.as("M")),Kt=Pn(_.as("w")),Rn=Pn(_.as("y")),ui=j<=m.ss&&["s",j]||j0,ui[4]=p,FE.apply(null,ui)}function WE(s){return s===void 0?Pn:typeof s=="function"?(Pn=s,!0):!1}function UE(s,u){return jo[s]===void 0?!1:u===void 0?jo[s]:(jo[s]=u,s==="s"&&(jo.ss=u-1),!0)}function BE(s,u){if(!this.isValid())return this.localeData().invalidDate();var m=!1,p=jo,_,j;return typeof s=="object"&&(u=s,s=!1),typeof s=="boolean"&&(m=s),typeof u=="object"&&(p=Object.assign({},jo,u),u.s!=null&&u.ss==null&&(p.ss=u.s-1)),_=this.localeData(),j=VE(this,!m,p,_),m&&(j=_.pastFuture(+this,j)),_.postformat(j)}var kf=Math.abs;function Oo(s){return(s>0)-(s<0)||+s}function Wl(){if(!this.isValid())return this.localeData().invalidDate();var s=kf(this._milliseconds)/1e3,u=kf(this._days),m=kf(this._months),p,_,j,A,oe=this.asSeconds(),ve,ze,Kt,Rn;return oe?(p=Xt(s/60),_=Xt(p/60),s%=60,p%=60,j=Xt(m/12),m%=12,A=s?s.toFixed(3).replace(/\.?0+$/,""):"",ve=oe<0?"-":"",ze=Oo(this._months)!==Oo(oe)?"-":"",Kt=Oo(this._days)!==Oo(oe)?"-":"",Rn=Oo(this._milliseconds)!==Oo(oe)?"-":"",ve+"P"+(j?ze+j+"Y":"")+(m?ze+m+"M":"")+(u?Kt+u+"D":"")+(_||p||s?"T":"")+(_?Rn+_+"H":"")+(p?Rn+p+"M":"")+(s?Rn+A+"S":"")):"P0D"}var Ce=Nl.prototype;Ce.isValid=$C,Ce.abs=vE,Ce.add=yE,Ce.subtract=wE,Ce.as=xE,Ce.asMilliseconds=bE,Ce.asSeconds=kE,Ce.asMinutes=CE,Ce.asHours=DE,Ce.asDays=EE,Ce.asWeeks=TE,Ce.asMonths=jE,Ce.asQuarters=OE,Ce.asYears=PE,Ce.valueOf=SE,Ce._bubble=_E,Ce.clone=RE,Ce.get=ME,Ce.milliseconds=LE,Ce.seconds=AE,Ce.minutes=IE,Ce.hours=NE,Ce.days=$E,Ce.weeks=YE,Ce.months=zE,Ce.years=HE,Ce.humanize=BE,Ce.toISOString=Wl,Ce.toString=Wl,Ce.toJSON=Wl,Ce.locale=pv,Ce.localeData=vv,Ce.toIsoString=z("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",Wl),Ce.lang=gv,X("X",0,0,"unix"),X("x",0,0,"valueOf"),K("x",xn),K("X",Ks),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(We),n.fn=F,n.min=LC,n.max=AC,n.now=IC,n.utc=k,n.unix=uE,n.months=fE,n.isDate=v,n.locale=li,n.invalid=S,n.duration=Hr,n.isMoment=R,n.weekdays=mE,n.parseZone=dE,n.localeData=Tn,n.isDuration=$l,n.monthsShort=hE,n.weekdaysMin=gE,n.defineLocale=df,n.updateLocale=dC,n.locales=fC,n.weekdaysShort=pE,n.normalizeUnits=Et,n.relativeTimeRounding=WE,n.relativeTimeThreshold=UE,n.calendarFormat=aD,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})}(DU)),zu}(function(e,t){(function(r,n){n(typeof Bb=="function"?EU():r.moment)})(Fo,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 Gb="/zh-cn/assets/wechat-qrcode-8dca7947.png",Xb="/zh-cn/assets/logo-image-91f154f1.svg",Kb="/zh-cn/assets/location-cf5a6f84.svg",Qb="/zh-cn/assets/clock-718648c0.svg",qb="/zh-cn/assets/calendar-cd5a76f0.svg";U.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:TU,Paragraph:jU}=Me,{CNTitleMedium:Zb,CNTitleSmall:OU}=TU,{CNBodySmall:ko,CNMarkSmall:PU,CNBodyLarge:RU,CNMarkMedium:Jb}=jU,MU=f.div` +return n.version="2.29.4",i(We),n.fn=F,n.min=LC,n.max=AC,n.now=IC,n.utc=k,n.unix=uE,n.months=fE,n.isDate=v,n.locale=li,n.invalid=S,n.duration=Hr,n.isMoment=R,n.weekdays=mE,n.parseZone=dE,n.localeData=Tn,n.isDuration=$l,n.monthsShort=hE,n.weekdaysMin=gE,n.defineLocale=df,n.updateLocale=dC,n.locales=fC,n.weekdaysShort=pE,n.normalizeUnits=Et,n.relativeTimeRounding=WE,n.relativeTimeThreshold=UE,n.calendarFormat=aD,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})}(EU)),zu}(function(e,t){(function(r,n){n(typeof Bb=="function"?TU():r.moment)})(Fo,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 Gb="/zh-cn/assets/wechat-qrcode-8dca7947.png",Xb="/zh-cn/assets/logo-image-91f154f1.svg",Kb="/zh-cn/assets/location-cf5a6f84.svg",Qb="/zh-cn/assets/clock-718648c0.svg",qb="/zh-cn/assets/calendar-cd5a76f0.svg";U.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:jU,Paragraph:OU}=Me,{CNTitleMedium:Zb,CNTitleSmall:PU}=jU,{CNBodySmall:ko,CNMarkSmall:RU,CNBodyLarge:MU,CNMarkMedium:Jb}=OU,LU=f.div` background: #fafafa; -`,LU=f.div` +`,AU=f.div` display: flex; max-width: 1440px; margin-inline: auto; @@ -2230,7 +2230,7 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ @media screen and (max-width: 1024px) { flex-direction: column; } -`,AU=f.aside` +`,IU=f.aside` display: block; width: 250px; margin-right: 0.48rem; @@ -2240,12 +2240,12 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ margin-right: 0; margin-bottom: 0.32rem; } -`,IU=f.main` +`,NU=f.main` flex-grow: 1; @media screen and (max-width: 1024px) { order: 3; } -`,NU=f.aside` +`,$U=f.aside` width: 200px; margin-left: 0.48rem; @media screen and (max-width: 1024px) { @@ -2254,7 +2254,7 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ margin-left: 0; margin-bottom: 0.32rem; } -`,$U=f.section` +`,zU=f.section` position: sticky; top: calc(0.84rem + 0.48rem); left: 0; @@ -2272,11 +2272,11 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ :last-child { margin-bottom: 0; } -`,zU=f(ek)` +`,HU=f(ek)` position: sticky; top: calc(84px + 48px); left: 0; -`,pw=f(OU)` +`,pw=f(PU)` padding-bottom: 0.11rem; color: #7680dd; `,fi=f.div` @@ -2290,7 +2290,7 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ } `,hi=f.span` font-weight: 600; -`,HU=f(ko)` +`,YU=f(ko)` font-weight: 600; padding-bottom: 0.11rem; position: relative; @@ -2304,29 +2304,29 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ `,gw=f(ko)` font-weight: 600; /* padding-bottom: 0.04rem; */ -`,YU=f(Jb)` +`,FU=f(Jb)` font-weight: 600; font-size: 0.16rem; padding-bottom: 0.12rem; `;f(Jb)` padding-bottom: 0.11rem; -`;const FU=f(ko)` +`;const VU=f(ko)` font-weight: 400; -`,VU=f.span` +`,WU=f.span` color: #7680dd; -`,WU=f.img` +`,UU=f.img` display: block; width: 0.8rem; margin-inline: auto; padding-top: 0.12rem; -`,UU=f(Zb)` - padding-bottom: 0.14rem; `,BU=f(Zb)` + padding-bottom: 0.14rem; +`,GU=f(Zb)` margin-bottom: 0.11rem; -`,GU=f.section` +`,XU=f.section` min-height: 200px; color: rgba(20, 20, 20, 0.7); -`,XU=f.div` +`,KU=f.div` display: flex; min-height: 200px; margin-bottom: 0.16rem; @@ -2338,19 +2338,19 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ :last-child { margin-bottom: 0; } -`,KU=f.img` +`,QU=f.img` height: min-content; width: 0.625rem; margin-right: 0.22rem; -`,QU=f.div` +`,qU=f.div` flex-grow: 1; position: relative; -`,qU=f(PU)` - color: #7767a0; `,ZU=f(RU)` + color: #7767a0; +`,JU=f(MU)` margin-bottom: 0.07rem; color: #141414; -`,JU=f.div` +`,eB=f.div` display: flex; margin-bottom: 0.13rem; @media screen and (max-width: 1024px) { @@ -2378,13 +2378,13 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ background-image: url(${e=>e.icon}); background-size: cover; } -`,eB=f.div` +`,tB=f.div` padding-bottom: 0.24rem; -`,tB=f.ol` +`,rB=f.ol` padding-left: 0.24rem; -`,rB=f(ko)``,nB=f(ko)` +`,nB=f(ko)``,iB=f(ko)` color: #7680dd; -`,iB=f.div` +`,oB=f.div` width: 96%; display: flex; align-items: center; @@ -2403,9 +2403,9 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ &:checked { accent-color: ${e=>e.theme.secondary01}; } -`,oB=new Map([["fullTime","全职"],["internship","兼职"]]),ww=[{id:"Distributed storage software development senior engineer".split(" ").join("-").toLowerCase(),label:"分布式存储软件开发资深工程师",tag:["全职","急招"],workNature:"远程办公",workType:"fullTime",releaseTime:"2023-5-17",content:[{title:"【岗位职责】",body:["参与开源分布式存储项目DatenLord的开发和维护;","完善DatenLord的测试,构建新的DatenLord测试框架;","提高DatenLord分布式性能表现。 "]},{title:"【岗位要求】",body:["至少5年的分布式系统开发或研究经验,最好是分布式存储系统研发或研究经验;","具有HDFS 、Ceph、GlusterFS等分布式存储系统具有相关开发和使用经验;","熟悉Rust、C或C++语言;","具有开源项目的开发和维护经验。"]}]},{id:"Rust distributed storage development".split(" ").join("-").toLowerCase(),label:"Rust分布式存储开发",tag:["实习","即将招满"],workNature:"远程办公",workType:"internship",releaseTime:"2023-5-17",content:[{title:"【岗位职责】",body:["参与高性能分布式存储系统研发,涉及的开发内容包括但不限于:","分布式存储系统开发;","分布式数据一致性协议研究和开发;","分布式缓存、数据管理服务;","使用 Rust 语言进行内核驱动开发。"]},{title:"【岗位要求】",body:["熟练使用Rust语言,熟悉多线程、高并发编程;","熟悉Linux操作系统存储管理相关功能;","具有很强的学习能力,自我驱动以及团队合作意识;","实习时间6个月以上,每周4~5天。"]},{title:"【加分项】",body:["熟悉Rust异步编程、有tokio或async-std使用经验优先;","熟悉分布式一致性协议Paxos或Raft、分布式KV存储etcd、有K8S的CSI接口编程经验优先;","有过开源项目/开源贡献经验者优先。"]}]},{id:"FPGA development".split(" ").join("-").toLowerCase(),label:"FPGA开发",tag:["实习"],workNature:"远程办公",workType:"internship",releaseTime:"2023-5-17",content:[{title:"【岗位职责】",body:["负责基于FPGA实现网络IO加速,以及加密、压缩、编码等算法加速的设计与RTL实现;","实现常用外设接口IP的RTL设计、集成和验证;","配合上层软件实现软硬件联调。"]},{title:"【岗位要求】",body:["熟悉基于FPGA的设计流程,熟悉Xilinx的FPGA芯片架构,熟练掌握Xilinx的FPGA开发工具;","熟练掌握Verilog、SystemVerilog以及SystemVerilog Assertion的使用;","熟练掌握TCL、Python脚本语言;","具有很强的学习能力,自我驱动以及团队合作意识;","实习时间6个月以上,每周4~5天。"]},{title:"【加分项】",body:["熟悉Bluespec、SpinalHDL、Chisel、Clash等至少一种新一代HDL语言;"," 熟悉CXL、PCIe、AXI、ACE、CHI等相关总线接口开发优先;","熟悉TCP/IP、RDMA、NVMe协议,有加密、压缩、编码开发经验优先。"]}]},{id:"The joint hardware and software research and development internship".split(" ").join("-").toLowerCase(),label:"软硬件联合研发实习生",tag:["实习"],workNature:"远程办公",workType:"internship",releaseTime:"2023-5-17",content:[{title:"【岗位职责】",body:["参与高性能存储SoC芯片的软硬件开发:","负责网络IO加速的RTL实现;","负责加密、压缩、编码等算法加速的设计与RTL实现;","负责SoC芯片的Linux驱动开发;","负责实现软硬件联合调试与自动化测试。"]},{title:"【岗位要求】",body:["熟悉IC设计流程,熟悉常用的仿真、综合等EDA工具;","熟悉Xilinx的FPGA设计流程,熟练掌握Xilinx的FPGA开发工具;","熟悉Bluespec、SpinalHDL、Chisel或Clash等新一代HDL语言;","熟悉Rust for Linux开发内核模块、驱动;","熟悉基于QEMU的软硬件联合调试工具链;","具有很强的学习能力,自我驱动以及团队合作意识。"]},{title:"【加分项】",body:["有网络或存储硬件系统开发经验优先;","熟悉TCP/IP或InfiniBand/RDMA网络协议栈优先;","熟悉CXL、PCIe、AXI、ACE、CHI、NVMe等协议接口开发优先;","有DSP领域相关经验,熟悉LDPC、喷泉码、椭圆曲线加密算法和零知识证明算法优先;","有Linux内核网络、文件、存储相关开发经验优先;","能长期实习(1年以上)优先。"]}]}],sB=()=>{const e=wt(),[t,r]=N.useState(ww),[n,i]=N.useState({fullTime:!0,internship:!0});return N.useEffect(()=>{r(ww.filter(o=>n[o.workType]===!0))},[n]),N.useEffect(()=>{window.scrollTo(0,0)},[]),l.jsx(MU,{children:l.jsxs(LU,{children:[l.jsx(AU,{children:l.jsxs($U,{children:[l.jsx(UU,{children:"筛选"}),l.jsx(BU,{children:"工作类型"}),l.jsxs(vw,{as:"div",children:[l.jsx(yw,{type:"checkbox",id:"full-time",checked:n.fullTime,onChange:()=>{const o={...n};o.fullTime=!o.fullTime,i(o)}}),l.jsx("label",{htmlFor:"full-time",children:"全职"})]}),l.jsxs(vw,{as:"div",children:[l.jsx(yw,{type:"checkbox",id:"internship",checked:n.internship,onChange:()=>{const o={...n};o.internship=!o.internship,i(o)}}),l.jsx("label",{htmlFor:"internship",children:"兼职"})]})]})}),l.jsx(IU,{children:l.jsx(GU,{children:t.map(o=>{const{id:a,label:c,tag:d,workNature:h,workType:g,releaseTime:v,content:x}=o;return l.jsxs(XU,{onClick:()=>{e(a.split(" ").join("-"))},children:[l.jsx(KU,{src:Xb}),l.jsxs(QU,{children:[l.jsx(qU,{children:d.join(", ")}),l.jsx(iB,{children:l.jsx(ZU,{children:c})}),l.jsxs(JU,{children:[l.jsx(Ih,{icon:Kb,children:h}),l.jsx(Ah,{children:"·"}),l.jsx(Ih,{icon:Qb,children:oB.get(g)}),l.jsx(Ah,{children:"·"}),l.jsx(Ah,{children:"·"}),l.jsx(Ih,{icon:qb,children:U(v,"YYYY-MM-DD").fromNow()})]}),x.map(({title:b,body:k})=>l.jsxs(eB,{children:[l.jsx(nB,{as:"p",children:b}),l.jsx(tB,{children:k.map(C=>l.jsx(rB,{as:"li",children:C},C))})]},b))]})]},a)})})}),l.jsxs(NU,{children:[l.jsxs(ek,{children:[l.jsx(YU,{children:"面试流程"}),l.jsx(pw,{children:"实习岗位:"}),l.jsxs(fi,{children:[l.jsx(hi,{children:"项目笔试"}),"- 两天"]}),l.jsxs(fi,{children:[l.jsx(hi,{children:"性能优化"})," - 不超过一周"]}),l.jsx(fi,{children:l.jsx(hi,{children:"交叉面试"})}),l.jsxs(fi,{children:[l.jsx(hi,{children:"思路 review"})," - 交流指导"]}),l.jsx("div",{style:{paddingBlock:"0.06rem"}}),l.jsx(pw,{children:"校招 / 社招岗位:"}),l.jsxs(fi,{children:[l.jsx(hi,{children:"项目笔试"})," - 两天"]}),l.jsxs(fi,{children:[l.jsx(hi,{children:"思路 review"})," - 交流指导"]}),l.jsxs(fi,{children:[l.jsx(hi,{children:"性能优化"})," - 不超过一周"]}),l.jsx(fi,{children:l.jsx(hi,{children:"交叉面试"})})]}),l.jsxs(zU,{children:[l.jsx(HU,{children:"投递简历"}),l.jsx(gw,{children:"- 投递至邮箱:"}),l.jsx(FU,{style:{paddingTop:"0.04rem"},children:l.jsx(VU,{children:"info@datenlord.com"})}),l.jsx("div",{style:{height:"0.24rem"}}),l.jsx(gw,{children:"- 添加达坦科技小助手微信:"}),l.jsx(WU,{src:Gb})]})]})]})})};U.updateLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY年MM月DD日",LLL:"YYYY年MM月DD日Ah点mm分",LLLL:"YYYY年MM月DD日ddddAh点mm分",l:"YYYY-M-D",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日dddd HH:mm"},meridiemParse:/凌晨|早上|上午|中午|下午|晚上/,meridiemHour:function(e,t){return e===12&&(e=0),t==="凌晨"||t==="早上"||t==="上午"?e:t==="下午"||t==="晚上"?e+12:e>=11?e:e+12},meridiem:function(e,t){const r=e*100+t;return r<600?"凌晨":r<900?"早上":r<1130?"上午":r<1230?"中午":r<1800?"下午":"晚上"},calendar:{sameDay:"[今天]LT",nextDay:"[明天]LT",nextWeek:"[下]ddddLT",lastDay:"[昨天]LT",lastWeek:"[上]ddddLT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(日|月|周)/,ordinal:function(e,t){switch(t){case"d":case"D":case"DDD":return e+"日";case"M":return e+"月";case"w":case"W":return e+"周";default:return e}},relativeTime:{future:"%s内",past:"%s前",s:"几秒",ss:"%d秒",m:"1分钟",mm:"%d分钟",h:"1小时",hh:"%d小时",d:"1天",dd:"%d天",M:"1个月",MM:"%d个月",y:"1年",yy:"%d年"},week:{dow:1,doy:4}});const{Heading:aB,Paragraph:lB}=Me,{CNTitleSmall:cB,CNHead5S:uB,CNTitleLarge:dB}=aB,{CNBodySmall:Vs,CNMarkSmall:fB,CNBodyLarge:hB,CNMarkMedium:tk,CNBodyMedium:rk}=lB,mB=f.div` +`,sB=new Map([["fullTime","全职"],["internship","兼职"]]),ww=[{id:"Distributed storage software development senior engineer".split(" ").join("-").toLowerCase(),label:"分布式存储软件开发资深工程师",tag:["全职","急招"],workNature:"远程办公",workType:"fullTime",releaseTime:"2023-5-17",content:[{title:"【岗位职责】",body:["参与开源分布式存储项目DatenLord的开发和维护;","完善DatenLord的测试,构建新的DatenLord测试框架;","提高DatenLord分布式性能表现。 "]},{title:"【岗位要求】",body:["至少5年的分布式系统开发或研究经验,最好是分布式存储系统研发或研究经验;","具有HDFS 、Ceph、GlusterFS等分布式存储系统具有相关开发和使用经验;","熟悉Rust、C或C++语言;","具有开源项目的开发和维护经验。"]}]},{id:"Rust distributed storage development".split(" ").join("-").toLowerCase(),label:"Rust分布式存储开发",tag:["实习","即将招满"],workNature:"远程办公",workType:"internship",releaseTime:"2023-5-17",content:[{title:"【岗位职责】",body:["参与高性能分布式存储系统研发,涉及的开发内容包括但不限于:","分布式存储系统开发;","分布式数据一致性协议研究和开发;","分布式缓存、数据管理服务;","使用 Rust 语言进行内核驱动开发。"]},{title:"【岗位要求】",body:["熟练使用Rust语言,熟悉多线程、高并发编程;","熟悉Linux操作系统存储管理相关功能;","具有很强的学习能力,自我驱动以及团队合作意识;","实习时间6个月以上,每周4~5天。"]},{title:"【加分项】",body:["熟悉Rust异步编程、有tokio或async-std使用经验优先;","熟悉分布式一致性协议Paxos或Raft、分布式KV存储etcd、有K8S的CSI接口编程经验优先;","有过开源项目/开源贡献经验者优先。"]}]},{id:"FPGA development".split(" ").join("-").toLowerCase(),label:"FPGA开发",tag:["实习"],workNature:"远程办公",workType:"internship",releaseTime:"2023-5-17",content:[{title:"【岗位职责】",body:["负责基于FPGA实现网络IO加速,以及加密、压缩、编码等算法加速的设计与RTL实现;","实现常用外设接口IP的RTL设计、集成和验证;","配合上层软件实现软硬件联调。"]},{title:"【岗位要求】",body:["熟悉基于FPGA的设计流程,熟悉Xilinx的FPGA芯片架构,熟练掌握Xilinx的FPGA开发工具;","熟练掌握Verilog、SystemVerilog以及SystemVerilog Assertion的使用;","熟练掌握TCL、Python脚本语言;","具有很强的学习能力,自我驱动以及团队合作意识;","实习时间6个月以上,每周4~5天。"]},{title:"【加分项】",body:["熟悉Bluespec、SpinalHDL、Chisel、Clash等至少一种新一代HDL语言;"," 熟悉CXL、PCIe、AXI、ACE、CHI等相关总线接口开发优先;","熟悉TCP/IP、RDMA、NVMe协议,有加密、压缩、编码开发经验优先。"]}]},{id:"The joint hardware and software research and development internship".split(" ").join("-").toLowerCase(),label:"软硬件联合研发实习生",tag:["实习"],workNature:"远程办公",workType:"internship",releaseTime:"2023-5-17",content:[{title:"【岗位职责】",body:["参与高性能存储SoC芯片的软硬件开发:","负责网络IO加速的RTL实现;","负责加密、压缩、编码等算法加速的设计与RTL实现;","负责SoC芯片的Linux驱动开发;","负责实现软硬件联合调试与自动化测试。"]},{title:"【岗位要求】",body:["熟悉IC设计流程,熟悉常用的仿真、综合等EDA工具;","熟悉Xilinx的FPGA设计流程,熟练掌握Xilinx的FPGA开发工具;","熟悉Bluespec、SpinalHDL、Chisel或Clash等新一代HDL语言;","熟悉Rust for Linux开发内核模块、驱动;","熟悉基于QEMU的软硬件联合调试工具链;","具有很强的学习能力,自我驱动以及团队合作意识。"]},{title:"【加分项】",body:["有网络或存储硬件系统开发经验优先;","熟悉TCP/IP或InfiniBand/RDMA网络协议栈优先;","熟悉CXL、PCIe、AXI、ACE、CHI、NVMe等协议接口开发优先;","有DSP领域相关经验,熟悉LDPC、喷泉码、椭圆曲线加密算法和零知识证明算法优先;","有Linux内核网络、文件、存储相关开发经验优先;","能长期实习(1年以上)优先。"]}]}],aB=()=>{const e=wt(),[t,r]=N.useState(ww),[n,i]=N.useState({fullTime:!0,internship:!0});return N.useEffect(()=>{r(ww.filter(o=>n[o.workType]===!0))},[n]),N.useEffect(()=>{window.scrollTo(0,0)},[]),l.jsx(LU,{children:l.jsxs(AU,{children:[l.jsx(IU,{children:l.jsxs(zU,{children:[l.jsx(BU,{children:"筛选"}),l.jsx(GU,{children:"工作类型"}),l.jsxs(vw,{as:"div",children:[l.jsx(yw,{type:"checkbox",id:"full-time",checked:n.fullTime,onChange:()=>{const o={...n};o.fullTime=!o.fullTime,i(o)}}),l.jsx("label",{htmlFor:"full-time",children:"全职"})]}),l.jsxs(vw,{as:"div",children:[l.jsx(yw,{type:"checkbox",id:"internship",checked:n.internship,onChange:()=>{const o={...n};o.internship=!o.internship,i(o)}}),l.jsx("label",{htmlFor:"internship",children:"兼职"})]})]})}),l.jsx(NU,{children:l.jsx(XU,{children:t.map(o=>{const{id:a,label:c,tag:d,workNature:h,workType:g,releaseTime:v,content:x}=o;return l.jsxs(KU,{onClick:()=>{e(a.split(" ").join("-"))},children:[l.jsx(QU,{src:Xb}),l.jsxs(qU,{children:[l.jsx(ZU,{children:d.join(", ")}),l.jsx(oB,{children:l.jsx(JU,{children:c})}),l.jsxs(eB,{children:[l.jsx(Ih,{icon:Kb,children:h}),l.jsx(Ah,{children:"·"}),l.jsx(Ih,{icon:Qb,children:sB.get(g)}),l.jsx(Ah,{children:"·"}),l.jsx(Ah,{children:"·"}),l.jsx(Ih,{icon:qb,children:U(v,"YYYY-MM-DD").fromNow()})]}),x.map(({title:b,body:k})=>l.jsxs(tB,{children:[l.jsx(iB,{as:"p",children:b}),l.jsx(rB,{children:k.map(C=>l.jsx(nB,{as:"li",children:C},C))})]},b))]})]},a)})})}),l.jsxs($U,{children:[l.jsxs(ek,{children:[l.jsx(FU,{children:"面试流程"}),l.jsx(pw,{children:"实习岗位:"}),l.jsxs(fi,{children:[l.jsx(hi,{children:"项目笔试"}),"- 两天"]}),l.jsxs(fi,{children:[l.jsx(hi,{children:"性能优化"})," - 不超过一周"]}),l.jsx(fi,{children:l.jsx(hi,{children:"交叉面试"})}),l.jsxs(fi,{children:[l.jsx(hi,{children:"思路 review"})," - 交流指导"]}),l.jsx("div",{style:{paddingBlock:"0.06rem"}}),l.jsx(pw,{children:"校招 / 社招岗位:"}),l.jsxs(fi,{children:[l.jsx(hi,{children:"项目笔试"})," - 两天"]}),l.jsxs(fi,{children:[l.jsx(hi,{children:"思路 review"})," - 交流指导"]}),l.jsxs(fi,{children:[l.jsx(hi,{children:"性能优化"})," - 不超过一周"]}),l.jsx(fi,{children:l.jsx(hi,{children:"交叉面试"})})]}),l.jsxs(HU,{children:[l.jsx(YU,{children:"投递简历"}),l.jsx(gw,{children:"- 投递至邮箱:"}),l.jsx(VU,{style:{paddingTop:"0.04rem"},children:l.jsx(WU,{children:"info@datenlord.com"})}),l.jsx("div",{style:{height:"0.24rem"}}),l.jsx(gw,{children:"- 添加达坦科技小助手微信:"}),l.jsx(UU,{src:Gb})]})]})]})})};U.updateLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY年MM月DD日",LLL:"YYYY年MM月DD日Ah点mm分",LLLL:"YYYY年MM月DD日ddddAh点mm分",l:"YYYY-M-D",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日dddd HH:mm"},meridiemParse:/凌晨|早上|上午|中午|下午|晚上/,meridiemHour:function(e,t){return e===12&&(e=0),t==="凌晨"||t==="早上"||t==="上午"?e:t==="下午"||t==="晚上"?e+12:e>=11?e:e+12},meridiem:function(e,t){const r=e*100+t;return r<600?"凌晨":r<900?"早上":r<1130?"上午":r<1230?"中午":r<1800?"下午":"晚上"},calendar:{sameDay:"[今天]LT",nextDay:"[明天]LT",nextWeek:"[下]ddddLT",lastDay:"[昨天]LT",lastWeek:"[上]ddddLT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(日|月|周)/,ordinal:function(e,t){switch(t){case"d":case"D":case"DDD":return e+"日";case"M":return e+"月";case"w":case"W":return e+"周";default:return e}},relativeTime:{future:"%s内",past:"%s前",s:"几秒",ss:"%d秒",m:"1分钟",mm:"%d分钟",h:"1小时",hh:"%d小时",d:"1天",dd:"%d天",M:"1个月",MM:"%d个月",y:"1年",yy:"%d年"},week:{dow:1,doy:4}});const{Heading:lB,Paragraph:cB}=Me,{CNTitleSmall:uB,CNHead5S:dB,CNTitleLarge:fB}=lB,{CNBodySmall:Vs,CNMarkSmall:hB,CNBodyLarge:mB,CNMarkMedium:tk,CNBodyMedium:rk}=cB,pB=f.div` background: #fafafa; -`,pB=f.div` +`,gB=f.div` display: flex; max-width: 1440px; margin-inline: auto; @@ -2414,12 +2414,12 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ @media screen and (max-width: 1024px) { flex-direction: column; } -`,gB=f.main` +`,vB=f.main` flex-grow: 1; @media screen and (max-width: 1024px) { order: 3; } -`,vB=f.aside` +`,yB=f.aside` width: 250px; margin-left: 0.48rem; @media screen and (max-width: 1024px) { @@ -2437,11 +2437,11 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ :last-child { margin-bottom: 0; } -`,yB=f(nk)` +`,wB=f(nk)` position: sticky; top: calc(84px + 48px); left: 0; -`,_w=f(cB)` +`,_w=f(uB)` padding-bottom: 0.11rem; color: #7680dd; `,xw=f.div` @@ -2455,7 +2455,7 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ } `,Sw=f.span` font-weight: 600; -`,wB=f(Vs)` +`,_B=f(Vs)` padding-bottom: 0.11rem; position: relative; padding-left: 0.24rem; @@ -2465,23 +2465,23 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ left: 0; content: '📨'; } -`,_B=f(Vs)` +`,xB=f(Vs)` font-weight: 600; padding-bottom: 0.24rem; -`,xB=f(tk)` - font-weight: 600; `,SB=f(tk)` + font-weight: 600; +`,bB=f(tk)` padding-bottom: 0.11rem; -`,bB=f(Vs)` +`,kB=f(Vs)` font-weight: 400; -`,kB=f.span` +`,CB=f.span` color: #7680dd; -`,CB=f.img` +`,DB=f.img` display: block; width: 0.8rem; padding-top: 0.12rem; margin-inline: auto; -`,DB=f.section` +`,EB=f.section` padding-bottom: 0.96rem; min-height: 200px; color: rgba(20, 20, 20, 0.7); @@ -2496,13 +2496,13 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ :last-child { margin-bottom: 0; } -`,EB=f(ik)` +`,TB=f(ik)` flex-direction: column; -`,TB=f.div` +`,jB=f.div` display: flex; justify-content: space-between; padding-bottom: 0.24rem; -`,jB=f.img` +`,OB=f.img` height: min-content; width: 0.625rem; margin-right: 0.22rem; @@ -2512,15 +2512,15 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ `;const bw=f.div` flex-grow: 1; position: relative; -`,OB=f(fB)` - color: #7767a0; `,PB=f(hB)` + color: #7767a0; +`,RB=f(mB)` margin-bottom: 0.07rem; color: #141414; -`,RB=f(dB)` +`,MB=f(fB)` padding-bottom: 0.08rem; color: ${e=>e.theme.gray007}; -`,MB=f.div` +`,LB=f.div` display: flex; margin-bottom: 0.13rem; @media screen and (max-width: 1024px) { @@ -2555,9 +2555,9 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ } `,Cw=f.ol` padding-left: 0.24rem; -`,LB=f(Vs)``,AB=f(rk)``,IB=f(Vs)` +`,AB=f(Vs)``,IB=f(rk)``,NB=f(Vs)` color: #7680dd; -`,NB=f(rk)``,$B=f.button` +`,$B=f(rk)``,zB=f.button` padding-inline: 0.18rem; color: ${e=>e.theme.gray007}; font-size: 0.14rem; @@ -2572,13 +2572,13 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ display: flex; align-items: center; justify-content: space-between; -`,zB=f.div``,HB=f(uB)``,YB=f.div` +`,HB=f.div``,YB=f(dB)``,FB=f.div` padding-top: 0.5rem; display: grid; grid-template-columns: repeat(2, 1fr); grid-template-rows: repeat(1, 1fr); grid-gap: 0.26rem; -`,FB=f.div` +`,VB=f.div` display: flex; justify-content: center; align-items: center; @@ -2586,24 +2586,24 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ height: 0.48rem; background: ${e=>e.theme.secondary02}; border-radius: 50%; -`,VB=f.img` +`,WB=f.img` width: 0.32rem; height: 0.32rem; -`,WB=new Map([["fullTime","全职"],["internship","兼职"]]),Ew=[{id:"Distributed storage software development senior engineer".split(" ").join("-").toLowerCase(),label:"分布式存储软件开发资深工程师",tag:["全职","急招"],workNature:"远程办公",workType:"fullTime",releaseTime:"2023-5-17",content:[{title:"【岗位职责】",body:["参与开源分布式存储项目DatenLord的开发和维护;","完善DatenLord的测试,构建新的DatenLord测试框架;","提高DatenLord分布式性能表现。 "]},{title:"【岗位要求】",body:["至少5年的分布式系统开发或研究经验,最好是分布式存储系统研发或研究经验;","具有HDFS 、Ceph、GlusterFS等分布式存储系统具有相关开发和使用经验;","熟悉Rust、C或C++语言;","具有开源项目的开发和维护经验。"]}]},{id:"Rust distributed storage development".split(" ").join("-").toLowerCase(),label:"Rust分布式存储开发",tag:["实习","即将招满"],workNature:"远程办公",workType:"internship",releaseTime:"2023-5-17",content:[{title:"【岗位职责】",body:["参与高性能分布式存储系统研发,涉及的开发内容包括但不限于:","分布式存储系统开发;","分布式数据一致性协议研究和开发;","分布式缓存、数据管理服务;","使用 Rust 语言进行内核驱动开发。"]},{title:"【岗位要求】",body:["熟练使用Rust语言,熟悉多线程、高并发编程;","熟悉Linux操作系统存储管理相关功能;","具有很强的学习能力,自我驱动以及团队合作意识;","实习时间6个月以上,每周4~5天。"]},{title:"【加分项】",body:["熟悉Rust异步编程、有tokio或async-std使用经验优先;","熟悉分布式一致性协议Paxos或Raft、分布式KV存储etcd、有K8S的CSI接口编程经验优先;","有过开源项目/开源贡献经验者优先。"]}]},{id:"FPGA development".split(" ").join("-").toLowerCase(),label:"FPGA开发",tag:["实习"],workNature:"远程办公",workType:"internship",releaseTime:"2023-5-17",content:[{title:"【岗位职责】",body:["负责基于FPGA实现网络IO加速,以及加密、压缩、编码等算法加速的设计与RTL实现;","实现常用外设接口IP的RTL设计、集成和验证;","配合上层软件实现软硬件联调。"]},{title:"【岗位要求】",body:["熟悉基于FPGA的设计流程,熟悉Xilinx的FPGA芯片架构,熟练掌握Xilinx的FPGA开发工具;","熟练掌握Verilog、SystemVerilog以及SystemVerilog Assertion的使用;","熟练掌握TCL、Python脚本语言;","具有很强的学习能力,自我驱动以及团队合作意识;","实习时间6个月以上,每周4~5天。"]},{title:"【加分项】",body:["熟悉Bluespec、SpinalHDL、Chisel、Clash等至少一种新一代HDL语言;"," 熟悉CXL、PCIe、AXI、ACE、CHI等相关总线接口开发优先;","熟悉TCP/IP、RDMA、NVMe协议,有加密、压缩、编码开发经验优先。"]}]},{id:"The joint hardware and software research and development internship".split(" ").join("-").toLowerCase(),label:"软硬件联合研发实习生",tag:["实习"],workNature:"远程办公",workType:"internship",releaseTime:"2023-5-17",content:[{title:"【岗位职责】",body:["参与高性能存储SoC芯片的软硬件开发:","负责网络IO加速的RTL实现;","负责加密、压缩、编码等算法加速的设计与RTL实现;","负责SoC芯片的Linux驱动开发;","负责实现软硬件联合调试与自动化测试。"]},{title:"【岗位要求】",body:["熟悉IC设计流程,熟悉常用的仿真、综合等EDA工具;","熟悉Xilinx的FPGA设计流程,熟练掌握Xilinx的FPGA开发工具;","熟悉Bluespec、SpinalHDL、Chisel或Clash等新一代HDL语言;","熟悉Rust for Linux开发内核模块、驱动;","熟悉基于QEMU的软硬件联合调试工具链;","具有很强的学习能力,自我驱动以及团队合作意识。"]},{title:"【加分项】",body:["有网络或存储硬件系统开发经验优先;","熟悉TCP/IP或InfiniBand/RDMA网络协议栈优先;","熟悉CXL、PCIe、AXI、ACE、CHI、NVMe等协议接口开发优先;","有DSP领域相关经验,熟悉LDPC、喷泉码、椭圆曲线加密算法和零知识证明算法优先;","有Linux内核网络、文件、存储相关开发经验优先;","能长期实习(1年以上)优先。"]}]}],UB=()=>{const e=wt(),{key:t}=gn();N.useEffect(()=>{window.scrollTo(0,0)},[t]);const r=Ew.filter(({id:n})=>n!==t);return l.jsx(mB,{children:l.jsxs(pB,{children:[l.jsxs(gB,{children:[l.jsx(DB,{children:Ew.map(n=>{const{id:i,label:o,tag:a,workNature:c,workType:d,releaseTime:h,content:g}=n;return t===i?l.jsxs(ik,{children:[l.jsx(jB,{src:Xb}),l.jsxs(bw,{children:[l.jsx(OB,{children:a.join(", ")}),l.jsx(Dw,{children:l.jsx(PB,{children:o})}),l.jsxs(MB,{children:[l.jsx($h,{icon:Kb,children:c}),l.jsx(Nh,{children:"·"}),l.jsx($h,{icon:Qb,children:WB.get(d)}),l.jsx(Nh,{children:"·"}),l.jsx(Nh,{children:"·"}),l.jsx($h,{icon:qb,children:U(h,"YYYY-MM-DD").fromNow()})]}),g.map(({title:v,body:x})=>l.jsxs(kw,{children:[l.jsx(IB,{as:"p",children:v}),l.jsx(Cw,{children:x.map(b=>l.jsx(LB,{as:"li",children:b},b))})]},v))]})]},i):null})}),l.jsxs(zB,{children:[l.jsx(HB,{children:"相关岗位"}),l.jsx(YB,{children:r.map((n,i)=>{const{id:o,label:a,content:c}=n;return i<2?l.jsxs(EB,{children:[l.jsxs(TB,{children:[l.jsx(FB,{children:l.jsx(VB,{src:ZS})}),l.jsx($B,{onClick:()=>e(`/job-description/${o}`),children:"岗位详情"})]}),l.jsxs(bw,{children:[l.jsx(Dw,{children:l.jsx(RB,{children:a})}),c.map(({title:d,body:h},g)=>{if(g===0)return l.jsxs(kw,{children:[l.jsx(NB,{as:"p",children:d}),l.jsx(Cw,{children:h.map(v=>l.jsx(AB,{as:"li",children:v},v))})]},d)})]})]},o):null})})]})]}),l.jsxs(vB,{children:[l.jsxs(nk,{children:[l.jsx(xB,{children:"简历评估合格后,面试流程为:"}),l.jsx(SB,{children:"具体面试流程会根据候选人的情况略有调整。"}),l.jsx(_w,{children:"实习生:"}),l.jsxs(xw,{children:[l.jsx(Sw,{children:"入职初期为300元/天,"}),"如能力和产出优秀将予以薪资调增,最高500元/天。"]}),l.jsx(_w,{children:"正式员工:"}),l.jsxs(xw,{children:[l.jsx(Sw,{children:"对标国内一线大厂的薪资+期权,"}),"待面试通过后根据能力情况确定。"]})]}),l.jsxs(yB,{children:[l.jsx(wB,{children:"面试流程"}),l.jsx(_B,{children:"- 简历投递至邮箱:"}),l.jsxs(bB,{children:[l.jsx(kB,{children:"info@datenlord.com"}),"或扫描微信联系也可以喔~"]}),l.jsx(CB,{src:Gb})]})]})]})})},BB="/zh-cn/assets/cover-ab5b198b.png",GB="/zh-cn/assets/right-arrow-32ec3014.svg",XB="data:image/png;base64,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",KB="/zh-cn/assets/bg-bg-3abf4aa0.png",QB="data:image/png;base64,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",qB="/zh-cn/assets/cont-del-ill-f7f1f3a0.png",ZB="data:image/png;base64,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",JB="/zh-cn/assets/hl-ill-ab994ba5.png",Lo="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC4AAAAuCAYAAABXuSs3AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAVDSURBVHgB7Vm9bxxFFH9v9j7sKLEJJAVgSGRRQBpTUpqGliY9CEUCKUqUihICXSSkGEcUNBGU/AOpKUBJgcCRUChxYSJAoAQbiH13Oy/va/bD8Z1zt1e4uOcbz97u7OzvvfnN7z2vAWY2s5kdScNRF4lolbu3uS3uG0sj5iHYP2/Uzz9EsNFq4VcwBRsKnEF//Odfvav3f+/BYEDQyPz206fa8PLS3AYivImID6GBHQicQZ/d+Xfw650ftmES48gCg9N+//nlM/Nw5qXuJ91udhUaWBhyflUiPYklsDGSHhP3chxz0uOt+7uQD2gFGlpr2IX+GPR4IrICmheTFLld1yH8i0HDoE/PQENrwRRMaREFl0dZWxnxdE6BZwC7uzlCQ2sMPEW7BjoaVfhjFKkAD0zO3i413O0NgRegqWwxGljp85xKrnv0kbfVo/+PRMSpBlo4LIDz3KMeU9RJV0KW4eGD/gI0tGGqIjpJowHXj2OeAJPq/qAfoS+tF6EnbY+8z+HBH/1Xr125d+vapbtLMG3gdEhWTYCLaBMWkVbg3Pq91Az83h633Qj/MVXYzoWs8931Sz+fhwksQBMrNqJH3AEr6L61nkYeFLw4YVGPxQTM9o8mifzEwE2bybntNIkW7aoDrNlKG+vNGemTIeBCBtl7MKZNBLyqJpGokL6S41CCTg6kPaAUKvKRtgA0Nl0aRJxK+YslaAXOoc8H9XNJbWIu500OsdxHi+tj0mVs4NUNWUs4OTgo7ys1il7zpJS7RLLjBh6FLYH+hkdjVXSNNmc14lXNrmp4mf5Nx1MGTVPYT9w+BvNjafuEHKcaoAQyd64nkLGS+otCS+5H5A8WPOe4L3QJv1+/ePez9QtPR5kJI45FtG2D2iYtahQF61GmfamMtG4scgQGZTp7oY6cxw7dWn//x3OHIZiQ4yUS56uBLniP9T3gsmlIK45E95qgqo8L7Mw36xfuLE0VeOkAVWQR66UsVHiBVIu4hjoYTSTa6VJALDzjoxNZq3MFpgW8Gm1dcKhw3U6WtUK1YEAstc8P0x6t0sYfIlMLsLdgWsANgz0HFTqaC7h/RtRxijf1FU9CZrf5jOI6FstnU8oGXhhFl2a1Cj8hhBKkHAe0PxZq3/2cfuc+y3R8IppuzFhO6eAJOnlnqEQ2qMexeBIWwBwcRzQrd6ORwfmf8XUGrozz9aLgPohG6qxRb8be8d4WTBt4AoveJIqxZZptXLdViGjKY2wgaPG4VlulxUlhkPW4KlcYbl++8cb2VICndyVGjTLSWWZpXkApYH5vJdckg3I4C70XmDKm01EukRbxpuyke0YiIBOxhRg/HYVlLODpRU9yQmkRZfn5WjGTkVQd8rqFYqnp7RZCtxuSwgjBn/iLhR24/sGXK/dgWsCrb6dMMUQh6o8VPQ7BK8GM/IUQ+msKNOBzwdSTyCXFjKm9zbFYu/jFys3DsDTiuFBGc4lokzyeZ8uFQr5JrQRAz6zWd9oBjh0PO7wwO3z/CR7OPKbfmDm3ea6bl2+8vvU0z58IeMH1YMsckvi6LEYutyl4dRhTZvWItxFOv9D55cO111ahgY0NvEw2VnMINQSkltWJPgi1IoxcZQR8mzfm3FzzF2jDEtDmycXDJzegpi4YoEguWcu432oFbmitbe3Us23ozuMGNLRwMCD89sXnu18vn53Thw4D7WM9I2ItCakDmTvi7TkG/crysc12l9agoY18d8JL+y537xxwT5mYOeAxUuUWFmX5qv+FkMwTKMoO1THhJ+z3Pp8/Ob8JM5vZzGZ2pOwx917POGoSrr0AAAAASUVORK5CYII=",eG="data:image/png;base64,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",tG="/zh-cn/assets/spy-bg1-ba75fb2e.png",rG="/zh-cn/assets/spy-bg2-d3211011.png",nG="/zh-cn/assets/spy-bg3-a41ded57.png",iG="/zh-cn/assets/spy-bg4-5446dcc4.png",oG="/zh-cn/assets/foot-reg-qr-03a7d7e1.png",sG="/zh-cn/assets/foot-ass-qr-e467649e.png",{Heading:aG,Paragraph:lG}=Me,{CNHead1:cG,CNHead5:ok,CNTitleLarge:sk}=aG,{CNBodyLarge:El,CNBodyMedium:uG}=lG,dG=f.div` +`,UB=new Map([["fullTime","全职"],["internship","兼职"]]),Ew=[{id:"Distributed storage software development senior engineer".split(" ").join("-").toLowerCase(),label:"分布式存储软件开发资深工程师",tag:["全职","急招"],workNature:"远程办公",workType:"fullTime",releaseTime:"2023-5-17",content:[{title:"【岗位职责】",body:["参与开源分布式存储项目DatenLord的开发和维护;","完善DatenLord的测试,构建新的DatenLord测试框架;","提高DatenLord分布式性能表现。 "]},{title:"【岗位要求】",body:["至少5年的分布式系统开发或研究经验,最好是分布式存储系统研发或研究经验;","具有HDFS 、Ceph、GlusterFS等分布式存储系统具有相关开发和使用经验;","熟悉Rust、C或C++语言;","具有开源项目的开发和维护经验。"]}]},{id:"Rust distributed storage development".split(" ").join("-").toLowerCase(),label:"Rust分布式存储开发",tag:["实习","即将招满"],workNature:"远程办公",workType:"internship",releaseTime:"2023-5-17",content:[{title:"【岗位职责】",body:["参与高性能分布式存储系统研发,涉及的开发内容包括但不限于:","分布式存储系统开发;","分布式数据一致性协议研究和开发;","分布式缓存、数据管理服务;","使用 Rust 语言进行内核驱动开发。"]},{title:"【岗位要求】",body:["熟练使用Rust语言,熟悉多线程、高并发编程;","熟悉Linux操作系统存储管理相关功能;","具有很强的学习能力,自我驱动以及团队合作意识;","实习时间6个月以上,每周4~5天。"]},{title:"【加分项】",body:["熟悉Rust异步编程、有tokio或async-std使用经验优先;","熟悉分布式一致性协议Paxos或Raft、分布式KV存储etcd、有K8S的CSI接口编程经验优先;","有过开源项目/开源贡献经验者优先。"]}]},{id:"FPGA development".split(" ").join("-").toLowerCase(),label:"FPGA开发",tag:["实习"],workNature:"远程办公",workType:"internship",releaseTime:"2023-5-17",content:[{title:"【岗位职责】",body:["负责基于FPGA实现网络IO加速,以及加密、压缩、编码等算法加速的设计与RTL实现;","实现常用外设接口IP的RTL设计、集成和验证;","配合上层软件实现软硬件联调。"]},{title:"【岗位要求】",body:["熟悉基于FPGA的设计流程,熟悉Xilinx的FPGA芯片架构,熟练掌握Xilinx的FPGA开发工具;","熟练掌握Verilog、SystemVerilog以及SystemVerilog Assertion的使用;","熟练掌握TCL、Python脚本语言;","具有很强的学习能力,自我驱动以及团队合作意识;","实习时间6个月以上,每周4~5天。"]},{title:"【加分项】",body:["熟悉Bluespec、SpinalHDL、Chisel、Clash等至少一种新一代HDL语言;"," 熟悉CXL、PCIe、AXI、ACE、CHI等相关总线接口开发优先;","熟悉TCP/IP、RDMA、NVMe协议,有加密、压缩、编码开发经验优先。"]}]},{id:"The joint hardware and software research and development internship".split(" ").join("-").toLowerCase(),label:"软硬件联合研发实习生",tag:["实习"],workNature:"远程办公",workType:"internship",releaseTime:"2023-5-17",content:[{title:"【岗位职责】",body:["参与高性能存储SoC芯片的软硬件开发:","负责网络IO加速的RTL实现;","负责加密、压缩、编码等算法加速的设计与RTL实现;","负责SoC芯片的Linux驱动开发;","负责实现软硬件联合调试与自动化测试。"]},{title:"【岗位要求】",body:["熟悉IC设计流程,熟悉常用的仿真、综合等EDA工具;","熟悉Xilinx的FPGA设计流程,熟练掌握Xilinx的FPGA开发工具;","熟悉Bluespec、SpinalHDL、Chisel或Clash等新一代HDL语言;","熟悉Rust for Linux开发内核模块、驱动;","熟悉基于QEMU的软硬件联合调试工具链;","具有很强的学习能力,自我驱动以及团队合作意识。"]},{title:"【加分项】",body:["有网络或存储硬件系统开发经验优先;","熟悉TCP/IP或InfiniBand/RDMA网络协议栈优先;","熟悉CXL、PCIe、AXI、ACE、CHI、NVMe等协议接口开发优先;","有DSP领域相关经验,熟悉LDPC、喷泉码、椭圆曲线加密算法和零知识证明算法优先;","有Linux内核网络、文件、存储相关开发经验优先;","能长期实习(1年以上)优先。"]}]}],BB=()=>{const e=wt(),{key:t}=gn();N.useEffect(()=>{window.scrollTo(0,0)},[t]);const r=Ew.filter(({id:n})=>n!==t);return l.jsx(pB,{children:l.jsxs(gB,{children:[l.jsxs(vB,{children:[l.jsx(EB,{children:Ew.map(n=>{const{id:i,label:o,tag:a,workNature:c,workType:d,releaseTime:h,content:g}=n;return t===i?l.jsxs(ik,{children:[l.jsx(OB,{src:Xb}),l.jsxs(bw,{children:[l.jsx(PB,{children:a.join(", ")}),l.jsx(Dw,{children:l.jsx(RB,{children:o})}),l.jsxs(LB,{children:[l.jsx($h,{icon:Kb,children:c}),l.jsx(Nh,{children:"·"}),l.jsx($h,{icon:Qb,children:UB.get(d)}),l.jsx(Nh,{children:"·"}),l.jsx(Nh,{children:"·"}),l.jsx($h,{icon:qb,children:U(h,"YYYY-MM-DD").fromNow()})]}),g.map(({title:v,body:x})=>l.jsxs(kw,{children:[l.jsx(NB,{as:"p",children:v}),l.jsx(Cw,{children:x.map(b=>l.jsx(AB,{as:"li",children:b},b))})]},v))]})]},i):null})}),l.jsxs(HB,{children:[l.jsx(YB,{children:"相关岗位"}),l.jsx(FB,{children:r.map((n,i)=>{const{id:o,label:a,content:c}=n;return i<2?l.jsxs(TB,{children:[l.jsxs(jB,{children:[l.jsx(VB,{children:l.jsx(WB,{src:ZS})}),l.jsx(zB,{onClick:()=>e(`/job-description/${o}`),children:"岗位详情"})]}),l.jsxs(bw,{children:[l.jsx(Dw,{children:l.jsx(MB,{children:a})}),c.map(({title:d,body:h},g)=>{if(g===0)return l.jsxs(kw,{children:[l.jsx($B,{as:"p",children:d}),l.jsx(Cw,{children:h.map(v=>l.jsx(IB,{as:"li",children:v},v))})]},d)})]})]},o):null})})]})]}),l.jsxs(yB,{children:[l.jsxs(nk,{children:[l.jsx(SB,{children:"简历评估合格后,面试流程为:"}),l.jsx(bB,{children:"具体面试流程会根据候选人的情况略有调整。"}),l.jsx(_w,{children:"实习生:"}),l.jsxs(xw,{children:[l.jsx(Sw,{children:"入职初期为300元/天,"}),"如能力和产出优秀将予以薪资调增,最高500元/天。"]}),l.jsx(_w,{children:"正式员工:"}),l.jsxs(xw,{children:[l.jsx(Sw,{children:"对标国内一线大厂的薪资+期权,"}),"待面试通过后根据能力情况确定。"]})]}),l.jsxs(wB,{children:[l.jsx(_B,{children:"面试流程"}),l.jsx(xB,{children:"- 简历投递至邮箱:"}),l.jsxs(kB,{children:[l.jsx(CB,{children:"info@datenlord.com"}),"或扫描微信联系也可以喔~"]}),l.jsx(DB,{src:Gb})]})]})]})})},GB="/zh-cn/assets/cover-ab5b198b.png",XB="/zh-cn/assets/right-arrow-32ec3014.svg",KB="data:image/png;base64,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",QB="/zh-cn/assets/bg-bg-3abf4aa0.png",qB="data:image/png;base64,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",ZB="/zh-cn/assets/cont-del-ill-f7f1f3a0.png",JB="data:image/png;base64,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",eG="/zh-cn/assets/hl-ill-ab994ba5.png",Lo="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC4AAAAuCAYAAABXuSs3AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAVDSURBVHgB7Vm9bxxFFH9v9j7sKLEJJAVgSGRRQBpTUpqGliY9CEUCKUqUihICXSSkGEcUNBGU/AOpKUBJgcCRUChxYSJAoAQbiH13Oy/va/bD8Z1zt1e4uOcbz97u7OzvvfnN7z2vAWY2s5kdScNRF4lolbu3uS3uG0sj5iHYP2/Uzz9EsNFq4VcwBRsKnEF//Odfvav3f+/BYEDQyPz206fa8PLS3AYivImID6GBHQicQZ/d+Xfw650ftmES48gCg9N+//nlM/Nw5qXuJ91udhUaWBhyflUiPYklsDGSHhP3chxz0uOt+7uQD2gFGlpr2IX+GPR4IrICmheTFLld1yH8i0HDoE/PQENrwRRMaREFl0dZWxnxdE6BZwC7uzlCQ2sMPEW7BjoaVfhjFKkAD0zO3i413O0NgRegqWwxGljp85xKrnv0kbfVo/+PRMSpBlo4LIDz3KMeU9RJV0KW4eGD/gI0tGGqIjpJowHXj2OeAJPq/qAfoS+tF6EnbY+8z+HBH/1Xr125d+vapbtLMG3gdEhWTYCLaBMWkVbg3Pq91Az83h633Qj/MVXYzoWs8931Sz+fhwksQBMrNqJH3AEr6L61nkYeFLw4YVGPxQTM9o8mifzEwE2bybntNIkW7aoDrNlKG+vNGemTIeBCBtl7MKZNBLyqJpGokL6S41CCTg6kPaAUKvKRtgA0Nl0aRJxK+YslaAXOoc8H9XNJbWIu500OsdxHi+tj0mVs4NUNWUs4OTgo7ys1il7zpJS7RLLjBh6FLYH+hkdjVXSNNmc14lXNrmp4mf5Nx1MGTVPYT9w+BvNjafuEHKcaoAQyd64nkLGS+otCS+5H5A8WPOe4L3QJv1+/ePez9QtPR5kJI45FtG2D2iYtahQF61GmfamMtG4scgQGZTp7oY6cxw7dWn//x3OHIZiQ4yUS56uBLniP9T3gsmlIK45E95qgqo8L7Mw36xfuLE0VeOkAVWQR66UsVHiBVIu4hjoYTSTa6VJALDzjoxNZq3MFpgW8Gm1dcKhw3U6WtUK1YEAstc8P0x6t0sYfIlMLsLdgWsANgz0HFTqaC7h/RtRxijf1FU9CZrf5jOI6FstnU8oGXhhFl2a1Cj8hhBKkHAe0PxZq3/2cfuc+y3R8IppuzFhO6eAJOnlnqEQ2qMexeBIWwBwcRzQrd6ORwfmf8XUGrozz9aLgPohG6qxRb8be8d4WTBt4AoveJIqxZZptXLdViGjKY2wgaPG4VlulxUlhkPW4KlcYbl++8cb2VICndyVGjTLSWWZpXkApYH5vJdckg3I4C70XmDKm01EukRbxpuyke0YiIBOxhRg/HYVlLODpRU9yQmkRZfn5WjGTkVQd8rqFYqnp7RZCtxuSwgjBn/iLhR24/sGXK/dgWsCrb6dMMUQh6o8VPQ7BK8GM/IUQ+msKNOBzwdSTyCXFjKm9zbFYu/jFys3DsDTiuFBGc4lokzyeZ8uFQr5JrQRAz6zWd9oBjh0PO7wwO3z/CR7OPKbfmDm3ea6bl2+8vvU0z58IeMH1YMsckvi6LEYutyl4dRhTZvWItxFOv9D55cO111ahgY0NvEw2VnMINQSkltWJPgi1IoxcZQR8mzfm3FzzF2jDEtDmycXDJzegpi4YoEguWcu432oFbmitbe3Us23ozuMGNLRwMCD89sXnu18vn53Thw4D7WM9I2ItCakDmTvi7TkG/crysc12l9agoY18d8JL+y537xxwT5mYOeAxUuUWFmX5qv+FkMwTKMoO1THhJ+z3Pp8/Ob8JM5vZzGZ2pOwx917POGoSrr0AAAAASUVORK5CYII=",tG="data:image/png;base64,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",rG="/zh-cn/assets/spy-bg1-ba75fb2e.png",nG="/zh-cn/assets/spy-bg2-d3211011.png",iG="/zh-cn/assets/spy-bg3-a41ded57.png",oG="/zh-cn/assets/spy-bg4-5446dcc4.png",sG="/zh-cn/assets/foot-reg-qr-03a7d7e1.png",aG="/zh-cn/assets/foot-ass-qr-e467649e.png",{Heading:lG,Paragraph:cG}=Me,{CNHead1:uG,CNHead5:ok,CNTitleLarge:sk}=lG,{CNBodyLarge:El,CNBodyMedium:dG}=cG,fG=f.div` display: flex; flex-direction: column; align-items: center; margin-top: -0.72rem; padding-top: 0.72rem; - background-image: url(${BB}); + background-image: url(${GB}); background-size: cover; -`,fG=f(cG)` +`,hG=f(uG)` padding-top: 1.68rem; color: #fff; -`,hG=f(fn)` +`,mG=f(fn)` margin-top: 0.46rem; color: #fff; -`,mG=f.div` +`,pG=f.div` display: flex; align-items: center; margin-top: 0.91rem; @@ -2613,13 +2613,13 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ border: 0.01rem solid #fff; border-radius: 0.12rem; cursor: pointer; -`,pG=f.div` +`,gG=f.div` padding-right: 0.12rem; font-size: 0.2rem; font-weight: 400; line-height: 1; color: #fff; -`,gG=f.img` +`,vG=f.img` height: 0.2rem; width: 0.2rem; `,Tl=f.div` @@ -2638,11 +2638,11 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ `,sf=f.div` font-size: 0.4rem; font-weight: 600; -`,vG=f(Tl)``,yG=f(jl)` +`,yG=f(Tl)``,wG=f(jl)` padding-block: 0.7rem 1.17rem; -`,wG=f(of)``,_G=f(sf)``,xG=f(El)` +`,_G=f(of)``,xG=f(sf)``,SG=f(El)` padding-top: 0.61rem; -`,SG=f.div` +`,bG=f.div` display: flex; gap: 0.39rem; padding-top: 0.59rem; @@ -2660,46 +2660,46 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ color: #626262; font-size: 0.16rem; line-height: 0.2956rem; -`,bG=f(El)` +`,kG=f(El)` padding-top: 0.87rem; -`,kG=f.img` +`,CG=f.img` position: absolute; z-index: -100; top: 0; width: 100%; height: 100%; -`,CG=f(Tl)` +`,DG=f(Tl)` background: linear-gradient( 106deg, #e4f4ff -1.1%, #f9fcff 47.11%, #edf6fc 102.52% ); -`,DG=f(jl)` +`,EG=f(jl)` min-height: 6.4rem; padding-block: 0.7rem 1.49rem; -`,EG=f(of)` +`,TG=f(of)` height: 0.26rem; -`,TG=f(sf)``,jG=f.div` +`,jG=f(sf)``,OG=f.div` display: flex; margin-top: 0.8rem; background: #fff; border-radius: 0.16rem; -`,OG=f.div` +`,PG=f.div` padding: 0.49rem 0.38rem 0.82rem; -`,PG=f(ok)` +`,RG=f(ok)` color: #000; `,bc=f(El)` padding-top: 0.32rem; color: #565960; -`,RG=f.div` +`,MG=f.div` position: relative; display: flex; align-items: center; justify-content: space-between; gap: 0.21rem; padding-top: 0.48rem; -`,MG=f.div` +`,LG=f.div` position: absolute; bottom: 0.6rem; left: 0; @@ -2734,20 +2734,20 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ padding-top: 0.23rem; color: #000; font-weight: 600; -`,LG=f.img` +`,AG=f.img` margin-top: -0.13rem; width: 4.2rem; border-radius: 0.16rem; -`,AG=f.div` +`,IG=f.div` margin-top: 0.8rem; padding-inline: 0.36rem; -`,IG=f(ok)` +`,NG=f(ok)` color: #000; -`,NG=f.div` +`,$G=f.div` margin-top: calc(1.12rem - 0.8rem); width: min-content; margin-inline: auto; -`,$G=f.div` +`,zG=f.div` display: flex; align-items: center; font-size: 0.2rem; @@ -2757,14 +2757,14 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ padding-block: 0.14rem; border-radius: 0.08rem; margin-bottom: 0.38rem; -`,zG=f(ak)` +`,HG=f(ak)` margin-left: 0.8533rem; width: 2.24rem; text-align: center; -`,HG=f(ak)` +`,YG=f(ak)` margin-left: 0.96rem; padding-inline: 1.97rem; -`,YG=f.div` +`,FG=f.div` position: relative; `,Gh=f.div` display: flex; @@ -2809,30 +2809,30 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ padding-inline: 0.96rem; `,Ln=f.div` color: #222; -`,FG=f.div` +`,VG=f.div` padding-top: 0.11rem; `,kc=f.div` font-size: 0.16rem; color: #444; -`,VG=f.div` +`,WG=f.div` position: absolute; left: calc(2.24rem + 0.85rem); bottom: 2%; width: 0.01rem; height: 96%; background: #7680dd; -`,WG=f(Tl)` +`,UG=f(Tl)` background: linear-gradient(180deg, #f9fffe 4.64%, #fff 168.71%); -`,UG=f(jl)` +`,BG=f(jl)` padding-block: 0.7rem 1.45rem; -`,BG=f(of)``,GG=f(sf)``,XG=f.div` +`,GG=f(of)``,XG=f(sf)``,KG=f.div` display: flex; align-items: center; gap: 0.32rem; margin-top: 0.97rem; -`,KG=f.img` +`,QG=f.img` width: 5.2021rem; -`,QG=f.div``,Ao=f.div` +`,qG=f.div``,Ao=f.div` display: flex; align-items: center; padding-bottom: 0.22rem; @@ -2843,11 +2843,11 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ margin-right: 0.07rem; width: 0.44954rem; height: 0.44954rem; -`,No=f(El)``,qG=f(Tl)` +`,No=f(El)``,ZG=f(Tl)` background: linear-gradient(180deg, #f9fffe 4.64%, #fff 168.71%); -`,ZG=f(jl)` +`,JG=f(jl)` padding-block: 0.7rem 2.06rem; -`,JG=f(of)``,eX=f(sf)``,tX=f.div` +`,eX=f(of)``,tX=f(sf)``,rX=f.div` display: grid; grid-template-columns: repeat(2, 1fr); grid-template-columns: repeat(2, 1fr); @@ -2856,11 +2856,11 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ `,Cc=f.img` width: 100%; cursor: pointer; -`,rX=f(Tl)` +`,nX=f(Tl)` background: #fafafa; -`,nX=f(jl)` +`,iX=f(jl)` padding-block: 0.44rem 0.56rem; -`,iX=f.div` +`,oX=f.div` display: grid; grid-template-columns: repeat(2, 1fr); grid-template-rows: repeat(2, 1fr); @@ -2870,44 +2870,44 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ font-size: 0.2rem; line-height: 0.28rem; height: min-content; -`,Zh=f(uG)` +`,Zh=f(dG)` padding-top: 0.16rem; color: #666; font-size: 0.16rem; line-height: 0.22rem; -`,oX=f.div` +`,sX=f.div` display: grid; grid-template-columns: repeat(2, 1fr); grid-gap: 0.49rem; padding-top: 0.42rem; `,Tw=f.img` width: 2.17809rem; -`,sX=f(sk)` +`,aX=f(sk)` padding-top: 0.41rem; color: #333; cursor: pointer; -`,aX=()=>(N.useEffect(()=>{window.scrollTo(0,0)}),l.jsxs(Pt.Fragment,{children:[l.jsx(lX,{}),l.jsx(cX,{}),l.jsx(uX,{}),l.jsx(hX,{}),l.jsx(mX,{}),l.jsx(pX,{})]})),lX=()=>{const e=wt();return l.jsxs(dG,{children:[l.jsx(fG,{children:"MIT体系结构公开课学习社区"}),l.jsx(hG,{onClick:()=>{const t=document.getElementById("supply");console.log(t),t&&t.scrollIntoView({behavior:"smooth"})},children:"立即报名"}),l.jsxs(mG,{onClick:()=>e("rank"),children:[l.jsx(pG,{children:"点击查看荣誉榜单"}),l.jsx(gG,{src:GB})]})]})},cX=()=>l.jsxs(vG,{children:[l.jsxs(yG,{children:[l.jsx(wG,{src:XB}),l.jsx(_G,{children:"项目背景"}),l.jsx(xG,{children:"随着芯片技术自主可控成为国家重要的战略发展规划,对芯片设计相关领域的人才需求也在快速增长。体系结构课程相对于硬件设计的重要性可以类比于设计模式相对于软件设计的重要性,扎实的体系结构基础是设计复杂硬件的基石。然而现实情况是,虽然国内大专院校计算机学科、电子工程学科、微电子等都有开设体系结构或组成原理等相关课程,但由于前些年对相关教学重视度不够,导致教学实践环节存在诸多缺失,毕业生掌握的技能与工业界的期望之间存在较大差距,例如:"}),l.jsxs(SG,{children:[l.jsxs(zh,{children:[l.jsx(Hh,{children:"01"}),l.jsx(Yh,{children:"教学内容局限在基础知识,而对于业界所需的诸多技术(例如异常处理、缓存技术、内存管理、多核一致性等)往往在教学中一笔带过。"})]}),l.jsxs(zh,{children:[l.jsx(Hh,{children:"02"}),l.jsx(Yh,{children:"实验、大作业、课程设计等实操环节过于简单,很少有系统级别的实验项目,学生在动手实践环节投入的精力有限,通常只需要编写HDL代码即可顺利完成相关考核,而对于前期开发环境搭建、后期验证调试、性能调优等基本不会涉及。"})]}),l.jsxs(zh,{children:[l.jsx(Hh,{children:"03"}),l.jsx(Yh,{children:"学科领域泾渭分明,软硬件结合部分训练缺失。软件相关专业课程对硬件相关知识经常快速略过,而硬件相关专业课程也较少涉及上层软件相关的知识。"})]})]}),l.jsx(bG,{children:"为了解决上述问题,我们很高兴看到已经有类似“一生一芯”这样的项目启动并取得了很好的成果,但“一生一芯”项目主要解决了上述的问题2和问题3,而对于工业界实际需要的技能,如多核处理器技术及多核下的数据一致性问题等,依旧存在覆盖上的缺失。"})]}),l.jsx(kG,{src:KB})]}),uX=()=>l.jsx(CG,{children:l.jsxs(DG,{children:[l.jsx(EG,{src:QB}),l.jsx(TG,{children:"课程内容"}),l.jsx(dX,{}),l.jsx(fX,{})]})}),dX=()=>l.jsxs(jG,{children:[l.jsxs(OG,{children:[l.jsx(PG,{children:"详情说明"}),l.jsx(bc,{children:"为了进一步缩小学生能力与业界期望之间的差距,我们找到了MIT体系结构方面的3门公开课及其对应的课程实验,希望通过学习公开课并亲自动手完成实验的方式,进一步增加学生的动手实践能力以及解决实际问题的能力。对这些公开课的说明如下:"}),l.jsx(bc,{children:"三门公开课难度级别分别对应本科必修课(6.004)、硕士必修课(6.175)以及实践选修课(6.375)"}),l.jsxs(RG,{children:[l.jsx(MG,{}),l.jsxs(Fh,{isActive:!0,children:[l.jsx(Vh,{isActive:!0,children:"MIT6.004"}),l.jsx(Wh,{isActive:!0}),l.jsx(Uh,{isActive:!0}),l.jsx(Bh,{children:"第一阶段"})]}),l.jsxs(Fh,{isActive:!1,children:[l.jsx(Vh,{isActive:!1,children:"MIT6.375"}),l.jsx(Wh,{isActive:!1}),l.jsx(Uh,{isActive:!1}),l.jsx(Bh,{children:"第二阶段"})]}),l.jsxs(Fh,{isActive:!1,children:[l.jsx(Vh,{isActive:!1,children:"MIT6.175"}),l.jsx(Wh,{isActive:!1}),l.jsx(Uh,{isActive:!1}),l.jsx(Bh,{children:"第三阶段"})]})]}),l.jsx(bc,{children:"内容涵盖了组合逻辑、简单时序逻辑、流水线及流式数据处理、RISC-V指令集架构、RISC-V处理器实现、Cache、中断异常、Non-Blocking Cache、多核处理器、Cache Coherence等。该课程及实验的授课老师为MIT的Arvind教授,他也是新一代开源HDL语言Bluespec SystemVerilog的发明人,因此该课程的全部实验也采用Bluespec进行RTL的编写。"}),l.jsx(bc,{children:"在学习三门公开课的同时,我们也自己加入了一些专项训练内容,例如AXI协议握手、流式编程在控制通路上的应用等,从而进一步提升参与者的能力,加深对硬件设计中并发性和流水线的理解。"})]}),l.jsx(LG,{src:qB})]}),fX=()=>l.jsxs(AG,{children:[l.jsx(IG,{children:"培训内容"}),l.jsxs(NG,{children:[l.jsxs($G,{children:[l.jsx(zG,{children:"序号"}),l.jsx(HG,{children:"实验内容"})]}),l.jsxs(YG,{children:[l.jsxs(Gh,{children:[l.jsx(Xh,{children:"第一阶段"}),l.jsxs(Kh,{children:[l.jsxs(ir,{children:[l.jsx(or,{children:"Lab0"}),l.jsx(sr,{children:"实验环境搭建"})]}),l.jsxs(ir,{children:[l.jsx(or,{children:"Lab1"}),l.jsx(sr,{children:"多路复用器和加法器"})]}),l.jsxs(ir,{children:[l.jsx(or,{children:"Lab2"}),l.jsx(sr,{children:"乘法器"})]}),l.jsxs(ir,{children:[l.jsx(or,{children:"Lab3"}),l.jsx(sr,{children:"流水线"})]}),l.jsxs(ir,{children:[l.jsx(or,{children:"Lab4"}),l.jsx(sr,{children:"FIFO(Bypass/Pass through/Concurrent)"})]})]})]}),l.jsxs(Gh,{children:[l.jsx(Xh,{children:"第二阶段"}),l.jsxs(Kh,{children:[l.jsxs(ir,{children:[l.jsx(or,{children:"专项1"}),l.jsx(sr,{children:l.jsx(Ln,{children:"AXI总线握手打拍与反压机制"})})]}),l.jsxs(ir,{children:[l.jsx(or,{children:"专项2"}),l.jsxs(sr,{children:[l.jsx(Ln,{children:"流式数据处理"}),l.jsxs(FG,{children:[l.jsx(kc,{children:"简单音频处理流水线"}),l.jsx(kc,{children:"音频处理扩展:FFT"}),l.jsx(kc,{children:"音频处理扩展:Pitch Shifting"}),l.jsx(kc,{children:"流水线的软硬件联调仿真"})]})]})]}),l.jsxs(ir,{children:[l.jsx(or,{children:"专项3"}),l.jsx(sr,{children:l.jsx(Ln,{children:"网络设备中的流式数据包处理"})})]})]})]}),l.jsxs(Gh,{children:[l.jsx(Xh,{children:"第三阶段"}),l.jsxs(Kh,{children:[l.jsxs(ir,{children:[l.jsx(or,{children:"Lab5"}),l.jsx(sr,{children:l.jsx(Ln,{children:"单周期及多周期RISC-V处理器"})})]}),l.jsxs(ir,{children:[l.jsx(or,{children:"Lab6"}),l.jsx(sr,{children:l.jsx(Ln,{children:"支持分支预测及6级流水的RISC-V处理器"})})]}),l.jsxs(ir,{children:[l.jsx(or,{children:"Lab7"}),l.jsx(sr,{children:l.jsx(Ln,{children:"具备ICache和DCache的RISC-V处理器"})})]}),l.jsxs(ir,{children:[l.jsx(or,{children:"Lab8"}),l.jsx(sr,{children:l.jsx(Ln,{children:"支持异常处理的RISC-V处理器"})})]}),l.jsxs(ir,{children:[l.jsx(or,{children:"Project1"}),l.jsx(sr,{children:l.jsx(Ln,{children:"支持乱序执行的RISC-V处理器(Store Queue)"})})]}),l.jsxs(ir,{children:[l.jsx(or,{children:"Project2"}),l.jsx(sr,{children:l.jsx(Ln,{children:"多核处理器及缓存一致性(基于MSI协议)"})})]})]})]}),l.jsx(VG,{})]})]})]}),hX=()=>l.jsx(WG,{children:l.jsxs(UG,{children:[l.jsx(BG,{src:ZB}),l.jsx(GG,{children:"项目课程亮点"}),l.jsxs(XG,{children:[l.jsx(KG,{src:JB}),l.jsxs(QG,{children:[l.jsxs(Ao,{children:[l.jsx(Io,{src:Lo}),l.jsx(No,{children:"课程及实验安排由浅入深,并在最终到达相当的深度,既可作为“一生一芯”项目的补充课程,也可作为独立项目进行学习。"})]}),l.jsxs(Ao,{children:[l.jsx(Io,{src:Lo}),l.jsx(No,{children:"采用Bluespec作为实验语言,具有更强的抽象表达能力,可以更高效的实现复杂功能,使得学生可以把精力更集中的放在架构设计上。"})]}),l.jsxs(Ao,{children:[l.jsx(Io,{src:Lo}),l.jsx(No,{children:"注重软硬件联合开发,培养软硬通吃的复合型人才。"})]}),l.jsxs(Ao,{children:[l.jsx(Io,{src:Lo}),l.jsx(No,{children:"课程时间安排紧凑,内容丰富,学生通常可以通过2~3个月的业余时间即可自学完成所有实验。"})]}),l.jsxs(Ao,{children:[l.jsx(Io,{src:Lo}),l.jsx(No,{children:"主要课程资料均为英文,有助于锻炼国外文献阅读能力。"})]}),l.jsxs(Ao,{children:[l.jsx(Io,{src:Lo}),l.jsx(No,{children:"全开源、社区化"})]})]})]})]})}),mX=()=>l.jsx(qG,{id:"supply",children:l.jsxs(ZG,{children:[l.jsx(JG,{src:eG}),l.jsx(eX,{children:"新手上路补给站"}),l.jsxs(tX,{children:[l.jsx(Cc,{src:tG,onClick:()=>window.location.href="https://www.bilibili.com/video/BV1u8411i7Qw/"}),l.jsx(Cc,{src:rG,onClick:()=>window.location.href="https://www.bilibili.com/video/BV1cs4y1r7T3/"}),l.jsx(Cc,{src:nG,onClick:()=>window.location.href="https://mp.weixin.qq.com/s/-MnRFCXHy5v-tt4MujfqtQ"}),l.jsx(Cc,{src:iG,onClick:()=>window.location.href="https://mp.weixin.qq.com/s/I5bPw_AUWTh2VgzAm4SHhg"})]})]})}),pX=()=>l.jsx(rX,{children:l.jsxs(nX,{children:[l.jsxs(iX,{children:[l.jsxs(Qh,{style:{gridColumnStart:"span 2"},children:[l.jsx(qh,{children:"申明"}),l.jsx(Zh,{children:"MIT体系结构公开课学习社区项目以学习者自学开源的MIT三门公开课为主,社区内大家互相监督和交流,社区有助教在线答疑,帮助有志于从事数字芯片设计的同学强化体系结构基础知识,提升数字芯片设计的能力。"})]}),l.jsxs(Qh,{children:[l.jsx(qh,{children:"报名表"}),l.jsx(Zh,{children:"请扫描二维码,填写报名表,加入MIT体系结构公开课学习社区项目。报名成功后,将收到邮件确认。"})]}),l.jsxs(Qh,{children:[l.jsx(qh,{children:"咨询"}),l.jsx(Zh,{children:"关于MIT体系结构公开课学习社区项目有任何问题或疑问,可以邮件:ta@datenlord.com或添加DatenLord小助手微信咨询。"})]})]}),l.jsxs(oX,{children:[l.jsx(Tw,{src:oG}),l.jsx(Tw,{src:sG})]}),l.jsxs(sX,{onClick:()=>window.location.href="https://datenlord.feishu.cn/wiki/CNwFwKXPaiy0cfkNYrqcLNdCnTf",children:["往届学员",">>"]})]})}),gX="/zh-cn/assets/title-6364f1d7.png",vX="/zh-cn/assets/stage1-5eb61c6d.png",yX="/zh-cn/assets/stage2-586e5a56.png",wX="/zh-cn/assets/stage3-021de657.png",_X="/zh-cn/assets/github-6b99dc67.svg",xX=f.div` +`,lX=()=>(N.useEffect(()=>{window.scrollTo(0,0)}),l.jsxs(Pt.Fragment,{children:[l.jsx(cX,{}),l.jsx(uX,{}),l.jsx(dX,{}),l.jsx(mX,{}),l.jsx(pX,{}),l.jsx(gX,{})]})),cX=()=>{const e=wt();return l.jsxs(fG,{children:[l.jsx(hG,{children:"MIT体系结构公开课学习社区"}),l.jsx(mG,{onClick:()=>{const t=document.getElementById("supply");console.log(t),t&&t.scrollIntoView({behavior:"smooth"})},children:"立即报名"}),l.jsxs(pG,{onClick:()=>e("rank"),children:[l.jsx(gG,{children:"点击查看荣誉榜单"}),l.jsx(vG,{src:XB})]})]})},uX=()=>l.jsxs(yG,{children:[l.jsxs(wG,{children:[l.jsx(_G,{src:KB}),l.jsx(xG,{children:"项目背景"}),l.jsx(SG,{children:"随着芯片技术自主可控成为国家重要的战略发展规划,对芯片设计相关领域的人才需求也在快速增长。体系结构课程相对于硬件设计的重要性可以类比于设计模式相对于软件设计的重要性,扎实的体系结构基础是设计复杂硬件的基石。然而现实情况是,虽然国内大专院校计算机学科、电子工程学科、微电子等都有开设体系结构或组成原理等相关课程,但由于前些年对相关教学重视度不够,导致教学实践环节存在诸多缺失,毕业生掌握的技能与工业界的期望之间存在较大差距,例如:"}),l.jsxs(bG,{children:[l.jsxs(zh,{children:[l.jsx(Hh,{children:"01"}),l.jsx(Yh,{children:"教学内容局限在基础知识,而对于业界所需的诸多技术(例如异常处理、缓存技术、内存管理、多核一致性等)往往在教学中一笔带过。"})]}),l.jsxs(zh,{children:[l.jsx(Hh,{children:"02"}),l.jsx(Yh,{children:"实验、大作业、课程设计等实操环节过于简单,很少有系统级别的实验项目,学生在动手实践环节投入的精力有限,通常只需要编写HDL代码即可顺利完成相关考核,而对于前期开发环境搭建、后期验证调试、性能调优等基本不会涉及。"})]}),l.jsxs(zh,{children:[l.jsx(Hh,{children:"03"}),l.jsx(Yh,{children:"学科领域泾渭分明,软硬件结合部分训练缺失。软件相关专业课程对硬件相关知识经常快速略过,而硬件相关专业课程也较少涉及上层软件相关的知识。"})]})]}),l.jsx(kG,{children:"为了解决上述问题,我们很高兴看到已经有类似“一生一芯”这样的项目启动并取得了很好的成果,但“一生一芯”项目主要解决了上述的问题2和问题3,而对于工业界实际需要的技能,如多核处理器技术及多核下的数据一致性问题等,依旧存在覆盖上的缺失。"})]}),l.jsx(CG,{src:QB})]}),dX=()=>l.jsx(DG,{children:l.jsxs(EG,{children:[l.jsx(TG,{src:qB}),l.jsx(jG,{children:"课程内容"}),l.jsx(fX,{}),l.jsx(hX,{})]})}),fX=()=>l.jsxs(OG,{children:[l.jsxs(PG,{children:[l.jsx(RG,{children:"详情说明"}),l.jsx(bc,{children:"为了进一步缩小学生能力与业界期望之间的差距,我们找到了MIT体系结构方面的3门公开课及其对应的课程实验,希望通过学习公开课并亲自动手完成实验的方式,进一步增加学生的动手实践能力以及解决实际问题的能力。对这些公开课的说明如下:"}),l.jsx(bc,{children:"三门公开课难度级别分别对应本科必修课(6.004)、硕士必修课(6.175)以及实践选修课(6.375)"}),l.jsxs(MG,{children:[l.jsx(LG,{}),l.jsxs(Fh,{isActive:!0,children:[l.jsx(Vh,{isActive:!0,children:"MIT6.004"}),l.jsx(Wh,{isActive:!0}),l.jsx(Uh,{isActive:!0}),l.jsx(Bh,{children:"第一阶段"})]}),l.jsxs(Fh,{isActive:!1,children:[l.jsx(Vh,{isActive:!1,children:"MIT6.375"}),l.jsx(Wh,{isActive:!1}),l.jsx(Uh,{isActive:!1}),l.jsx(Bh,{children:"第二阶段"})]}),l.jsxs(Fh,{isActive:!1,children:[l.jsx(Vh,{isActive:!1,children:"MIT6.175"}),l.jsx(Wh,{isActive:!1}),l.jsx(Uh,{isActive:!1}),l.jsx(Bh,{children:"第三阶段"})]})]}),l.jsx(bc,{children:"内容涵盖了组合逻辑、简单时序逻辑、流水线及流式数据处理、RISC-V指令集架构、RISC-V处理器实现、Cache、中断异常、Non-Blocking Cache、多核处理器、Cache Coherence等。该课程及实验的授课老师为MIT的Arvind教授,他也是新一代开源HDL语言Bluespec SystemVerilog的发明人,因此该课程的全部实验也采用Bluespec进行RTL的编写。"}),l.jsx(bc,{children:"在学习三门公开课的同时,我们也自己加入了一些专项训练内容,例如AXI协议握手、流式编程在控制通路上的应用等,从而进一步提升参与者的能力,加深对硬件设计中并发性和流水线的理解。"})]}),l.jsx(AG,{src:ZB})]}),hX=()=>l.jsxs(IG,{children:[l.jsx(NG,{children:"培训内容"}),l.jsxs($G,{children:[l.jsxs(zG,{children:[l.jsx(HG,{children:"序号"}),l.jsx(YG,{children:"实验内容"})]}),l.jsxs(FG,{children:[l.jsxs(Gh,{children:[l.jsx(Xh,{children:"第一阶段"}),l.jsxs(Kh,{children:[l.jsxs(ir,{children:[l.jsx(or,{children:"Lab0"}),l.jsx(sr,{children:"实验环境搭建"})]}),l.jsxs(ir,{children:[l.jsx(or,{children:"Lab1"}),l.jsx(sr,{children:"多路复用器和加法器"})]}),l.jsxs(ir,{children:[l.jsx(or,{children:"Lab2"}),l.jsx(sr,{children:"乘法器"})]}),l.jsxs(ir,{children:[l.jsx(or,{children:"Lab3"}),l.jsx(sr,{children:"流水线"})]}),l.jsxs(ir,{children:[l.jsx(or,{children:"Lab4"}),l.jsx(sr,{children:"FIFO(Bypass/Pass through/Concurrent)"})]})]})]}),l.jsxs(Gh,{children:[l.jsx(Xh,{children:"第二阶段"}),l.jsxs(Kh,{children:[l.jsxs(ir,{children:[l.jsx(or,{children:"专项1"}),l.jsx(sr,{children:l.jsx(Ln,{children:"AXI总线握手打拍与反压机制"})})]}),l.jsxs(ir,{children:[l.jsx(or,{children:"专项2"}),l.jsxs(sr,{children:[l.jsx(Ln,{children:"流式数据处理"}),l.jsxs(VG,{children:[l.jsx(kc,{children:"简单音频处理流水线"}),l.jsx(kc,{children:"音频处理扩展:FFT"}),l.jsx(kc,{children:"音频处理扩展:Pitch Shifting"}),l.jsx(kc,{children:"流水线的软硬件联调仿真"})]})]})]}),l.jsxs(ir,{children:[l.jsx(or,{children:"专项3"}),l.jsx(sr,{children:l.jsx(Ln,{children:"网络设备中的流式数据包处理"})})]})]})]}),l.jsxs(Gh,{children:[l.jsx(Xh,{children:"第三阶段"}),l.jsxs(Kh,{children:[l.jsxs(ir,{children:[l.jsx(or,{children:"Lab5"}),l.jsx(sr,{children:l.jsx(Ln,{children:"单周期及多周期RISC-V处理器"})})]}),l.jsxs(ir,{children:[l.jsx(or,{children:"Lab6"}),l.jsx(sr,{children:l.jsx(Ln,{children:"支持分支预测及6级流水的RISC-V处理器"})})]}),l.jsxs(ir,{children:[l.jsx(or,{children:"Lab7"}),l.jsx(sr,{children:l.jsx(Ln,{children:"具备ICache和DCache的RISC-V处理器"})})]}),l.jsxs(ir,{children:[l.jsx(or,{children:"Lab8"}),l.jsx(sr,{children:l.jsx(Ln,{children:"支持异常处理的RISC-V处理器"})})]}),l.jsxs(ir,{children:[l.jsx(or,{children:"Project1"}),l.jsx(sr,{children:l.jsx(Ln,{children:"支持乱序执行的RISC-V处理器(Store Queue)"})})]}),l.jsxs(ir,{children:[l.jsx(or,{children:"Project2"}),l.jsx(sr,{children:l.jsx(Ln,{children:"多核处理器及缓存一致性(基于MSI协议)"})})]})]})]}),l.jsx(WG,{})]})]})]}),mX=()=>l.jsx(UG,{children:l.jsxs(BG,{children:[l.jsx(GG,{src:JB}),l.jsx(XG,{children:"项目课程亮点"}),l.jsxs(KG,{children:[l.jsx(QG,{src:eG}),l.jsxs(qG,{children:[l.jsxs(Ao,{children:[l.jsx(Io,{src:Lo}),l.jsx(No,{children:"课程及实验安排由浅入深,并在最终到达相当的深度,既可作为“一生一芯”项目的补充课程,也可作为独立项目进行学习。"})]}),l.jsxs(Ao,{children:[l.jsx(Io,{src:Lo}),l.jsx(No,{children:"采用Bluespec作为实验语言,具有更强的抽象表达能力,可以更高效的实现复杂功能,使得学生可以把精力更集中的放在架构设计上。"})]}),l.jsxs(Ao,{children:[l.jsx(Io,{src:Lo}),l.jsx(No,{children:"注重软硬件联合开发,培养软硬通吃的复合型人才。"})]}),l.jsxs(Ao,{children:[l.jsx(Io,{src:Lo}),l.jsx(No,{children:"课程时间安排紧凑,内容丰富,学生通常可以通过2~3个月的业余时间即可自学完成所有实验。"})]}),l.jsxs(Ao,{children:[l.jsx(Io,{src:Lo}),l.jsx(No,{children:"主要课程资料均为英文,有助于锻炼国外文献阅读能力。"})]}),l.jsxs(Ao,{children:[l.jsx(Io,{src:Lo}),l.jsx(No,{children:"全开源、社区化"})]})]})]})]})}),pX=()=>l.jsx(ZG,{id:"supply",children:l.jsxs(JG,{children:[l.jsx(eX,{src:tG}),l.jsx(tX,{children:"新手上路补给站"}),l.jsxs(rX,{children:[l.jsx(Cc,{src:rG,onClick:()=>window.location.href="https://www.bilibili.com/video/BV1u8411i7Qw/"}),l.jsx(Cc,{src:nG,onClick:()=>window.location.href="https://www.bilibili.com/video/BV1cs4y1r7T3/"}),l.jsx(Cc,{src:iG,onClick:()=>window.location.href="https://mp.weixin.qq.com/s/-MnRFCXHy5v-tt4MujfqtQ"}),l.jsx(Cc,{src:oG,onClick:()=>window.location.href="https://mp.weixin.qq.com/s/I5bPw_AUWTh2VgzAm4SHhg"})]})]})}),gX=()=>l.jsx(nX,{children:l.jsxs(iX,{children:[l.jsxs(oX,{children:[l.jsxs(Qh,{style:{gridColumnStart:"span 2"},children:[l.jsx(qh,{children:"申明"}),l.jsx(Zh,{children:"MIT体系结构公开课学习社区项目以学习者自学开源的MIT三门公开课为主,社区内大家互相监督和交流,社区有助教在线答疑,帮助有志于从事数字芯片设计的同学强化体系结构基础知识,提升数字芯片设计的能力。"})]}),l.jsxs(Qh,{children:[l.jsx(qh,{children:"报名表"}),l.jsx(Zh,{children:"请扫描二维码,填写报名表,加入MIT体系结构公开课学习社区项目。报名成功后,将收到邮件确认。"})]}),l.jsxs(Qh,{children:[l.jsx(qh,{children:"咨询"}),l.jsx(Zh,{children:"关于MIT体系结构公开课学习社区项目有任何问题或疑问,可以邮件:ta@datenlord.com或添加DatenLord小助手微信咨询。"})]})]}),l.jsxs(sX,{children:[l.jsx(Tw,{src:sG}),l.jsx(Tw,{src:aG})]}),l.jsxs(aX,{onClick:()=>window.location.href="https://datenlord.feishu.cn/wiki/CNwFwKXPaiy0cfkNYrqcLNdCnTf",children:["往届学员",">>"]})]})}),vX="/zh-cn/assets/title-6364f1d7.png",yX="/zh-cn/assets/stage1-5eb61c6d.png",wX="/zh-cn/assets/stage2-586e5a56.png",_X="/zh-cn/assets/stage3-021de657.png",xX="/zh-cn/assets/github-6b99dc67.svg",SX=f.div` display: flex; flex-direction: column; align-items: center; margin-top: -0.72rem; padding-block: calc(0.72rem + 0.53rem) 0.8rem; background: #1a1a1a; -`,SX=f.img` +`,bX=f.img` padding-top: 0.53rem; width: 4.6rem; -`,bX=f.div` +`,kX=f.div` padding-top: 0.41rem; color: #fff; font-size: 0.44rem; line-height: 0.56rem; -`,kX=f.div` +`,CX=f.div` color: #fff; font-size: 0.2rem; line-height: 0.56rem; -`,CX=f.main` +`,DX=f.main` background: #000; -`,DX=f.div` +`,EX=f.div` display: flex; flex-direction: column; gap: 0.46rem; @@ -2967,8 +2967,8 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ display: inline-block; width: 0.18rem; height: 0.18rem; - background-image: url(${_X}); + background-image: url(${xX}); background-size: cover; margin-left: 0.06rem; } -`,zp=[{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"}],Hp=zp,jw=Hp,EX=()=>l.jsxs(Pt.Fragment,{children:[l.jsxs(xX,{children:[l.jsx(SX,{src:gX}),l.jsx(bX,{children:"恭喜所有完成MIT体系结构公开课学习的同学!"}),l.jsx(kX,{children:"(排名不分先后)"})]}),l.jsx(CX,{children:l.jsxs(DX,{children:[l.jsx(Jh,{children:l.jsxs(em,{children:[l.jsx(tm,{src:vX}),l.jsx(rm,{children:l.jsxs(nm,{children:[zp.map(({avatar:e,name:t,url:r})=>l.jsxs($o,{onClick:()=>window.open(r),children:[l.jsx(zo,{src:e}),l.jsx(Ho,{children:t})]},t)),zp.map(({avatar:e,name:t,url:r})=>l.jsxs($o,{onClick:()=>window.open(r),children:[l.jsx(zo,{src:e}),l.jsx(Ho,{children:t})]},t))]})})]})}),l.jsx(Jh,{children:l.jsxs(em,{children:[l.jsx(tm,{src:yX}),l.jsx(rm,{children:l.jsxs(nm,{children:[Hp.map(e=>l.jsxs($o,{children:[l.jsx(zo,{src:e.avatar}),l.jsx(Ho,{children:e.name})]},e.name)),Hp.map(e=>l.jsxs($o,{children:[l.jsx(zo,{src:e.avatar}),l.jsx(Ho,{children:e.name})]},e.name))]})})]})}),l.jsx(Jh,{children:l.jsxs(em,{children:[l.jsx(tm,{src:wX}),l.jsx(rm,{children:l.jsxs(nm,{children:[jw.map(e=>l.jsxs($o,{children:[l.jsx(zo,{src:e.avatar}),l.jsx(Ho,{children:e.name})]},e.name)),jw.map(e=>l.jsxs($o,{children:[l.jsx(zo,{src:e.avatar}),l.jsx(Ho,{children:e.name})]},e.name))]})})]})})]})})]}),TX=MP([{path:"/",element:l.jsx(x4,{}),children:[{path:"",element:l.jsx(BI,{})},{path:"products",element:l.jsx(Y1,{})},{path:"products/:sectionId",element:l.jsx(Y1,{})},{path:"rdma",element:l.jsx(_N,{})},{path:"solutions",element:l.jsx(V1,{})},{path:"solutions/:sectionId",element:l.jsx(V1,{})},{path:"resources1",element:l.jsx(W1,{})},{path:"resources1/:sectionId",element:l.jsx(W1,{})},{path:"resources2",element:l.jsx(Z1,{})},{path:"resources2/:sectionId",element:l.jsx(Z1,{})},{path:"clients",element:l.jsx(J1,{})},{path:"clients/:sectionId",element:l.jsx(J1,{})},{path:"company1",element:l.jsx(tw,{})},{path:"company1/:sectionId",element:l.jsx(tw,{})},{path:"company2",element:l.jsx(ow,{})},{path:"company2/:sectionId",element:l.jsx(ow,{})},{path:"tech-talk",element:l.jsx(_c,{})},{path:"oss-showcase",element:l.jsx(_c,{})},{path:"rust-showcase",element:l.jsx(_c,{})},{path:"hardware-acceleration",element:l.jsx(_c,{})},{path:":title",element:l.jsx(dU,{})},{path:":section/:title",element:l.jsx(CU,{})},{path:"job-description",element:l.jsx(sB,{})},{path:"job-description/:key",element:l.jsx(UB,{})},{path:"MIT",element:l.jsx(aX,{})},{path:"MIT/rank",element:l.jsx(EX,{})}]}]),jX={themeDark:"#0A061F",themeDark02:"#42424A",secondary01:"#7680DD",secondary02:"#D9DBEF",secondary07:"#F2994A",secondary08:"#FDCB6E",gray03:"#828282",gray04:"#4F4F4F",gray007:"#272D37",white00:"#fff"};function Br(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:zg(e)?2:Hg(e)?3:0}function gs(e,t){return Ws(e)===2?e.has(t):Object.prototype.hasOwnProperty.call(e,t)}function OX(e,t){return Ws(e)===2?e.get(t):e[t]}function lk(e,t,r){var n=Ws(e);n===2?e.set(t,r):n===3?e.add(r):e[t]=r}function ck(e,t){return e===t?e!==0||1/e==1/t:e!=e&&t!=t}function zg(e){return IX&&e instanceof Map}function Hg(e){return NX&&e instanceof Set}function qi(e){return e.o||e.t}function Yg(e){if(Array.isArray(e))return Array.prototype.slice.call(e);var t=dk(e);delete t[Je];for(var r=vs(t),n=0;n1&&(e.set=e.add=e.clear=e.delete=PX),Object.freeze(e),t&&_o(e,function(r,n){return Fg(n,!0)},!0)),e}function PX(){Br(2)}function Vg(e){return e==null||typeof e!="object"||Object.isFrozen(e)}function hn(e){var t=Wp[e];return t||Br(18,e),t}function RX(e,t){Wp[e]||(Wp[e]=t)}function Yp(){return ul}function im(e,t){t&&(hn("Patches"),e.u=[],e.s=[],e.v=t)}function Hu(e){Fp(e),e.p.forEach(MX),e.p=null}function Fp(e){e===ul&&(ul=e.l)}function Ow(e){return ul={p:[],l:ul,h:e,m:!0,_:0}}function MX(e){var t=e[Je];t.i===0||t.i===1?t.j():t.g=!0}function om(e,t){t._=t.p.length;var r=t.p[0],n=e!==void 0&&e!==r;return t.h.O||hn("ES5").S(t,e,n),n?(r[Je].P&&(Hu(t),Br(4)),Zn(e)&&(e=Yu(t,e),t.l||Fu(t,e)),t.u&&hn("Patches").M(r[Je].t,e,t.u,t.s)):e=Yu(t,r,[]),Hu(t),t.u&&t.v(t.u,t.s),e!==uk?e:void 0}function Yu(e,t,r){if(Vg(t))return t;var n=t[Je];if(!n)return _o(t,function(c,d){return Pw(e,n,t,c,d,r)},!0),t;if(n.A!==e)return t;if(!n.P)return Fu(e,n.t,!0),n.t;if(!n.I){n.I=!0,n.A._--;var i=n.i===4||n.i===5?n.o=Yg(n.k):n.o,o=i,a=!1;n.i===3&&(o=new Set(i),i.clear(),a=!0),_o(o,function(c,d){return Pw(e,n,i,c,d,r,a)}),Fu(e,i,!1),r&&e.u&&hn("Patches").N(n,r,e.u,e.s)}return n.o}function Pw(e,t,r,n,i,o,a){if(zi(i)){var c=Yu(e,i,o&&t&&t.i!==3&&!gs(t.R,n)?o.concat(n):void 0);if(lk(r,n,c),!zi(c))return;e.m=!1}else a&&r.add(i);if(Zn(i)&&!Vg(i)){if(!e.h.D&&e._<1)return;Yu(e,i),t&&t.A.l||Fu(e,i)}}function Fu(e,t,r){r===void 0&&(r=!1),!e.l&&e.h.D&&e.m&&Fg(t,r)}function sm(e,t){var r=e[Je];return(r?qi(r):e)[t]}function Rw(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 _i(e){e.P||(e.P=!0,e.l&&_i(e.l))}function am(e){e.o||(e.o=Yg(e.t))}function Vp(e,t,r){var n=zg(t)?hn("MapSet").F(t,r):Hg(t)?hn("MapSet").T(t,r):e.O?function(i,o){var a=Array.isArray(i),c={i:a?1:0,A:o?o.A:Yp(),P:!1,I:!1,R:{},l:o,t:i,k:null,o:null,j:null,C:!1},d=c,h=dl;a&&(d=[c],h=_a);var g=Proxy.revocable(d,h),v=g.revoke,x=g.proxy;return c.k=x,c.j=v,x}(t,r):hn("ES5").J(t,r);return(r?r.A:Yp()).p.push(n),n}function LX(e){return zi(e)||Br(22,e),function t(r){if(!Zn(r))return r;var n,i=r[Je],o=Ws(r);if(i){if(!i.P&&(i.i<4||!hn("ES5").K(i)))return i.t;i.I=!0,n=Mw(r,o),i.I=!1}else n=Mw(r,o);return _o(n,function(a,c){i&&OX(i.t,a)===c||lk(n,a,t(c))}),o===3?new Set(n):n}(e)}function Mw(e,t){switch(t){case 2:return new Map(e);case 3:return Array.from(e)}return Yg(e)}function AX(){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 dl.get(d,o)},set:function(d){var h=this[Je];dl.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)&&_i(c);break;case 4:r(c)&&_i(c)}}}function r(o){for(var a=o.t,c=o.k,d=vs(c),h=d.length-1;h>=0;h--){var g=d[h];if(g!==Je){var v=a[g];if(v===void 0&&!gs(a,g))return!0;var x=c[g],b=x&&x[Je];if(b?b.t!==v:!ck(x,v))return!0}}var k=!!a[Je];return d.length!==vs(a).length+(k?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),x=1;x=0;i--){var o=n[i];if(o.path.length===0&&o.op==="replace"){r=o.value;break}}i>-1&&(n=n.slice(i+1));var a=hn("Patches").$;return zi(r)?a(r,n):this.produce(r,function(c){return a(c,n)})},e}(),_r=new zX,fk=_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 fl(e){return fl=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},fl(e)}function HX(e,t){if(fl(e)!=="object"||e===null)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var n=r.call(e,t||"default");if(fl(n)!=="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}function YX(e){var t=HX(e,"string");return fl(t)==="symbol"?t:String(t)}function FX(e,t,r){return t=YX(t),t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function Nw(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function $w(e){for(var t=1;t"u"&&(r=t,t=void 0),typeof r<"u"){if(typeof r!="function")throw new Error(Ft(1));return r(hk)(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(C){if(typeof C!="function")throw new Error(Ft(4));if(d)throw new Error(Ft(5));var E=!0;return h(),c.push(C),function(){if(E){if(d)throw new Error(Ft(6));E=!1,h();var w=c.indexOf(C);c.splice(w,1),a=null}}}function x(C){if(!VX(C))throw new Error(Ft(7));if(typeof C.type>"u")throw new Error(Ft(8));if(d)throw new Error(Ft(9));try{d=!0,o=i(o,C)}finally{d=!1}for(var E=a=c,y=0;y"u")throw new Error(Ft(12));if(typeof r(void 0,{type:Vu.PROBE_UNKNOWN_ACTION()})>"u")throw new Error(Ft(13))})}function UX(e){for(var t=Object.keys(e),r={},n=0;n"u")throw h&&h.type,new Error(Ft(14));v[b]=E,g=g||E!==C}return g=g||o.length!==Object.keys(d).length,g?v:d}}function Wu(){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}}}),xK=_K.reducer,SK=lK({reducer:{counter:xK}});dm.createRoot(document.getElementById("root")).render(l.jsx(DM,{store:SK,children:l.jsxs($R,{theme:jX,children:[l.jsx(EM,{}),l.jsx(kP,{router:TX})]})}))});export default bK(); +`,zp=[{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"}],Hp=zp,jw=Hp,TX=()=>l.jsxs(Pt.Fragment,{children:[l.jsxs(SX,{children:[l.jsx(bX,{src:vX}),l.jsx(kX,{children:"恭喜所有完成MIT体系结构公开课学习的同学!"}),l.jsx(CX,{children:"(排名不分先后)"})]}),l.jsx(DX,{children:l.jsxs(EX,{children:[l.jsx(Jh,{children:l.jsxs(em,{children:[l.jsx(tm,{src:yX}),l.jsx(rm,{children:l.jsxs(nm,{children:[zp.map(({avatar:e,name:t,url:r})=>l.jsxs($o,{onClick:()=>window.open(r),children:[l.jsx(zo,{src:e}),l.jsx(Ho,{children:t})]},t)),zp.map(({avatar:e,name:t,url:r})=>l.jsxs($o,{onClick:()=>window.open(r),children:[l.jsx(zo,{src:e}),l.jsx(Ho,{children:t})]},t))]})})]})}),l.jsx(Jh,{children:l.jsxs(em,{children:[l.jsx(tm,{src:wX}),l.jsx(rm,{children:l.jsxs(nm,{children:[Hp.map(e=>l.jsxs($o,{children:[l.jsx(zo,{src:e.avatar}),l.jsx(Ho,{children:e.name})]},e.name)),Hp.map(e=>l.jsxs($o,{children:[l.jsx(zo,{src:e.avatar}),l.jsx(Ho,{children:e.name})]},e.name))]})})]})}),l.jsx(Jh,{children:l.jsxs(em,{children:[l.jsx(tm,{src:_X}),l.jsx(rm,{children:l.jsxs(nm,{children:[jw.map(e=>l.jsxs($o,{children:[l.jsx(zo,{src:e.avatar}),l.jsx(Ho,{children:e.name})]},e.name)),jw.map(e=>l.jsxs($o,{children:[l.jsx(zo,{src:e.avatar}),l.jsx(Ho,{children:e.name})]},e.name))]})})]})})]})})]}),jX=MP([{path:"/",element:l.jsx(x4,{}),children:[{path:"",element:l.jsx(BI,{})},{path:"products",element:l.jsx(Y1,{})},{path:"products/:sectionId",element:l.jsx(Y1,{})},{path:"rdma",element:l.jsx(_N,{})},{path:"solutions",element:l.jsx(V1,{})},{path:"solutions/:sectionId",element:l.jsx(V1,{})},{path:"resources1",element:l.jsx(W1,{})},{path:"resources1/:sectionId",element:l.jsx(W1,{})},{path:"resources2",element:l.jsx(Z1,{})},{path:"resources2/:sectionId",element:l.jsx(Z1,{})},{path:"clients",element:l.jsx(J1,{})},{path:"clients/:sectionId",element:l.jsx(J1,{})},{path:"company1",element:l.jsx(tw,{})},{path:"company1/:sectionId",element:l.jsx(tw,{})},{path:"company2",element:l.jsx(ow,{})},{path:"company2/:sectionId",element:l.jsx(ow,{})},{path:"tech-talk",element:l.jsx(_c,{})},{path:"oss-showcase",element:l.jsx(_c,{})},{path:"rust-showcase",element:l.jsx(_c,{})},{path:"hardware-acceleration",element:l.jsx(_c,{})},{path:":title",element:l.jsx(fU,{})},{path:":section/:title",element:l.jsx(DU,{})},{path:"job-description",element:l.jsx(aB,{})},{path:"job-description/:key",element:l.jsx(BB,{})},{path:"MIT",element:l.jsx(lX,{})},{path:"MIT/rank",element:l.jsx(TX,{})}]}]),OX={themeDark:"#0A061F",themeDark02:"#42424A",secondary01:"#7680DD",secondary02:"#D9DBEF",secondary07:"#F2994A",secondary08:"#FDCB6E",gray03:"#828282",gray04:"#4F4F4F",gray007:"#272D37",white00:"#fff"};function Br(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:zg(e)?2:Hg(e)?3:0}function gs(e,t){return Ws(e)===2?e.has(t):Object.prototype.hasOwnProperty.call(e,t)}function PX(e,t){return Ws(e)===2?e.get(t):e[t]}function lk(e,t,r){var n=Ws(e);n===2?e.set(t,r):n===3?e.add(r):e[t]=r}function ck(e,t){return e===t?e!==0||1/e==1/t:e!=e&&t!=t}function zg(e){return NX&&e instanceof Map}function Hg(e){return $X&&e instanceof Set}function qi(e){return e.o||e.t}function Yg(e){if(Array.isArray(e))return Array.prototype.slice.call(e);var t=dk(e);delete t[Je];for(var r=vs(t),n=0;n1&&(e.set=e.add=e.clear=e.delete=RX),Object.freeze(e),t&&_o(e,function(r,n){return Fg(n,!0)},!0)),e}function RX(){Br(2)}function Vg(e){return e==null||typeof e!="object"||Object.isFrozen(e)}function hn(e){var t=Wp[e];return t||Br(18,e),t}function MX(e,t){Wp[e]||(Wp[e]=t)}function Yp(){return ul}function im(e,t){t&&(hn("Patches"),e.u=[],e.s=[],e.v=t)}function Hu(e){Fp(e),e.p.forEach(LX),e.p=null}function Fp(e){e===ul&&(ul=e.l)}function Ow(e){return ul={p:[],l:ul,h:e,m:!0,_:0}}function LX(e){var t=e[Je];t.i===0||t.i===1?t.j():t.g=!0}function om(e,t){t._=t.p.length;var r=t.p[0],n=e!==void 0&&e!==r;return t.h.O||hn("ES5").S(t,e,n),n?(r[Je].P&&(Hu(t),Br(4)),Zn(e)&&(e=Yu(t,e),t.l||Fu(t,e)),t.u&&hn("Patches").M(r[Je].t,e,t.u,t.s)):e=Yu(t,r,[]),Hu(t),t.u&&t.v(t.u,t.s),e!==uk?e:void 0}function Yu(e,t,r){if(Vg(t))return t;var n=t[Je];if(!n)return _o(t,function(c,d){return Pw(e,n,t,c,d,r)},!0),t;if(n.A!==e)return t;if(!n.P)return Fu(e,n.t,!0),n.t;if(!n.I){n.I=!0,n.A._--;var i=n.i===4||n.i===5?n.o=Yg(n.k):n.o,o=i,a=!1;n.i===3&&(o=new Set(i),i.clear(),a=!0),_o(o,function(c,d){return Pw(e,n,i,c,d,r,a)}),Fu(e,i,!1),r&&e.u&&hn("Patches").N(n,r,e.u,e.s)}return n.o}function Pw(e,t,r,n,i,o,a){if(zi(i)){var c=Yu(e,i,o&&t&&t.i!==3&&!gs(t.R,n)?o.concat(n):void 0);if(lk(r,n,c),!zi(c))return;e.m=!1}else a&&r.add(i);if(Zn(i)&&!Vg(i)){if(!e.h.D&&e._<1)return;Yu(e,i),t&&t.A.l||Fu(e,i)}}function Fu(e,t,r){r===void 0&&(r=!1),!e.l&&e.h.D&&e.m&&Fg(t,r)}function sm(e,t){var r=e[Je];return(r?qi(r):e)[t]}function Rw(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 _i(e){e.P||(e.P=!0,e.l&&_i(e.l))}function am(e){e.o||(e.o=Yg(e.t))}function Vp(e,t,r){var n=zg(t)?hn("MapSet").F(t,r):Hg(t)?hn("MapSet").T(t,r):e.O?function(i,o){var a=Array.isArray(i),c={i:a?1:0,A:o?o.A:Yp(),P:!1,I:!1,R:{},l:o,t:i,k:null,o:null,j:null,C:!1},d=c,h=dl;a&&(d=[c],h=_a);var g=Proxy.revocable(d,h),v=g.revoke,x=g.proxy;return c.k=x,c.j=v,x}(t,r):hn("ES5").J(t,r);return(r?r.A:Yp()).p.push(n),n}function AX(e){return zi(e)||Br(22,e),function t(r){if(!Zn(r))return r;var n,i=r[Je],o=Ws(r);if(i){if(!i.P&&(i.i<4||!hn("ES5").K(i)))return i.t;i.I=!0,n=Mw(r,o),i.I=!1}else n=Mw(r,o);return _o(n,function(a,c){i&&PX(i.t,a)===c||lk(n,a,t(c))}),o===3?new Set(n):n}(e)}function Mw(e,t){switch(t){case 2:return new Map(e);case 3:return Array.from(e)}return Yg(e)}function IX(){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 dl.get(d,o)},set:function(d){var h=this[Je];dl.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)&&_i(c);break;case 4:r(c)&&_i(c)}}}function r(o){for(var a=o.t,c=o.k,d=vs(c),h=d.length-1;h>=0;h--){var g=d[h];if(g!==Je){var v=a[g];if(v===void 0&&!gs(a,g))return!0;var x=c[g],b=x&&x[Je];if(b?b.t!==v:!ck(x,v))return!0}}var k=!!a[Je];return d.length!==vs(a).length+(k?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),x=1;x=0;i--){var o=n[i];if(o.path.length===0&&o.op==="replace"){r=o.value;break}}i>-1&&(n=n.slice(i+1));var a=hn("Patches").$;return zi(r)?a(r,n):this.produce(r,function(c){return a(c,n)})},e}(),_r=new HX,fk=_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 fl(e){return fl=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},fl(e)}function YX(e,t){if(fl(e)!=="object"||e===null)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var n=r.call(e,t||"default");if(fl(n)!=="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}function FX(e){var t=YX(e,"string");return fl(t)==="symbol"?t:String(t)}function VX(e,t,r){return t=FX(t),t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function Nw(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function $w(e){for(var t=1;t"u"&&(r=t,t=void 0),typeof r<"u"){if(typeof r!="function")throw new Error(Ft(1));return r(hk)(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(C){if(typeof C!="function")throw new Error(Ft(4));if(d)throw new Error(Ft(5));var E=!0;return h(),c.push(C),function(){if(E){if(d)throw new Error(Ft(6));E=!1,h();var w=c.indexOf(C);c.splice(w,1),a=null}}}function x(C){if(!WX(C))throw new Error(Ft(7));if(typeof C.type>"u")throw new Error(Ft(8));if(d)throw new Error(Ft(9));try{d=!0,o=i(o,C)}finally{d=!1}for(var E=a=c,y=0;y"u")throw new Error(Ft(12));if(typeof r(void 0,{type:Vu.PROBE_UNKNOWN_ACTION()})>"u")throw new Error(Ft(13))})}function BX(e){for(var t=Object.keys(e),r={},n=0;n"u")throw h&&h.type,new Error(Ft(14));v[b]=E,g=g||E!==C}return g=g||o.length!==Object.keys(d).length,g?v:d}}function Wu(){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}}}),SK=xK.reducer,bK=cK({reducer:{counter:SK}});dm.createRoot(document.getElementById("root")).render(l.jsx(DM,{store:bK,children:l.jsxs($R,{theme:OX,children:[l.jsx(EM,{}),l.jsx(kP,{router:jX})]})}))});export default kK(); diff --git a/zh-cn/assets/index-1b00c887.js b/zh-cn/assets/index-1b00c887.js new file mode 100644 index 0000000..ee35147 --- /dev/null +++ b/zh-cn/assets/index-1b00c887.js @@ -0,0 +1,140 @@ +const e="/zh-cn/assets/cover-eeda38bf.png",s="/zh-cn/assets/image1-2e91af8d.png",n=[e,s],a={label:"Xline command 去重机制(一)—— RIFL 介绍",description:"在一个接收外部 command 的系统中,通常一个 command 至少要执行一次,我们称其为 at-least-once semantics。如果一个 command 执行失败,系统内部经常会实现一套重试结构来尝试恢复这个问题,这就会引出一个问题:重复命令的提交可能会对系统的状态造成影响。",cover:"./cover.png",location:"新疆",author:["唐文荟"],tags:["Xline"],date:"2023-12-28",title:"Xline command de duplication mechanism (I) Introduction to RIFL"},l=[{label:"为什么要对 command 去重?",level:2},{label:"去重在什么阶段完成?",level:2},{label:"目前的 command 去重设计的缺陷",level:2},{label:"RIFL 介绍",level:2},{label:"RIFL 简介",level:3},{label:"RIFL 具体组件及功能",level:3},{label:"RIFL 性能分析",level:2},{label:"小结",level:3},{label:"Summary",level:2}],t=`

封面

+

为什么要对 command 去重?

+

在一个接收外部 command 的系统中,通常一个 command 至少要执行一次,我们称其为 at-least-once semantics。如果一个 command 执行失败,系统内部经常会实现一套重试结构来尝试恢复这个问题,这就会引出一个问题:重复命令的提交可能会对系统的状态造成影响。

+

例如要实现 linearizable semantics (用户的每个操作外部看来是立即执行的、恰好执行一次、在它发起调用和返回之间的某一个时间点执行),我们就需要对 command 去重。在没有 command 去重的 Raft 实现中,一个 command 可能会被执行多次,leader 可能在 commit 之后返回给 client 期间崩溃,client 如果向一个新的 leader 重试相同的 command ,最后就会导致一个 command 被执行了两次。

+

解决这个问题可以有两种方案:一种是类似 etcd 的方法,区分出可以重试的命令和不可以重试的命令,将不可以重试的命令的错误结果返回给用户,并不提供任何保证,即使这个命令可能已经被系统执行了。另一种方案是实现一套 command 的 track 机制,检查系统中执行了的命令来实现 command 的去重,当系统实现了这种去重机制,可以实现 command 执行的 exactly-once semantics,进而实现更高级别的一致性保证。

+

Etcd 中的 gRPC client interceptor,重试的实现

+

+// unaryClientInterceptor returns a new retrying unary client interceptor.
+//
+// The default configuration of the interceptor is to not retry *at all*. This behaviour can be
+// changed through options (e.g. WithMax) on creation of the interceptor or on call (through grpc.CallOptions).
+func (c *Client) unaryClientInterceptor(optFuncs ...retryOption) grpc.UnaryClientInterceptor {
+    intOpts := reuseOrNewWithCallOptions(defaultOptions, optFuncs)
+    return func(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error {
+       ctx = withVersion(ctx)
+       grpcOpts, retryOpts := filterCallOptions(opts)
+       callOpts := reuseOrNewWithCallOptions(intOpts, retryOpts)
+       ...
+       var lastErr error
+       for attempt := uint(0); attempt < callOpts.max; attempt++ {
+          if err := waitRetryBackoff(ctx, attempt, callOpts); err != nil {
+             return err
+          }
+
+          ...
+
+          lastErr = invoker(ctx, method, req, reply, cc, grpcOpts...)
+          if lastErr == nil {
+             return nil
+          }
+
+          ...
+
+          // 在这里基于 callOpts 和 lastErr 判断是否可以重试
+          if !isSafeRetry(c, lastErr, callOpts) {
+             return lastErr
+          }
+       }
+       return lastErr
+    }
+}
+
+

去重在什么阶段完成?

+

首先要清楚去重的目的是什么:防止重复 command 对状态机造成影响。那么就会有两个阶段可以对 command 进行去重,一是接收到 command 的阶段,另一个是在应用到状态机时对 command 去重。

+

无论是哪个方法,我们都需要一个数据结构来追踪已接收并执行的 command 的进度,这样才可以对客户端发来的 command 去重处理。

+

在应用到状态机阶段时进行 command 的去重处理,自然可以利用状态机的后端存储来获取到之前执行的 command (例如 Log::get_cmd_ids 可以获取 log 中所有的 command id),利用这个 command id set 可以对即将应用到状态机的 command 进行去重处理。

+

在接收到 command 阶段进行去重处理,就需要额外维护一套数据结构进行处理,通常这套数据结构需要维护在内存中保证高效的读写速度,所以要求这套数据结构不能占用非常大的空间,可能要具备 GC 的机制。

+

对于第一种方案,首要的问题是 log compaction 机制会让去重机制失效。在 raft 系统中,大家都会实现 log compaction 来避免 log 占用过多内存,如果一个 command log 已经被 compact,那么下次接受到相同的 command 就无法去重了。其次的问题是重复的 command 会在发送到状态机之前还会进行 prepare,speculative execute 处理,消耗额外的 CPU,最后的问题就是读状态机的操作是昂贵的,这种去重手段的性能损耗会很大。

+

综上,我们可以确定在接受到 command 的阶段就进行去重处理,尽早地拒绝重复 command 的提交。

+

目前的 command 去重设计的缺陷

+

Xline curp 内的 command 是一个靠外部实现的 trait,我们没有像 etcd 一样区别对待一些 command 的重试行为,所以我们没有在 command trait 中定义是否具有重试的特征。

+

目前 curp client 中对所有的 command 都会有重试,所以我们在 curp server 处实现了一套简单的去重机制:

+

CommandBoard 中有一个 IndexSet,用于记录之前已经执行过的 command 的 ID

+

+ /// Command board is a buffer to track cmd states and store notifiers for requests that need to wait for a cmd
+#[derive(Debug)]
+pub(super) struct CommandBoard<C: Command> {
+    ...
+    /// The cmd has been received before, this is used for dedup
+    pub(super) sync: IndexSet<ProposeId>,
+    ...
+}
+
+

于是我们可以在 O(1) 的开销下在 propose 阶段对命令进行去重

+

+pub(super) fn handle_propose(
+        &self,
+        cmd: Arc<C>,
+    ) -> Result<((Option<ServerId>, u64), Result<bool, ProposeError>), CurpError> {
+        ...
+        if !self.ctx.cb.map_write(|mut cb_w| cb_w.sync.insert(id)) {
+            return Ok((info, Err(ProposeError::Duplicated)));
+        }
+        ...
+    }
+
+

为了保证 CURP 在发生 leadership transfer 时不会丢失当前正在的执行的 command 的 ID,我们在恢复 Speculative Pool 中也会恢复这个结构

+
/// Recover from all voter's spec pools
+fn recover_from_spec_pools(
+        &self,
+        st: &mut State,
+        log: &mut Log<C>,
+        spec_pools: HashMap<ServerId, Vec<PoolEntry<C>>>,
+) {
+        ...
+        for cmd in recovered_cmds {
+            let _ig_sync = cb_w.sync.insert(cmd.id()); // may have been inserted before
+            ...
+        }
+    }
+
+

最后为了避免这个 IndexSet 占用过多内存,之前在 Xline 源码解读文章中提到的 GC 机制会定时清理这个结构。

+

不过,在极端的网络条件下,client 在发起 command 和收到返回之间的间隔超过了 GC 的间隔,IndexSet 中记录的 ProposeId 被 GC 清理了,client 重试这个命令会导致这个命令的去重失效。

+

我们在 madsim 的测试中发现了这种极端情况(由于 madsim 的时钟的流速比现实快很多,最后触发了这种问题),需要提出一个新的去重结构来解决问题。本文的后半部分将介绍 RIFL(Reusable Infrastructure for Linearizability) 的工作原理,后续的文章中我们将详细介绍如何在 Xline 中实现 RIFL。

+

RIFL 介绍

+

RIFL (Reusable Infrastructure for Linearizability), 是一种在大规模集群中保证 RPC(command) exactly-once semantics 的一套基础设施。为了将 RIFL 的术语和 Xline 系统的术语的统一,本篇章中 RPC 和 Command 具有相同的语义。

+

RIFL 简介

+

在 RIFL 中,首先要给每一个 RPC 分配一个 unique identifier,它由一个 64-bit 的 client_id 和在这个 client_id 下分配的 64-bit 的递增 sequence_number 组成。

+

client_id 需要由一个 system-wide 的结构生成,在 RIFL 中使用了一个全局的 Lease Manager 模块实现,Lease Manager 会为每个 client 分配一个 client_id,并创建一个与之对应的 lease,client 需要不断 keep alive 这个 lease,server 则需要检查这个 lease 来判断 client 是否崩溃。

+

其次,RIFL 需要一个 RPC 的完成记录和追踪信息持久化,然后,RIFL 在系统迁移时,RPC 的完成记录也需要一并迁移,这样可以保证 RIFL 在系统迁移过程中也能保证 RPC 不会重复执行,重复执行的 RPC 将会直接取出之前的完成记录。

+

最后 RPC 的完成记录需要在 Client 确认下清除(或者 Client 的奔溃后清除),这样可以安全地清理掉一些不必要的存储。

+

RIFL 具体组件及功能

+

下面是 RIFL 中的一些主要组件以及对应的功能:

+
    +
  1. +

    Request Tracker: 在 client 端追踪发送出去的命令
    +a. newSequenceNum(): 为一个 RPC 生成一个递增的序列号
    +b. firstIncomplete(): 获取当前最小的还未收到 RPC 回复的序列号
    +c. rpcComplete(sequenceNumber): 标记当前 sequenceNumber 为收到,后续用于更新 firstIncomplete

    +
  2. +
  3. +

    Lease Manager: 一个统一的 Lease Manager 模块,client 使用它为 client_id 续租, server 使用它检查 client_id 的租约是否到期 +a. getClientId(): client 获取自己的 client_id,如果不存在的话就询问 lease server 创建一个 +b. checkAlive(clientId): server 检查这个 client_id 的租约是否到期来判断该 client 是否存活

    +
  4. +
  5. +

    Result Tracker: 在 server 端追踪接收到的命令,以及 client 确认的进度 +a. checkDuplicate(clientId, sequenceNumber): 根据完成记录来判断这个 RPC 是否重复 +b. recordCompletion(clientId, sequenceNumber, completionRecord): 在返回给 client 之前标记这个 RPC 为已执行,并存储 completionRecord +c. processAck(clientId, firstIncomplete): 为这个 client 回收 firstIncomplete 之前的所有 RPC 的完成记录。

    +
  6. +
+

图片

+

当 Server 收到一个 RPC(client_id, seq_num, first_incomplete) 时,会根据 checkDuplicate 来检查这个 RPC 的状态:

+
    +
  1. NEW: 一个新的 RPC,按照正常的逻辑处理请求
  2. +
  3. COMPLETED: 一个已经执行完成的 RPC,返回执行完成的记录
  4. +
  5. IN_PROGRESS: 一个正在执行的 RPC,返回 IN_PROGRESS 错误
  6. +
  7. STALE: 一个已经被 client 确认回收的 RPC,返回 STALE 错误
  8. +
+

其次,Server 会根据传来的 RPC 中 first_incomplete 字段来调用 proccessAck,回收掉已经被确认的 RPC 的完成记录。最后,当这个 RPC 执行完成,返回给 Client 之前,会调用 recordCompletion 来将完成记录持久化,并标记这个 RPC 为 COMPLETED。

+

除此之外,Server 会检查 client_id 的租约是否还有效来判断一个 client 是否还存活,如果失效,则回收掉这个 client_id 下的所有的完成记录

+

RIFL 性能分析

+

在 RIFL 的结构中,很容易发现一处开销来自于 client 和 server 与 Lease Manager 之间通信的开销,RIFL paper 中提到了 server 可以缓存某个 client_id lease 的过期时间,在即将过期时查询 Lease Manager,这样可以省去一些的网络通信。

+

在上述的过程中 checkDuplicate 或者 proccessAck 中至少会有一个 O(n) 复杂度的操作(按 sequenceNumber 顺序记录进行 checkDuplicate 或者无序记录 sequnceNumber 但需要遍历过滤小于 first_incomplete 进行 processAck),和之前使用 IndexSet 方案的 O(1) 复杂度相比,RIFL 会在这里会有一部分开销。我们可以将 processAck 单独作为一个 RPC 用于通知 server 回收完成记录来优化一些性能。

+

最后,由于回收的第一种机制仅是检查 first_incomplete,这可能会遇到某个耗时很长的 RPC 阻塞了回收后续 RPC 的完成记录,最后可能导致 server 内存占用过多。RIFL paper 中提到了可以为某个 client 设置最大 inflight RPC 的数量,过多的 RPC 将会被拒绝,另外,也可以考虑提前回收后续的 RPC 完成记录,这样可能会使 RIFL 更加复杂。

+

小结

+

以上是 RIFL 为 unary RPC 维护 exactly-once semantics 的机制,paper 中 §6 Implementing Transactions with RIFL 中描述了 RIFL 对多个对象的 transactions 维护 exactly-once semantics 的机制,由于 Xline 系统的 transaction 会作为一个单一 command 发送给 server,所以不需要单独处理,感兴趣的读者可以看看,这里就不展开赘述了。

+

Summary

+

本文前半部分从 command 去重机制的契机开始,介绍了去重的必要性以及目前 Xline 的去重机制存在的一些问题。后半部分详细讲解了 RIFL(Reusable Infrastructure for Linearizability) 的工作原理,并对其进行了一些性能分析。后续的文章中将继续介绍我们是如何将 RIFL 应用到我们的 Xline 当中,以及对 RIFL 做了哪些必要的更改与优化。

`;export{n as assetURLs,t as default,a as metadata,l as toc}; diff --git a/zh-cn/assets/index-b9ee750d.js b/zh-cn/assets/index-20f01f19.js similarity index 89% rename from zh-cn/assets/index-b9ee750d.js rename to zh-cn/assets/index-20f01f19.js index b0d35f5..73d9619 100644 --- a/zh-cn/assets/index-b9ee750d.js +++ b/zh-cn/assets/index-20f01f19.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",s=[t,e,a],n={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=`

图片

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

封面

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

图片

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

图片

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

图片

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

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

MIT 6.175

@@ -66,7 +66,7 @@ case class Delay1() extends C
  1. Ready 打一拍,Valid 不打拍
-

图片

+

图片

因为 Valid 快于 Ready,所以当 Ready 由有效变为无效时,线路上多发了一拍数据。这一拍数据就要新增一个 buffer 去进行缓存。

因为第一拍数据送入之前为满,而之后都是处于空的状态,所以可以当成 Depth-1 Bypass FIFO ,在空时可同时进行 deq 和 enq 操作。

(这里可以考虑一下传给 master 的 Ready 信号。如果 buffer 为空,那么必然是 Ready 的;如果 buffer 为满,那么必然不是 Ready 的。这样就可以省掉一个寄存器去为 slave 的 Ready 打一拍。)

@@ -92,7 +92,7 @@ case class Delay2() extends C
  1. Ready 和 Valid 各打一拍,要求所有输出都为寄存器输出。
-

图片

+

图片

Ready 从有效变为无效的时候,Ready 到达晚一拍,Valid 有一拍有效数据已经送出去了。等 Ready 到达 master,已经多送出了两拍有效数据。所以这两拍数据必须被缓存起来

在数据传输刚开始的时候,第一拍数据是从 FIFO 中直出的。第二拍的时候,slave 的 Ready 送至 master。在之后的数据传输过程中,其中停滞的只有一个数据。

显而易见,可以使用 Depth-2 Conflict-Free FIFO,在非满非空的时候可以同时 deq 和 enq。master 的 Ready 信号就是 notFull,slave 的 Valid 信号就是 notEmpty。可见,所有输出均为寄存器输出。

@@ -223,12 +223,12 @@ case class Delay3() extends C
  1. MESI
-

图片

+

图片

MESI 协议将“Exclusive”状态添加到 MSI 状态机中,可以减少只在单个缓存中存在的缓存行的回写次数。

  1. MOSI
-

图片

+

图片

MOSI 协议将“Owner”状态添加到 MSI,可以减少由从其他处理器读取而触发的写回操作。

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


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

-

图片

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

图片

`;export{_ as assetURLs,C as default,v as metadata,M as toc}; diff --git a/zh-cn/assets/index-0bd243e2.js b/zh-cn/assets/index-38e8d7df.js similarity index 92% rename from zh-cn/assets/index-0bd243e2.js rename to zh-cn/assets/index-38e8d7df.js index 460e0be..1f4cf8f 100644 --- a/zh-cn/assets/index-0bd243e2.js +++ b/zh-cn/assets/index-38e8d7df.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:"中国香港",tags:["Xline"],date:"2022-10-11",title:"Rust Chat Room: Xline Cross Data Center Consistency Management"},o=[{label:"内容简介",level:2}],a=`

图片

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

图片

内容简介

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

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

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

-

图片

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

图片

`;export{e as assetURLs,a as default,n as metadata,o as toc}; diff --git a/zh-cn/assets/index-ffd70994.js b/zh-cn/assets/index-3b5176dc.js similarity index 98% rename from zh-cn/assets/index-ffd70994.js rename to zh-cn/assets/index-3b5176dc.js index ef9fd65..1acad32 100644 --- a/zh-cn/assets/index-ffd70994.js +++ b/zh-cn/assets/index-3b5176dc.js @@ -1,4 +1,4 @@ -const e="/zh-cn/assets/image1-b974e0d0.png",i="/zh-cn/assets/image2-599a44cc.jpg",a="data:image/png;base64,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",A="data:image/png;base64,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",r="/zh-cn/assets/image5-184dc93a.png",o="/zh-cn/assets/image6-18c75b26.jpg",t="/zh-cn/assets/image7-6a4a9bfe.png",n="/zh-cn/assets/image8-1849dbeb.png",s="/zh-cn/assets/image9-14a6fe14.jpg",g="/zh-cn/assets/image5-6a5e807d.png",p=[e,i,a,A,r,o,t,n,s,g],l={label:"精彩回顾 l SpinalHDL应用前景探索线上研讨会",description:"2022年12月16日,达坦科技联合SpinalHDL社区,举办了SpinalHDL Webinar 2022。在题为《SpinalHDL应用前景探索》的线上研讨会上,九位分享人在三个讨论分主题下做了各自领域内应用Spinal HDL的实践、挑战和经验的分享。",location:"中国香港",date:"2022-12-12",title:"SpinalHDL Application Prospect Exploration Online Seminar"},c=[{label:"数据通路加速",level:2},{label:"复杂系统设计案例",level:2},{label:"硬件设计流程",level:2},{label:"推荐阅读",level:2}],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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",r="/zh-cn/assets/image5-184dc93a.png",o="/zh-cn/assets/image6-18c75b26.jpg",t="/zh-cn/assets/image7-6a4a9bfe.png",n="/zh-cn/assets/image8-1849dbeb.png",s="/zh-cn/assets/image9-14a6fe14.jpg",g="/zh-cn/assets/image5-6a5e807d.png",p=[e,i,a,A,r,o,t,n,s,g],l={label:"精彩回顾 l SpinalHDL应用前景探索线上研讨会",description:"2022年12月16日,达坦科技联合SpinalHDL社区,举办了SpinalHDL Webinar 2022。在题为《SpinalHDL应用前景探索》的线上研讨会上,九位分享人在三个讨论分主题下做了各自领域内应用Spinal HDL的实践、挑战和经验的分享。",location:"中国香港",date:"2022-12-12",title:"SpinalHDL Application Prospect Exploration Online Seminar"},C=[{label:"数据通路加速",level:2},{label:"复杂系统设计案例",level:2},{label:"硬件设计流程",level:2},{label:"推荐阅读",level:2}],h=`

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

数据通路加速

图片

分享人:Tianrui Li

@@ -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,c as toc}; +

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

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

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

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

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

图片

直播亮点:

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

    -

    图片

    +

    图片

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

    -

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

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

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

    `;export{a as assetURLs,i as default,s as metadata,n as toc}; diff --git a/zh-cn/assets/index-1e192479.js b/zh-cn/assets/index-494dac65.js similarity index 97% rename from zh-cn/assets/index-1e192479.js rename to zh-cn/assets/index-494dac65.js index 5bcdc80..803af9c 100644 --- a/zh-cn/assets/index-1e192479.js +++ b/zh-cn/assets/index-494dac65.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}],s=`

    封面

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

    封面

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

    数据流式编程的思想

    +const v="/zh-cn/assets/cover-92745c95.jpg",e="/zh-cn/assets/image1-638abd39.png",s="/zh-cn/assets/image2-2a8f796e.gif",p="/zh-cn/assets/image3-ae1841b7.png",a="/zh-cn/assets/image4-5bf432ec.png",n="/zh-cn/assets/image5-81eb5b8d.png",l="/zh-cn/assets/image6-537c8738.png",o="/zh-cn/assets/image7-b58de99e.png",i="/zh-cn/assets/image8-c6334c83.png",t="/zh-cn/assets/image9-6340ddaa.png",c="/zh-cn/assets/image10-ac1b70de.png",r="/zh-cn/assets/image11-1f1870d2.png",_="/zh-cn/assets/image12-01c249ea.png",m="/zh-cn/assets/image13-a48112ad.png",d="/zh-cn/assets/image14-d780d4f2.png",u="/zh-cn/assets/image15-f58a4d86.png",h="/zh-cn/assets/image16-79c3985b.png",k="/zh-cn/assets/image17-863e7adb.png",f="/zh-cn/assets/image18-931263d9.png",g="/zh-cn/assets/image19-8f35c101.png",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"},I=[{label:"数据流式编程的思想",level:2},{label:"数据流式编程思想简介",level:3},{label:"软件开发中的数据流式编程思想",level:3},{label:"软件数据流 vs 硬件数据流",level:3},{label:"数据流思想与状态机思想的对比",level:3},{label:"Bluespec 语言及其流式编程框架 PAClib",level:2},{label:"Bluespec SystemVerilog(BSV)和 PAClib 简介",level:3},{label:"PAClib 中的基础开发组件",level:3},{label:"IFFT 应用实例",level:2},{label:"需求背景",level:3},{label:"代码实现",level:3},{label:"写在最后",level:2}],y=`

    数据流式编程的思想

    数据流式编程思想简介

    数据流式编程(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,19 +261,19 @@ 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,
                             mkCompose (mapper,
                                         mkCompose (ungrouper, permuter)));
     
    -

    图片

    +

    图片

    图 22 节点的串联

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

    图片

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

    参考资料:

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

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

    -

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

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

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

    `;export{w as assetURLs,y as default,T as metadata,I 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-65e0a878.js b/zh-cn/assets/index-5fa4b651.js similarity index 97% rename from zh-cn/assets/index-65e0a878.js rename to zh-cn/assets/index-5fa4b651.js index 85ae0e5..8dbcdb6 100644 --- a/zh-cn/assets/index-65e0a878.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],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}],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,o as metadata,i as toc}; +

    图片

    `;export{t as assetURLs,a as default,o as metadata,i as toc}; diff --git a/zh-cn/assets/index-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-28dd2373.js b/zh-cn/assets/index-69ce89cf.js similarity index 95% rename from zh-cn/assets/index-28dd2373.js rename to zh-cn/assets/index-69ce89cf.js index cec9790..dc1b8d9 100644 --- a/zh-cn/assets/index-28dd2373.js +++ b/zh-cn/assets/index-69ce89cf.js @@ -1,4 +1,4 @@ -const t="/zh-cn/assets/image1-b170e804.jpg",o="/zh-cn/assets/image2-29d090cb.png",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!"},l=[{label:"Hackathon2023",level:2},{label:"主题",level:2},{label:"大赛时间线",level:2},{label:"背景介绍",level:2},{label:"赛题介绍",level:2},{label:"评估标准",level:2},{label:"赛题宣讲会",level:2}],s=`

    Hackathon2023

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

    Hackathon2023

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

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

    主题

    @@ -31,4 +31,4 @@ 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,s as default,e as metadata,l as toc}; +

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

    `;export{n as assetURLs,l as default,e as metadata,s as toc}; diff --git a/zh-cn/assets/index-5f61d62d.js b/zh-cn/assets/index-71801d47.js similarity index 95% rename from zh-cn/assets/index-5f61d62d.js rename to zh-cn/assets/index-71801d47.js index 6bb52de..1fe4386 100644 --- a/zh-cn/assets/index-5f61d62d.js +++ b/zh-cn/assets/index-71801d47.js @@ -1,4 +1,4 @@ -const t="/zh-cn/assets/cover-cf0f8eeb.png",o="/zh-cn/assets/image1-6485c4dd.jpg",s=[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"},e=[{label:"2023 RISC-V中国峰会",level:2},{label:"活动信息",level:2}],r=`

    图片

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

    图片

    2023 RISC-V中国峰会

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

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

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

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

    -

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

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

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

    `;export{s as assetURLs,r as default,e as metadata,n as toc}; diff --git a/zh-cn/assets/index-90593fbc.js b/zh-cn/assets/index-86e42443.js similarity index 99% rename from zh-cn/assets/index-90593fbc.js rename to zh-cn/assets/index-86e42443.js index 9099a01..e71ef1d 100644 --- a/zh-cn/assets/index-90593fbc.js +++ b/zh-cn/assets/index-86e42443.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,iVBORw0KGgoAAAANSUhEUgAAAMQAAABGCAAAAAC2tWRkAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAozSURBVGje7Zl7VNVVFsc/cAHpJupNGXyAUAQBgpKGFDI/qMzB1MVUiKlF5uTYw0abSZdZ1hqzh+ZKXWmZaZbpND4iV+ZopiHJJIKIPLtQ5KWrKAH+lMdV5HHnj9/9/e65F6a5w7RW11nsv/Y+Z+9zzvfsfc7Z5xwPK9c+ef7aA+gF0QvCzagXhLtQLwh3oV4Q7kK9INyFekG4C/1fgPD6tQfgRPWbOsD7qeuBI7k+OtoiJl97IFosLSfgllTgamUVRNzqgpGH293sqmZD0FZPgJe/2TzUFRP3WxMl+omYCwE4c7dLGNwQROHoByATwGJ0JZbcEURn3piwGHJqgG+JuUZBmCwxpMFeoHjob1yz6bo7XTh1sryR6OS46x2Kq39M0AFXKi81XWpKGf6LDrzIGqvxJfqbGGeQ9zziS0GcVlrRcIeHyrceC3daKs4gzq7Jg/BhlVlZvCwJ5SXzht6uA75cBZDwi2LYtW6iHcTJ0Tq8096zfHXv5ZL7tdK8TZMWqihaV/DWzY4tWEW6ul2SUj+XrdbLX0iS9JG94nyKVGm1Wq3WkjcflyTpioPV+eNZe7d/bO0p5UoPNmtCR8ouq9XaIEkZ1hNSnVbc/idpiybkSak/ObTgAOJ8hiQtb1T4ckmSjqsVlx+TPlX5LEma5ziKdZIkSTN7iqE6RaqwS98rwnJJKtr8oKBVlyJ9oQmbpUebxSbEhV37lInU5/wUIXImrO+0eeuNysRUVasURjs6MzJR3/NYal5imRcuhC2hAPdBZv7tgtqgZbzygyo8ElP1ptiGAKJlQR13LtAKUsH0T4UtPMQsbV3lwkjHcdz1yqs9B7HbrE8VxBMJOoCoCLLKR4l6cTG8r/K6Rzn0XfcgNtWgt2MgAPheYT8hNkwtbjBDpPNIXDtYu6OrO5juYxc7CmznWxo4nRLTOFqh8qND+KBbECWZMG+AUOUP1QDU5DDNrgZRXaKn56fNEQtTBLHYEq0wSXqCBjpoJvizReU9ZpBj7Kb71hWgHy9atcOPAOxFbw/PIrgN6CzYWWjPHT3oKe0iyaAJRzcu4YO9zQA+6cQ5auqmcKxRFZLgSDcgvjTD1D6CUYcMeoD2PcTapzofYuHHuX9ev+Dd/x1ERaUQNJde3W7h+CoLAJMZ66QbBcUq7xvFMXuNdtgdAxwccRq4CaDaIqxkZUmcmm+Y/al8YK46eAFEW1n+Wf+wEcM0D1dVEBjrdSDXnPRw16grhxGa0H+/UOOf7awbAQWJqjCq3HThBmcQrTlgcEgmSoAQgEqI0kpLIUqf/2zMa9tlWq1dPVD9vBm9BWbPVFr+27sAhgAjVI2K7aJuRNlSXSG/EFPufFUYAcXJqqBOTmmXZOIEEGwDcaNWWgSjjz4bv8rvW0juOrNfZ5ijPtq3ZwbvP90GWFe+y8R1r8fIxrHvwMWuAysjtA+uUjg1bSp/o7rriJ4oVvxlp5ocIAzgHPTVigvgq20TFnkzZ3vEfV26qVlK+GpfDHP915Z/MAfy9hH0rBfDHqY08FXLOGh5Q7546Z0hmoEZ+7Lmy26Hfo/GDYBmVd0PLnUBcRnE9mAXMLsfQDN6bcplE9To03UQ/Vo3Hb4Fqb4Ak7bK2xIjyYa7vGB4iMlSMg7ganu1jD3BvgJ+duvj/wFEX2hUx6jvDsT1QH/BVM4E/QMAXMR+epQCWB4L+cvI7vo79w0om3GfxL1kR1Jn77IWAMPytZnxOs3AAv3s5i/w8+QHTSrvLUanCiIYaBMMPgNmKVHULERTMUxPXldievrDkG56MQGDFLY/VEBIHpdtgw2w6eQjLG+LMnsO9N5PAHh6eAZN6udQ0xe0gwKDLGu8GijBQL3giL9DaKqKs0MrL4C4iNWJcBTqf3Du/5yd9QIjjIOcTqgwobcljfVmMfPyhnbnRhqaDh48eKG5+ULhhinrOsSadsfrj3cXTwQCx36nlrYttWBY4asIA+suqOWNVRCFd1wOTXQ+NuQdp/47gTalbStYIPbuwzXLU87uhL9ep6iUwi0Oc9vk1AaLSatLWga0rd63a3CaUNNkO32VaRYCUfWE9xOQpbqi9bUS9Cv9VcehOa4MYq4DGQZTIduPVFsCMkyJEBSvhkBHMYbDC9fU+G9UdYu4zZvqDbN3grJWuoCgro7bALxTlX1eo2Yh+K6Igaj5Z2qWkaVrfQBqXzQSulzLTAdo00spjAF8wJ9dTHQGcTNg7q9GVhKcqZv0TEVN3/BBmmY+ozny0t1V6ycMADwMciPOVKbm+s3g8FLQKOxlzXTjCXRL/CmffVRuKl+dbiT9bXt2PQDUeCqGUUqO/PXGw6mDNZUO6AD8UyEPgJ9Owni4SFl79IQEO4YGMyP3r1gfpIQe+IvrSHOWPhiAf0CSWFGPXss0ZPEEtq+U4G3v7zAru9z0tEGCbSQYA1QnBkUDIzO2HiT+aQdHX+7QQcbX8ocj4uHq2/DEcAjEND3c28vnuoExI/rYXFmwZ11oGVOU4URX1tlTIM1ZysvGlkMsHCOUW08Src25UVxbwnL3ffK+709X9wseHubn0OgoKLPNyIrvon0A/jDZNDhYU9h2wAzy5IHPjBm0fn7dovFh7dmVPJQODEw+ItuOMMOiBCVr2fJ6KNNSbZvGmEyMTk8nDWb6l1o7zZlVUQ87VNVYHHO4m7oDAUOG/JauNCC0qsjG3hBvYwICBIUWs74PtJrbYdimPTsOHYJ7ZwUAVJZpSvJzm2+GPAzy4uTnfG0YGAllTiBK4EAWtFpCFgc7VJRDvCYUEO+rCa487d9RZWzs9zP1c+cKiGfNqG7xGqJcyuT5lqCXhnt7tF427j7B1mXIZl42LD5iXaaq94sw5s1xbK0I/T5P6DiwMmPyQrGikHDNE+fqEDI3Vy6Wk2GfC2o28gmLjbZdLHMtLA3r4+nha7hjZRTlUAoRgTP5jtO/t6UH6VSWO9rnEucJ6CaN5/NTQvnFfUzVhM8YaveKSyCG3M+Odhf0utAlLQtBF0gdFDPWmxYGkx1o27TvDGK3g019Dba3gggQc4LP0WsXCMsepgojd+mKPwM52xU9Z4qDZbYZzz7InXCKWyEKrzM71BdKzz9yuFa0KQLbW8E5sOfsXN0tPIt8YdHfI9i4BMJ/Dm81uqLoRKGPcypjZ02LnP/8i8TMgzMkQGRy3sx77lJ1EseyRvytKlS3nfOfoBdenrbIsTNUvnYjy8Qd1LXvLuuK/YnLe/IaUPye7W6vn/aQF9QqyWxDq/BQ1fKk6al0u5hWl/gKwNmlVayxf7IcW+y/Sb0RtC8oeXKa2IuLf3Zti07Om+qSpjPVltZbPAYOG6X79xpz5Q2257hKk2k78eN1nW3F+/F/yf4QUjvLsll7Cd/w8YQlDjPq6sdj0wvVn+hcU/2v6fQzY5Yq3CLtcqePjUsR3ujWZq7SnqHqH/jtC74ODbjf72kPyO2+u3pBXMvUC8JdqBeEu1AvCHehXhDuQr0g3IX+BVArSBMwv4MDAAAAAElFTkSuQmCC",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,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",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=`

    引言

    +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,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",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,iVBORw0KGgoAAAANSUhEUgAAAJYAAABGCAAAAAALVDIRAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAfQSURBVGje7Zl7UFTXHcc/y7JCrqJscWMVeUSEiKISDRoFq0G0qY9hJKLF11hbX62pMa1ObCSMjNpo0jGO0Wg12ljrRCSMiaE6RKsYGxUMCosUmBAXN64SlEVcLpLl0T/uPu4+QCBTyrR7/jr3/L737Of+zr2/3++cVbTSE5vXfxvAg+XB8mB5sDxYHqwe0jxY/wNY3t31Q58UAy9MBczvKFVezU2/+lFPwKo1/ctI/k9U8PhhoYh6lG97akX3VadpFyAtHuD24pRV7Wu7791qyUuCLADuMecJ4u7D0okz4tCWAxQPGtBjsLTCkCQ4CVAQ8yRx92EVjFGOCSK7Fhq0o58kdv0Sa24UlNQRNSWmt8Nw5e2Jyh9C1ZK3HMW8P3E6hRJGOdrKHkxQtO+tO+vnbD6lDKw/nzbjonxcu2Rvyw9ylk6MggQ43kzhII2jLW/j204BwdFb5hP7US+P9efxxa2kLl9kM1RtIF1FVaVoqvP6eZewtEIYCPMyjF9Oyh/nZFtwLfvppW1jVW3QMf23foDv9KBVHIiw3v94k7guHDIzgKCuYRWMUQKzM8gaWzLfyaZMXXx40HT5iHwRq36jI3Gjn3QRuRD2WNat9e3yuEQgMk7oEhLQkhcNEDyegk+Icrb2T2frN21g1b9azYuv2gYSQfdPqXv9LEsVQPzWbV3F+kaUXvOXYV9QfxdzzEgOtYF10IBgp2IA8LXU/ZjocKk3qKtYRQyVfn8QuIta8/mizC2WNgvW+MtMGqgEwHCJ+S7yzrWW3HFSePFKhmg3gokaDrvDatwOQoJc2QS3ATiF8IJlTEFX2r2s9TfyjhQCMA1GupEoZ3O5zg3W53pI9pEJm40gADSdJNoq6xrWp7uuwQfnAPBLGua20BoORfYrW4C4DDg46xYwBKBStEdlGZb5Zv4dTfiIQJu7K8oYHO195op+8mKntV6xQnax1j36MPgqzgWr8RKog+U6LRAKUA7DXaepfEOPIMKyhdIUx/YDqAeUQsXoaDrd/EJ1V+zE1ucqBiY66K4BIRasZ1xmubhEP/yv2ScXcOgVM9C6Yz8/e++tkcbSce9DbeepIAKD2cVbRZIf7c1wCQgHuAt9nOcwpBKx0xf1Ss2ukr8sh7xsgn7vTeBiigdvE2Ntus+fBDPN1vMHk9oZqwFQy/UngGV9AUwILnFhNyT6Asw8YjwaF0kuxHtDcKhO1MbKdFc7jtUH6lywegP9ZHJjFggvA1CLv/Nkd78EKWb4xJ0iN5Jqi0GAKrlwU8cX0Q8euSxiCGCWiT4FlkprZ3JdQx1gySD9oAxC82gAEKXsIG/7Kh7UvDLVdnngOwC8FF5BM/vKdX3AHrisyxMC3Jc56yMIS7SSN7t4y971hlKIhUstUKZDGOOkFR9UGAPtlw8e5eTk1JhMNdf3zX5PPnGTvJyx9gYDl39qHTWniqi3W3ZyAdU1zlgtgFkFQCuIED31nGHLS3cyYPNTTtrXLqRZ8iEArzO3enI6YN6ZfeLHc+2GR5bo7eAt1Wo4b3VX4x+1CDusJaQao01uKSIDpfVCcnEoNBehPrf+XYPmz84lHhQyTl7VVVfzPIAqUQpC1maSXnBHb5F8vpTUXb0Aqt4sJWyLrVjwt3nGhjUU0Pezrudk+LZ65royQ58I15IF8h1z800sScMET8vG68DPxVso/6ChZNkXxkclO+eVMm+vvYTxB9sqNkMzoEmEPAC+K4AEqOVmU9T0ie6o7utx2OgUIoQA8HeYLNch2JOl3b0hRw8d10sfdMpc+fyRUGr9vEzQ0KyEJReNH44YD9/vhdXBMBhdSoTKu9dTASNH+DhiFcOzPDzzj/A1vhbnSducw2dZP9Yuay0gyssNFr6/nvP1rcq+IcHhfg7zjoab0mMdPaMH46yAdWP771lbvSEhvCm3nEXzgIApF4yW0Kne4JjECnledWtdxO3SCbEAD/T0K25t0WdVDF8sFxpEeeZ12GIMHDjJzSr4h1VIpRL1esEHGvVNEHjw5PGzZ2HG0gEA5TdtcuPGD4bKb8/nufK1K4KvWsKMFs6ch0Yx9PUQuawExreB1UabUFFa1xdg5UoZ7NIFlfXeAwMklLViUFqwStHYUJp5jSPpsptr9NSvfW1aMcPGWF+tbC9oPrNjyaz1Mt11ImTe6kgVPAuy3Qz3Co+Okqi4IpIa7uOl8FVP2DGcEqdX61hyPFE5+6VccYUYL0A5M4HPbthltdkky+7qCNbAJI43tat4aMtFKAfbEiQANxCED5cZsHwI9w08J/WGgWwP9hnClE5isQBjbruCGEi3ZNTcHF6Um75iYeYk3S+tj1WIdZd4FwbaVN9nktKrs1ia5eyua08QtoobSzIM9cb8N95k5BqZpVZHdO/ViMbmRVqA65ZKnHsfI9jj2WFj9AL5hB07O1347entW9rbXqSMOFC0Zw+AMH+RfM4SeJZ6UBfqnwG4QpwS4E4qbLPlwMvHNJsdSDqGpfhd1aXM5PYUo3ZXFd8XFQGBox2Pm7SMUxEsiKYDiX0o1+mqMecoW8xFp9Gk2TZmVem85VjTdfCkWZW+6W9J7Z9vDXB78FhFPPj+Yk9ixCo4eBW4ehUQJsa8ZK8XPhLfGep423/6pPlR9RCAx3eGdGqL2Y0H4J1pPfTPFQ+WB8uD1ROaB8uD9X+G9W9yyGPPWBtOvwAAAABJRU5ErkJggg==",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=`

    引言

    在 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,k as default,y as metadata,f as toc}; +

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

    封面

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

    封面

    Xline 是什么

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

    Xline 的整体架构

    @@ -21,7 +21,7 @@ const e="/zh-cn/assets/cover-6865ae02.png",l="/zh-cn/assets/image1-1421d5c3.png"

    为什么选择 CURP 协议

    那为什么 Xline 要使用 CURP 这样一种新的协议,而非 Raft 或者 Multi-Paxos 来作为底层的共识协议呢?为了说明这个问题,我们不妨先来看看 Raft 以及 Multi-Paxos 都存在什么样的问题?

    下图是 Raft 协议达成共识的一个时序流程:

    -

    图片

    +

    图片

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

    1. client 需要向 leader 发起一个提案请求。
    2. @@ -30,7 +30,7 @@ const e="/zh-cn/assets/cover-6865ae02.png",l="/zh-cn/assets/image1-1421d5c3.png"
    3. leader 统计所收到的成功响应的数量,如果超过集群节点数量的一半以上,则认为共识已达成,提案成功,否则认为提案失败,并将结果返回给 client。

    下图是 Multi-Paxos 协议达成共识的一个时序流程:

    -

    图片

    +

    图片

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

    1. client 向 leader 发起一个提案请求。
    2. @@ -77,4 +77,4 @@ b. follower 接收到请求后,由于 z = 9 与 witness 中的 z = 7 相冲突

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

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

      -

      DatenLord | Xline Geo-distributed KV Storage

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

      DatenLord | Xline Geo-distributed KV Storage

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

      封面

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

      封面

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

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

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

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

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

      +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",R="/zh-cn/assets/image17-ecbf7b1e.png",S="/zh-cn/assets/image18-88f5d1b8.png",F="/zh-cn/assets/image19-5df924ff.png",D="/zh-cn/assets/image20-5dfde1d6.png",A="/zh-cn/assets/image21-90c388d7.png",b=[i,o,e,n,l,t,a,p,s,d,P,c,r,h,g,m,R,S,F,D,A],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 与零知识证明

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

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

      图片

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

      -

      图片

      +

      图片

      • 流水线处理:
      @@ -252,11 +252,11 @@ 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 左右。

      -

      图片

      +

      图片

      ###  5.2 计算性能测试

      TRIDENT 项目中设计了两种方式测试 Poseidon 加速器的计算性能:

        @@ -266,7 +266,7 @@ const i="/zh-cn/assets/image1-9e1613a7.png",o="/zh-cn/assets/image2-7b7b20fc.png
        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 的加速性能相比仍有很大的提升空间.
        -

        图片

        +

        图片

        总结

        TRIDENT 项目旨在为 Filecoin 分布式存储系统中涉及的 Poseidon 哈希计算实例提供一套完整的 FPGA 加速方案。硬件上,我们基于 Xilinx Varium C1100 FPGA 板卡搭建了一个完整的加速系统,该系统主要由 XDMA、FIFO 以及 Poseidon 加速器 IP 三部分组成,并通过 PCIe 接口与服务器主机进行数据传输。软件上,我们为 Filecoin 的具体软件实现 Lotus 提供了访问底层 FPGA 加速器的接口,并通过 Lotus-Bench 对加速器的计算性能进行测试和比较。

        整个硬件加速系统的核心模块—Poseidon 加速器 IP 的设计主要可以分成单元运算电路和整体架构两个部分。其中单元运算电路包括 255-Bit 的模乘和模加,对于模加器,TRIDENT 中采用基于加法的取余方式避免了多余的比较器电路开销。对于 255-Bit 模乘电路,我们基于 Karatsuba-Offman 算法将高位宽的乘法分解成若干并行的小乘法器实现,同时采用 Montgomery Reduction 算法将取余过程中复杂的除法运算转换成乘法实现。在加速器架构的设计上,我们针对具体的 FPGA 硬件资源限制,基于流水线和折叠技术设计了一个串行的 Poseidon 计算架构。性能表现上,目前 FPGA 加速器电路能够工作在 100MHz 并为 Filecoin 提供两倍于 AMD Ryzen 5900X 处理器的加速性能。但和 RTX 3070 GPU 相比还存在 2~3 倍的差距,仍然有较大的提升空间。

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

      2. -
      `;export{A as assetURLs,C as default,T as metadata,u as toc}; +
    `;export{b as assetURLs,C as default,u as metadata,T as toc}; diff --git a/zh-cn/assets/index-dcc07e36.js b/zh-cn/assets/index-aaba7b29.js similarity index 98% rename from zh-cn/assets/index-dcc07e36.js rename to zh-cn/assets/index-aaba7b29.js index bd92ad6..d85a4e3 100644 --- a/zh-cn/assets/index-dcc07e36.js +++ b/zh-cn/assets/index-aaba7b29.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",i="/zh-cn/assets/image8-f5342e9f.png",c="/zh-cn/assets/image9-f8fdd108.png",r="/zh-cn/assets/image10-fea0520f.png",C="/zh-cn/assets/image11-3896bab5.png",o="/zh-cn/assets/image12-5d3c96d7.png",h="/zh-cn/assets/image13-56596c1a.png",d="/zh-cn/assets/image14-1cff1399.png",u="/zh-cn/assets/image15-f50d9208.png",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,i,c,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}],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",f=[s,a,t,e,l,p,n,c,i,r,C,o,h,d,u,m,g,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}],w=`

    引 言

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

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

      @@ -47,9 +47,9 @@ const s="/zh-cn/assets/image1-85650830.png",a="/zh-cn/assets/image2-d3ac686f.png
      1. 若多项式
      -

      image

      -

      image

      +

      +

      image

      1. image
      @@ -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{y as assetURLs,F as default,f as metadata,x as toc}; +

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

      `;export{f as assetURLs,w as default,y as metadata,x as toc}; diff --git a/zh-cn/assets/index-0c28844a.js b/zh-cn/assets/index-b21d7686.js similarity index 99% rename from zh-cn/assets/index-0c28844a.js rename to zh-cn/assets/index-b21d7686.js index c500077..4f83997 100644 --- a/zh-cn/assets/index-0c28844a.js +++ b/zh-cn/assets/index-b21d7686.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}],f=`

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

      简介

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

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

    `;export{I as assetURLs,A as default,P as metadata,D as toc}; diff --git a/zh-cn/assets/index-82a24597.js b/zh-cn/assets/index-b28c82c1.js similarity index 97% rename from zh-cn/assets/index-82a24597.js rename to zh-cn/assets/index-b28c82c1.js index 0a7213c..0941791 100644 --- a/zh-cn/assets/index-82a24597.js +++ b/zh-cn/assets/index-b28c82c1.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],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=`

    封面

    +const e="/zh-cn/assets/cover-c17c52cc.png",s="/zh-cn/assets/image1-0dff4570.png",c="/zh-cn/assets/image2-e09cfdc8.png",o="/zh-cn/assets/image3-2b589463.png",a="/zh-cn/assets/image4-5841c9d6.png",p="/zh-cn/assets/image5-92344f1d.png",d="/zh-cn/assets/image6-b429f851.png",r="/zh-cn/assets/image7-97920b5a.png",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,a,p,d,r,i,t,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=`

    封面

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

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

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

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

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

    图片

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

    -

    图片

    +

    图片

    • EXTENDS 用于引入其他 specification 中定义的 module,这里引入了标准库中的 Integers,主要用在 i' ∈ 0..1000 上。
    • VARIABLES 用于定义变量,这里定义了 i 和 pc。
    • @@ -83,7 +83,7 @@ Next 用于定义状态转换关系。

      二阶段提交(英语:Two-phase Commit)是指在计算机网络以及数据库领域内,为了使基于分布式系统架构下的所有节点在进行事务提交时保持一致性而设计的一种算法。通常,二阶段提交也被称为是一种协议(Protocol)。在分布式系统中,每个节点虽然可以知晓自己的操作时成功或者失败,却无法知道其他节点的操作的成功或失败。当一个事务跨越多个节点时,为了保持事务的 ACID 特性,需要引入一个作为协调者的组件来统一掌控所有节点(称作参与者)的操作结果并最终指示这些节点是否要把操作结果进行真正的提交(比如将更新后的数据写入磁盘等等)。因此,二阶段提交的算法思路可以概括为:参与者将操作成败通知协调者,再由协调者根据所有参与者的反馈情报决定各参与者是否要提交操作还是中止操作。—— Two-Phase Commit (Wikipedia)

      Leslie Lamport's The TLA+ Video Course 中,Lamport 以这样的方式类比解释 Two-Phase Commit:

      -

      图片

      +

      图片

      在婚礼上,牧师是协调者,新郎和新娘是参与者。当新郎和新娘都同意婚事时,牧师才会正式宣布婚事。如果有一方不同意,牧师就会中止婚事:

      1. 牧师问新郎:你是否同意这件婚事?
      2. @@ -105,7 +105,7 @@ Next 用于定义状态转换关系。

      3. 变量 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,g as metadata,h as toc}; +

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

      `;export{m as assetURLs,A as default,h as metadata,g as toc}; diff --git a/zh-cn/assets/index-0850e6f5.js b/zh-cn/assets/index-bccae718.js similarity index 98% rename from zh-cn/assets/index-0850e6f5.js rename to zh-cn/assets/index-bccae718.js index ec0052b..b0e677f 100644 --- a/zh-cn/assets/index-0850e6f5.js +++ b/zh-cn/assets/index-bccae718.js @@ -1,4 +1,4 @@ -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=`

      喷泉码简介

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

      喷泉码简介

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

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

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

      @@ -30,9 +30,9 @@ const o="/zh-cn/assets/image1-f1a8209b.jpg",p="/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-f6eeef5e.js b/zh-cn/assets/index-c719bd5c.js similarity index 97% rename from zh-cn/assets/index-f6eeef5e.js rename to zh-cn/assets/index-c719bd5c.js index 77dbcfc..2516e15 100644 --- a/zh-cn/assets/index-f6eeef5e.js +++ b/zh-cn/assets/index-c719bd5c.js @@ -1,4 +1,4 @@ -const e="/zh-cn/assets/image1-86fdf634.png",t="/zh-cn/assets/image2-639b53e5.png",a="/zh-cn/assets/image3-c2c092f7.jpg",p=[e,t,a],s={label:"Curp 共识协议的重新思考",description:"共识协议是一种让分布式系统中多个节点保持信息一致的通信协议,即使少数节点发生故障也依然能够保证信息的准确和一致。而每当我们在讨论共识协议的时候往往会想到 classic paxos 或者 raft 协议,这两个协议是很多其他协议的基础,后续的很多协议都可以看成是它们的变种,例如Multi-Paxos 和Fast-Paxos 等等。我们今天先从这两个协议入手,先来回顾一下这两个协议是如何工作的。",location:"中国香港",tags:["Xline"],date:"2022-07-07",title:"Rethinking of the Curp Consensus Protocol"},r=[{label:"共识简介",level:2},{label:"Curp 共识协议",level:2},{label:"Curp 协议总结和讨论",level:2}],l=`

      共识简介

      +const e="/zh-cn/assets/image1-86fdf634.png",t="/zh-cn/assets/image2-639b53e5.png",a="/zh-cn/assets/image3-c2c092f7.jpg",p=[e,t,a],r={label:"Curp 共识协议的重新思考",description:"共识协议是一种让分布式系统中多个节点保持信息一致的通信协议,即使少数节点发生故障也依然能够保证信息的准确和一致。而每当我们在讨论共识协议的时候往往会想到 classic paxos 或者 raft 协议,这两个协议是很多其他协议的基础,后续的很多协议都可以看成是它们的变种,例如Multi-Paxos 和Fast-Paxos 等等。我们今天先从这两个协议入手,先来回顾一下这两个协议是如何工作的。",location:"中国香港",tags:["Xline"],date:"2022-07-07",title:"Rethinking of the Curp Consensus Protocol"},s=[{label:"共识简介",level:2},{label:"Curp 共识协议",level:2},{label:"Curp 协议总结和讨论",level:2}],l=`

      共识简介

      共识协议是一种让分布式系统中多个节点保持信息一致的通信协议,即使少数节点发生故障也依然能够保证信息的准确和一致。而每当我们在讨论共识协议的时候往往会想到 classic paxos 或者 raft 协议,这两个协议是很多其他协议的基础,后续的很多协议都可以看成是它们的变种,例如 Multi-Paxos 和 Fast-Paxos 等等。我们今天先从这两个协议入手,先来回顾一下这两个协议是如何工作的。

      首先来看 classic paxos 协议,如下图所示。Paxos 分为两个阶段(Phase),第一个阶段是 Prepare,主要任务是在 Log 上占一个 Slot,第二个阶段为 Accept,主要是确定这个 Slot 已经明确被占用了,且在两个阶段间没有被其他人抢占。当 Client 收到绝大多数人的 Accept Ok 回复之后,说明该条记录已经被提交,在整个系统达成了共识。这里 Client 和 Proposer 可以视为一个整体,整个过程在两个阶段分别有一次消息传递,总共发生两次消息传递。

      图片

      @@ -38,4 +38,4 @@ A5:首先恢复流程需要选举一个新的 Master(Leader),该流程和 Ra

      Curp 协议总结和讨论

      通过上一个章节的论述,我们不难发现 Curp 协议和 Raft 协议非常像,其中的不同点就在于“等待池子”,这个池子的目的在于给冲突的请求排序,多个冲突请求一定不能被所有节点的“池子”同时接受,此时最多只有一个请求被 commit,也有可能所有请求都需要等待 master 的同步。也就是这个改动,让协议在某些情况下有更优秀的性能表现。

      所以总结一下, Curp 协议在乐观情况下一个消息传递就能达到共识,悲观情况下会退化成 Raft 协议,需要两个消息传递才能达成共识。

      -

      关于 Curp 协议的更多细节请参考原始论文:https://www.usenix.org/system/files/nsdi19-park.pdf

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

      关于 Curp 协议的更多细节请参考原始论文:https://www.usenix.org/system/files/nsdi19-park.pdf

      `;export{p as assetURLs,l as default,r as metadata,s as toc}; diff --git a/zh-cn/assets/index-0b4fd2ad.js b/zh-cn/assets/index-cc44974b.js similarity index 90% rename from zh-cn/assets/index-0b4fd2ad.js rename to zh-cn/assets/index-cc44974b.js index 9311f36..6662ee7 100644 --- a/zh-cn/assets/index-0b4fd2ad.js +++ b/zh-cn/assets/index-cc44974b.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],o={label:"SpinalHDL的使用和开发经验研讨会",description:"SpinalHDL始于2014年,最初是作为VHDL/Verilog的替代而做的创新尝试,伴随着数年来开源硬件设计的蓬勃发展,基于开源技术的硬件设计方法和范式逐渐受到业界的关注。",cover:"./cover.png",location:"中国香港",date:"2023-07-03",title:"SpinalHDL usage and development experience workshop"},r=[],g=`

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

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

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

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

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

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

      @@ -11,6 +11,6 @@ const p="/zh-cn/assets/cover-9e502538.png",n="/zh-cn/assets/image1-09ca1c97.jpg"

      无法到现场的观众,也欢迎观看在线直播分享:
      直播预约:腾讯会议+视频号
      474-6575-9473

      -

      图片

      +

      图片

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

      -

      图片

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

      图片

      `;export{o as assetURLs,g as default,a as metadata,r as toc}; diff --git a/zh-cn/assets/index-b2f220f4.js b/zh-cn/assets/index-d735fd77.js similarity index 95% rename from zh-cn/assets/index-b2f220f4.js rename to zh-cn/assets/index-d735fd77.js index aac8d66..7ea28fa 100644 --- a/zh-cn/assets/index-b2f220f4.js +++ b/zh-cn/assets/index-d735fd77.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],a={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"},p=[{label:"毕设项目的背景",level:2},{label:"细分方向",level:2},{label:"开源毕设导师组",level:2},{label:"开源毕设项目的流程",level:2},{label:"申请流程",level:2}],r=`

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

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

      图片

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

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

      图片

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

      -

      图片

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

      图片

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

      封面

      +const t="/zh-cn/assets/cover-0645adbc.jpg",o="/zh-cn/assets/image1-4a25d469.jpg",e="/zh-cn/assets/image2-ee430ce0.png",a=[t,o,e],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"},n=[],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",o="/zh-cn/assets/image1-4a25d469.jpg"

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

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

      图片

      -

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

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

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

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

      图片

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

      图片

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

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

      MIT Training Q & A

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

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

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

      -

      图片

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

      图片

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

      SpinalHDL 是什么?

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

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

      图片

      -

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

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

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

      `;export{a as assetURLs,i as default,n as metadata,p as toc}; diff --git a/zh-cn/assets/index-e7ccea1d.js b/zh-cn/assets/index-eb1ecfd7.js similarity index 92% rename from zh-cn/assets/index-e7ccea1d.js rename to zh-cn/assets/index-eb1ecfd7.js index 0c3885e..ab04b63 100644 --- a/zh-cn/assets/index-e7ccea1d.js +++ b/zh-cn/assets/index-eb1ecfd7.js @@ -1,4 +1,4 @@ -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=`

      封面

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

      封面

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

      内容介绍

      -

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

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

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

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

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

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

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

      Tooling and flow:

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

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

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

      -

      图片

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

      图片

      `;export{p as assetURLs,s as default,a as metadata,t as toc}; diff --git a/zh-cn/index.html b/zh-cn/index.html index ee95ff0..18b9d0f 100644 --- a/zh-cn/index.html +++ b/zh-cn/index.html @@ -5,7 +5,7 @@ 达坦科技 - +