From 74cba04ef8511432b8a45adea4dd00195122f63f Mon Sep 17 00:00:00 2001 From: MatejVukosav Date: Tue, 18 Jun 2024 15:11:52 +0000 Subject: [PATCH] deploy: 830078f93b88149db3f1a53fadeaf4ad9dfb1cbe --- 404.html | 4 ++-- assets/js/{08c23959.fc47f7f4.js => 08c23959.6bd7c2a8.js} | 2 +- assets/js/{0b38cd53.f1992d53.js => 0b38cd53.6da65df6.js} | 2 +- assets/js/{13477880.8cbafae9.js => 13477880.43635d74.js} | 2 +- assets/js/{150624dd.8662a7f4.js => 150624dd.f65b10fc.js} | 2 +- assets/js/{190ec3a6.566087c8.js => 190ec3a6.84db3e62.js} | 2 +- assets/js/1a4e3797.a25287f0.js | 2 ++ ...85.js.LICENSE.txt => 1a4e3797.a25287f0.js.LICENSE.txt} | 0 assets/js/1a4e3797.d6bdb385.js | 2 -- assets/js/{22e91f41.c7724825.js => 22e91f41.0428db43.js} | 2 +- assets/js/{2b77e7d3.c520d366.js => 2b77e7d3.0579b1f4.js} | 2 +- assets/js/2ccf3cc5.6d3599d6.js | 1 - assets/js/2ccf3cc5.74e32571.js | 1 + assets/js/{37e9fbd6.8ee333c6.js => 37e9fbd6.30dd7be5.js} | 2 +- assets/js/{3e1f1522.b0b4183d.js => 3e1f1522.2cbde125.js} | 2 +- assets/js/{42b3b6e0.6f738bd5.js => 42b3b6e0.1f3d109a.js} | 2 +- assets/js/{47adee10.b1191a4d.js => 47adee10.7ab784fa.js} | 2 +- assets/js/{514a65da.5f8fb65e.js => 514a65da.edaa5b78.js} | 2 +- assets/js/{5af830f1.4abe04d8.js => 5af830f1.f05de863.js} | 2 +- assets/js/{5b892390.4b0e9fbd.js => 5b892390.ab39a94a.js} | 2 +- assets/js/{5bb4bac1.dc15264e.js => 5bb4bac1.4eb34ae2.js} | 2 +- assets/js/{64bee9bd.7d2cf865.js => 64bee9bd.72042f37.js} | 2 +- assets/js/{66902dc0.6085e384.js => 66902dc0.ee163aab.js} | 2 +- assets/js/{73ad1aec.9b45772d.js => 73ad1aec.067759a6.js} | 2 +- assets/js/{77c0519e.55636fe1.js => 77c0519e.ec0e1031.js} | 2 +- assets/js/{7b9fe0bb.b0c832fb.js => 7b9fe0bb.95623596.js} | 2 +- assets/js/{80fe3eff.4f203b28.js => 80fe3eff.a87efc36.js} | 2 +- assets/js/{889f3b97.6dde2377.js => 889f3b97.79235f56.js} | 2 +- assets/js/{90e69b51.ee377b66.js => 90e69b51.f05b291f.js} | 2 +- assets/js/{9471ce52.0eda1fa3.js => 9471ce52.b25d0a66.js} | 2 +- assets/js/{94b34882.37fa2992.js => 94b34882.f006147c.js} | 2 +- assets/js/{962e3ea7.5016389b.js => 962e3ea7.397f56c8.js} | 2 +- assets/js/{964ce0ca.2dd6d71d.js => 964ce0ca.69f4f9be.js} | 2 +- assets/js/{96f6c727.49536363.js => 96f6c727.2e093355.js} | 2 +- assets/js/{9bc1354f.7c091ec2.js => 9bc1354f.75f3d4b0.js} | 2 +- assets/js/{a9154f55.7abbeed0.js => a9154f55.acca73cd.js} | 2 +- assets/js/{b9be9bb6.26fbc574.js => b9be9bb6.2ffdf1df.js} | 2 +- assets/js/{bc9a0017.4a4c0fff.js => bc9a0017.ef7309c7.js} | 2 +- assets/js/{bf6ec8e5.a547715d.js => bf6ec8e5.1929a2ae.js} | 2 +- assets/js/{c022fa4c.d2ddb871.js => c022fa4c.d579777d.js} | 2 +- assets/js/{d84133a6.7e061a46.js => d84133a6.4cb4a6fe.js} | 2 +- assets/js/{d94758ba.2e77b8af.js => d94758ba.344d58d1.js} | 2 +- assets/js/{e6fe25da.2bb61cea.js => e6fe25da.ad5b6119.js} | 2 +- assets/js/{f4e7e388.627c0fc3.js => f4e7e388.222f2f72.js} | 2 +- assets/js/{f582a9aa.1ff0c6e1.js => f582a9aa.31317538.js} | 2 +- assets/js/{fdb23cd9.d639e92a.js => fdb23cd9.d5657c7b.js} | 2 +- assets/js/{main.40576d62.js => main.40aab0cd.js} | 4 ++-- ...576d62.js.LICENSE.txt => main.40aab0cd.js.LICENSE.txt} | 0 assets/js/runtime~main.26269c47.js | 1 - assets/js/runtime~main.cf2224b9.js | 1 + build/client-sdks/client-ts-sdk/index.html | 6 +++--- build/protocol-sdks/protocol-rs-sdk/index.html | 6 +++--- build/protocol-sdks/protocol-sdk/index.html | 6 +++--- build/publish-app/index.html | 6 +++--- build/quickstart/index.html | 6 +++--- contribute/bounty-program/index.html | 6 +++--- contribute/github/index.html | 6 +++--- contribute/hackathons/index.html | 6 +++--- explore/awesome-projects/only-peers/index.html | 6 +++--- explore/awesome-projects/rock-paper-scissors/index.html | 6 +++--- explore/developers-quickstart/admin-dashboard/index.html | 6 +++--- explore/developers-quickstart/example-app/index.html | 6 +++--- explore/developers-quickstart/getting-started/index.html | 8 +++++--- explore/intro/index.html | 6 +++--- explore/use-cases/decentralized-edge-compute/index.html | 6 +++--- explore/use-cases/decentralized-gig-economy/index.html | 6 +++--- .../decentralized-identity-verification/index.html | 6 +++--- .../index.html | 6 +++--- .../use-cases/decentralized-social-platforms/index.html | 6 +++--- explore/use-cases/decentralized-voting-systems/index.html | 6 +++--- explore/use-cases/deprod/index.html | 6 +++--- explore/use-cases/private-daos-management/index.html | 6 +++--- explore/use-cases/trustless-gaming/index.html | 6 +++--- explore/why-not/blockchain/index.html | 6 +++--- explore/why-not/ipfs/index.html | 6 +++--- explore/why-not/zk/index.html | 6 +++--- index.html | 4 ++-- learn/advanced-concepts/encryption/index.html | 6 +++--- learn/advanced-concepts/specialized-nodes/index.html | 6 +++--- learn/architecture/index.html | 6 +++--- learn/core-concepts/applications/index.html | 6 +++--- learn/core-concepts/contexts/index.html | 6 +++--- learn/core-concepts/identity/index.html | 6 +++--- learn/core-concepts/node/admin-client-api/index.html | 6 +++--- learn/core-concepts/node/client-node/index.html | 6 +++--- learn/core-concepts/node/network/index.html | 6 +++--- learn/core-concepts/node/runtime/index.html | 6 +++--- learn/core-concepts/node/server/index.html | 6 +++--- learn/core-concepts/node/storage/index.html | 6 +++--- learn/terminology/index.html | 6 +++--- resources/community-and-support/index.html | 6 +++--- resources/learning/index.html | 6 +++--- search/index.html | 4 ++-- 93 files changed, 177 insertions(+), 175 deletions(-) rename assets/js/{08c23959.fc47f7f4.js => 08c23959.6bd7c2a8.js} (99%) rename assets/js/{0b38cd53.f1992d53.js => 0b38cd53.6da65df6.js} (98%) rename assets/js/{13477880.8cbafae9.js => 13477880.43635d74.js} (97%) rename assets/js/{150624dd.8662a7f4.js => 150624dd.f65b10fc.js} (98%) rename assets/js/{190ec3a6.566087c8.js => 190ec3a6.84db3e62.js} (99%) create mode 100644 assets/js/1a4e3797.a25287f0.js rename assets/js/{1a4e3797.d6bdb385.js.LICENSE.txt => 1a4e3797.a25287f0.js.LICENSE.txt} (100%) delete mode 100644 assets/js/1a4e3797.d6bdb385.js rename assets/js/{22e91f41.c7724825.js => 22e91f41.0428db43.js} (97%) rename assets/js/{2b77e7d3.c520d366.js => 2b77e7d3.0579b1f4.js} (99%) delete mode 100644 assets/js/2ccf3cc5.6d3599d6.js create mode 100644 assets/js/2ccf3cc5.74e32571.js rename assets/js/{37e9fbd6.8ee333c6.js => 37e9fbd6.30dd7be5.js} (97%) rename assets/js/{3e1f1522.b0b4183d.js => 3e1f1522.2cbde125.js} (98%) rename assets/js/{42b3b6e0.6f738bd5.js => 42b3b6e0.1f3d109a.js} (98%) rename assets/js/{47adee10.b1191a4d.js => 47adee10.7ab784fa.js} (98%) rename assets/js/{514a65da.5f8fb65e.js => 514a65da.edaa5b78.js} (97%) rename assets/js/{5af830f1.4abe04d8.js => 5af830f1.f05de863.js} (96%) rename assets/js/{5b892390.4b0e9fbd.js => 5b892390.ab39a94a.js} (98%) rename assets/js/{5bb4bac1.dc15264e.js => 5bb4bac1.4eb34ae2.js} (98%) rename assets/js/{64bee9bd.7d2cf865.js => 64bee9bd.72042f37.js} (98%) rename assets/js/{66902dc0.6085e384.js => 66902dc0.ee163aab.js} (98%) rename assets/js/{73ad1aec.9b45772d.js => 73ad1aec.067759a6.js} (99%) rename assets/js/{77c0519e.55636fe1.js => 77c0519e.ec0e1031.js} (98%) rename assets/js/{7b9fe0bb.b0c832fb.js => 7b9fe0bb.95623596.js} (96%) rename assets/js/{80fe3eff.4f203b28.js => 80fe3eff.a87efc36.js} (98%) rename assets/js/{889f3b97.6dde2377.js => 889f3b97.79235f56.js} (94%) rename assets/js/{90e69b51.ee377b66.js => 90e69b51.f05b291f.js} (98%) rename assets/js/{9471ce52.0eda1fa3.js => 9471ce52.b25d0a66.js} (99%) rename assets/js/{94b34882.37fa2992.js => 94b34882.f006147c.js} (96%) rename assets/js/{962e3ea7.5016389b.js => 962e3ea7.397f56c8.js} (99%) rename assets/js/{964ce0ca.2dd6d71d.js => 964ce0ca.69f4f9be.js} (98%) rename assets/js/{96f6c727.49536363.js => 96f6c727.2e093355.js} (97%) rename assets/js/{9bc1354f.7c091ec2.js => 9bc1354f.75f3d4b0.js} (98%) rename assets/js/{a9154f55.7abbeed0.js => a9154f55.acca73cd.js} (97%) rename assets/js/{b9be9bb6.26fbc574.js => b9be9bb6.2ffdf1df.js} (97%) rename assets/js/{bc9a0017.4a4c0fff.js => bc9a0017.ef7309c7.js} (97%) rename assets/js/{bf6ec8e5.a547715d.js => bf6ec8e5.1929a2ae.js} (98%) rename assets/js/{c022fa4c.d2ddb871.js => c022fa4c.d579777d.js} (98%) rename assets/js/{d84133a6.7e061a46.js => d84133a6.4cb4a6fe.js} (99%) rename assets/js/{d94758ba.2e77b8af.js => d94758ba.344d58d1.js} (97%) rename assets/js/{e6fe25da.2bb61cea.js => e6fe25da.ad5b6119.js} (98%) rename assets/js/{f4e7e388.627c0fc3.js => f4e7e388.222f2f72.js} (98%) rename assets/js/{f582a9aa.1ff0c6e1.js => f582a9aa.31317538.js} (97%) rename assets/js/{fdb23cd9.d639e92a.js => fdb23cd9.d5657c7b.js} (96%) rename assets/js/{main.40576d62.js => main.40aab0cd.js} (94%) rename assets/js/{main.40576d62.js.LICENSE.txt => main.40aab0cd.js.LICENSE.txt} (100%) delete mode 100644 assets/js/runtime~main.26269c47.js create mode 100644 assets/js/runtime~main.cf2224b9.js diff --git a/404.html b/404.html index c7a826c8..6c562bd1 100644 --- a/404.html +++ b/404.html @@ -6,8 +6,8 @@ Calimero 2.0 - - + +
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

diff --git a/assets/js/08c23959.fc47f7f4.js b/assets/js/08c23959.6bd7c2a8.js similarity index 99% rename from assets/js/08c23959.fc47f7f4.js rename to assets/js/08c23959.6bd7c2a8.js index b567df1a..bbe5101b 100644 --- a/assets/js/08c23959.fc47f7f4.js +++ b/assets/js/08c23959.6bd7c2a8.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[822],{5431:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>a,contentTitle:()=>s,default:()=>p,frontMatter:()=>r,metadata:()=>l,toc:()=>c});var n=t(6070),i=t(5710);const r={id:"protocol-sdk",title:"Protocol SDK"},s=void 0,l={id:"build/protocol-sdks/protocol-sdk",title:"Protocol SDK",description:"The Protocol SDK within the Calimero Network serves as a foundational tool for developers, enabling them to design, develop, and deploy the specific protocols that govern the operation of their decentralized applications (DApps). This SDK is particularly crucial in a network like Calimero, where privacy, security, and decentralized communication are paramount. Here's an overview of the Protocol SDK, highlighting its features, functionalities, and its role in the development lifecycle of DApps:",source:"@site/docs/03-build/01-protocol-sdks/01-protocol-sdk.mdx",sourceDirName:"03-build/01-protocol-sdks",slug:"/build/protocol-sdks/protocol-sdk",permalink:"/build/protocol-sdks/protocol-sdk",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718634626e3,sidebarPosition:1,frontMatter:{id:"protocol-sdk",title:"Protocol SDK"},sidebar:"tutorialSidebar",previous:{title:"Quickstart",permalink:"/build/quickstart"},next:{title:"Rust Protocol SDK",permalink:"/build/protocol-sdks/protocol-rs-sdk"}},a={},c=[{value:"Features and Functionalities",id:"features-and-functionalities",level:3},{value:"Role in DApp Development",id:"role-in-dapp-development",level:3},{value:"Integration with Other Calimero Components",id:"integration-with-other-calimero-components",level:3},{value:"Use Cases",id:"use-cases",level:3}];function d(e){const o={h3:"h3",li:"li",p:"p",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.p,{children:"The Protocol SDK within the Calimero Network serves as a foundational tool for developers, enabling them to design, develop, and deploy the specific protocols that govern the operation of their decentralized applications (DApps). This SDK is particularly crucial in a network like Calimero, where privacy, security, and decentralized communication are paramount. Here's an overview of the Protocol SDK, highlighting its features, functionalities, and its role in the development lifecycle of DApps:"}),"\n",(0,n.jsx)(o.h3,{id:"features-and-functionalities",children:"Features and Functionalities"}),"\n",(0,n.jsxs)(o.ul,{children:["\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.strong,{children:"Protocol Definition"}),": Allows developers to define the rules and behaviors of their application networks, including communication protocols, data formats, and interaction patterns among nodes."]}),"\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.strong,{children:"Code Generation"}),": Automates the generation of boilerplate code required to implement the defined protocols, significantly speeding up the development process and reducing the potential for errors."]}),"\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.strong,{children:"Interoperability Support"}),": Facilitates the creation of protocols that can interact with various blockchains and external systems, ensuring that Calimero-based DApps can operate within the broader blockchain ecosystem."]}),"\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.strong,{children:"Security Focus"}),": Provides tools and libraries to incorporate advanced security features into protocols, such as end-to-end encryption, secure key management, and privacy-preserving data sharing mechanisms."]}),"\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.strong,{children:"Performance Optimization"}),": Includes optimization tools and best practices to ensure that the protocols are efficient in terms of resource usage, suitable for decentralized networks where performance can be a critical concern."]}),"\n"]}),"\n",(0,n.jsx)(o.h3,{id:"role-in-dapp-development",children:"Role in DApp Development"}),"\n",(0,n.jsxs)(o.ul,{children:["\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.strong,{children:"Protocol Development"}),": At the core of any DApp on the Calimero Network is a protocol that dictates how the application functions, how nodes within the application's network communicate, and how data is handled and stored. The Protocol SDK is the primary tool for developing these protocols."]}),"\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.strong,{children:"Testing and Deployment"}),": The SDK provides an environment for thorough testing of the protocols in simulated conditions before they are deployed on the live network. This ensures that any issues can be identified and resolved in a controlled setting, minimizing risks."]}),"\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.strong,{children:"Versioning and Updates"}),": Supports protocol versioning, enabling developers to iterate on their protocols and roll out updates in a structured manner. This is crucial for maintaining compatibility and ensuring the longevity and scalability of DApps."]}),"\n"]}),"\n",(0,n.jsx)(o.h3,{id:"integration-with-other-calimero-components",children:"Integration with Other Calimero Components"}),"\n",(0,n.jsxs)(o.ul,{children:["\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.strong,{children:"Client Nodes"}),": Protocols developed with the Protocol SDK are deployed on client nodes, which act as the runtime environment for the DApps built on these protocols."]}),"\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.strong,{children:"Client SDKs"}),": These SDKs interact with the protocols at a higher level, providing interfaces for end-users to interact with the DApps. The seamless integration between the Protocol SDK and Client SDKs ensures a smooth user experience."]}),"\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.strong,{children:"Specialized Nodes"}),": Some protocols may require specialized computational resources or functionalities. The Protocol SDK allows for the integration of these services, enabling DApps to leverage the specialized nodes within the Calimero Network."]}),"\n"]}),"\n",(0,n.jsx)(o.h3,{id:"use-cases",children:"Use Cases"}),"\n",(0,n.jsxs)(o.ul,{children:["\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.strong,{children:"Decentralized Messaging"}),": For a messaging app, the Protocol SDK could be used to define the encryption protocols, message delivery mechanisms, and peer discovery protocols."]}),"\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.strong,{children:"Decentralized Finance (DeFi)"}),": In a DeFi application, the SDK could define the protocols for executing smart contracts, handling transactions, and interacting with external blockchains for asset transfers."]}),"\n"]}),"\n",(0,n.jsx)(o.p,{children:"The Protocol SDK is a critical component of the Calimero Network, empowering developers to build sophisticated, secure, and efficient decentralized applications. By abstracting much of the complexity associated with protocol development, the SDK enables developers to focus on the unique features and functionalities of their DApps, fostering innovation and growth within the Calimero ecosystem."})]})}function p(e={}){const{wrapper:o}={...(0,i.R)(),...e.components};return o?(0,n.jsx)(o,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},5710:(e,o,t)=>{t.d(o,{R:()=>s,x:()=>l});var n=t(758);const i={},r=n.createContext(i);function s(e){const o=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function l(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),n.createElement(r.Provider,{value:o},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[822],{5431:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>a,contentTitle:()=>s,default:()=>p,frontMatter:()=>r,metadata:()=>l,toc:()=>c});var n=t(6070),i=t(5710);const r={id:"protocol-sdk",title:"Protocol SDK"},s=void 0,l={id:"build/protocol-sdks/protocol-sdk",title:"Protocol SDK",description:"The Protocol SDK within the Calimero Network serves as a foundational tool for developers, enabling them to design, develop, and deploy the specific protocols that govern the operation of their decentralized applications (DApps). This SDK is particularly crucial in a network like Calimero, where privacy, security, and decentralized communication are paramount. Here's an overview of the Protocol SDK, highlighting its features, functionalities, and its role in the development lifecycle of DApps:",source:"@site/docs/03-build/01-protocol-sdks/01-protocol-sdk.mdx",sourceDirName:"03-build/01-protocol-sdks",slug:"/build/protocol-sdks/protocol-sdk",permalink:"/build/protocol-sdks/protocol-sdk",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718723446e3,sidebarPosition:1,frontMatter:{id:"protocol-sdk",title:"Protocol SDK"},sidebar:"tutorialSidebar",previous:{title:"Quickstart",permalink:"/build/quickstart"},next:{title:"Rust Protocol SDK",permalink:"/build/protocol-sdks/protocol-rs-sdk"}},a={},c=[{value:"Features and Functionalities",id:"features-and-functionalities",level:3},{value:"Role in DApp Development",id:"role-in-dapp-development",level:3},{value:"Integration with Other Calimero Components",id:"integration-with-other-calimero-components",level:3},{value:"Use Cases",id:"use-cases",level:3}];function d(e){const o={h3:"h3",li:"li",p:"p",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.p,{children:"The Protocol SDK within the Calimero Network serves as a foundational tool for developers, enabling them to design, develop, and deploy the specific protocols that govern the operation of their decentralized applications (DApps). This SDK is particularly crucial in a network like Calimero, where privacy, security, and decentralized communication are paramount. Here's an overview of the Protocol SDK, highlighting its features, functionalities, and its role in the development lifecycle of DApps:"}),"\n",(0,n.jsx)(o.h3,{id:"features-and-functionalities",children:"Features and Functionalities"}),"\n",(0,n.jsxs)(o.ul,{children:["\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.strong,{children:"Protocol Definition"}),": Allows developers to define the rules and behaviors of their application networks, including communication protocols, data formats, and interaction patterns among nodes."]}),"\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.strong,{children:"Code Generation"}),": Automates the generation of boilerplate code required to implement the defined protocols, significantly speeding up the development process and reducing the potential for errors."]}),"\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.strong,{children:"Interoperability Support"}),": Facilitates the creation of protocols that can interact with various blockchains and external systems, ensuring that Calimero-based DApps can operate within the broader blockchain ecosystem."]}),"\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.strong,{children:"Security Focus"}),": Provides tools and libraries to incorporate advanced security features into protocols, such as end-to-end encryption, secure key management, and privacy-preserving data sharing mechanisms."]}),"\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.strong,{children:"Performance Optimization"}),": Includes optimization tools and best practices to ensure that the protocols are efficient in terms of resource usage, suitable for decentralized networks where performance can be a critical concern."]}),"\n"]}),"\n",(0,n.jsx)(o.h3,{id:"role-in-dapp-development",children:"Role in DApp Development"}),"\n",(0,n.jsxs)(o.ul,{children:["\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.strong,{children:"Protocol Development"}),": At the core of any DApp on the Calimero Network is a protocol that dictates how the application functions, how nodes within the application's network communicate, and how data is handled and stored. The Protocol SDK is the primary tool for developing these protocols."]}),"\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.strong,{children:"Testing and Deployment"}),": The SDK provides an environment for thorough testing of the protocols in simulated conditions before they are deployed on the live network. This ensures that any issues can be identified and resolved in a controlled setting, minimizing risks."]}),"\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.strong,{children:"Versioning and Updates"}),": Supports protocol versioning, enabling developers to iterate on their protocols and roll out updates in a structured manner. This is crucial for maintaining compatibility and ensuring the longevity and scalability of DApps."]}),"\n"]}),"\n",(0,n.jsx)(o.h3,{id:"integration-with-other-calimero-components",children:"Integration with Other Calimero Components"}),"\n",(0,n.jsxs)(o.ul,{children:["\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.strong,{children:"Client Nodes"}),": Protocols developed with the Protocol SDK are deployed on client nodes, which act as the runtime environment for the DApps built on these protocols."]}),"\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.strong,{children:"Client SDKs"}),": These SDKs interact with the protocols at a higher level, providing interfaces for end-users to interact with the DApps. The seamless integration between the Protocol SDK and Client SDKs ensures a smooth user experience."]}),"\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.strong,{children:"Specialized Nodes"}),": Some protocols may require specialized computational resources or functionalities. The Protocol SDK allows for the integration of these services, enabling DApps to leverage the specialized nodes within the Calimero Network."]}),"\n"]}),"\n",(0,n.jsx)(o.h3,{id:"use-cases",children:"Use Cases"}),"\n",(0,n.jsxs)(o.ul,{children:["\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.strong,{children:"Decentralized Messaging"}),": For a messaging app, the Protocol SDK could be used to define the encryption protocols, message delivery mechanisms, and peer discovery protocols."]}),"\n",(0,n.jsxs)(o.li,{children:[(0,n.jsx)(o.strong,{children:"Decentralized Finance (DeFi)"}),": In a DeFi application, the SDK could define the protocols for executing smart contracts, handling transactions, and interacting with external blockchains for asset transfers."]}),"\n"]}),"\n",(0,n.jsx)(o.p,{children:"The Protocol SDK is a critical component of the Calimero Network, empowering developers to build sophisticated, secure, and efficient decentralized applications. By abstracting much of the complexity associated with protocol development, the SDK enables developers to focus on the unique features and functionalities of their DApps, fostering innovation and growth within the Calimero ecosystem."})]})}function p(e={}){const{wrapper:o}={...(0,i.R)(),...e.components};return o?(0,n.jsx)(o,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},5710:(e,o,t)=>{t.d(o,{R:()=>s,x:()=>l});var n=t(758);const i={},r=n.createContext(i);function s(e){const o=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function l(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),n.createElement(r.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0b38cd53.f1992d53.js b/assets/js/0b38cd53.6da65df6.js similarity index 98% rename from assets/js/0b38cd53.f1992d53.js rename to assets/js/0b38cd53.6da65df6.js index 5c02c341..17cd1799 100644 --- a/assets/js/0b38cd53.f1992d53.js +++ b/assets/js/0b38cd53.6da65df6.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[6673],{8171:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>a,metadata:()=>r,toc:()=>l});var i=t(6070),s=t(5710);const a={id:"specialized-nodes",title:"Specialized Nodes"},o=void 0,r={id:"learn/advanced-concepts/specialized-nodes",title:"Specialized Nodes",description:"Specialized nodes in the Calimero Network are third-party nodes that augment a context's capacity and reliability. They participate in a context but have additional capabilities, providing various services while maintaining the decentralized nature of the network.",source:"@site/docs/02-learn/04-advanced-concepts/01-specialized-nodes.mdx",sourceDirName:"02-learn/04-advanced-concepts",slug:"/learn/advanced-concepts/specialized-nodes",permalink:"/learn/advanced-concepts/specialized-nodes",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718634626e3,sidebarPosition:1,frontMatter:{id:"specialized-nodes",title:"Specialized Nodes"},sidebar:"tutorialSidebar",previous:{title:"Contexts",permalink:"/learn/core-concepts/contexts"},next:{title:"Encryption",permalink:"/learn/advanced-concepts/encryption"}},c={},l=[{value:"Key Concepts",id:"key-concepts",level:3},{value:"Types of Specialized Nodes",id:"types-of-specialized-nodes",level:3},{value:"Reliability Through Decentralization",id:"reliability-through-decentralization",level:3}];function d(e){const n={h3:"h3",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.p,{children:"Specialized nodes in the Calimero Network are third-party nodes that augment a context's capacity and reliability. They participate in a context but have additional capabilities, providing various services while maintaining the decentralized nature of the network."}),"\n",(0,i.jsx)(n.h3,{id:"key-concepts",children:"Key Concepts"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Incentivization"}),": These nodes can be incentivized through contracts on blockchains that pay them for their services, ensuring they remain motivated to perform their roles effectively."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Permissions and Roles"}),": Specialized nodes can have different levels of permissions, ranging from being subscribed to encrypted network events to fully participating as part of the context."]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"types-of-specialized-nodes",children:"Types of Specialized Nodes"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Storage Nodes"}),":"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Encrypted Transaction Storage"}),": These nodes store encrypted transactions without the ability to read them. They guarantee 100% uptime, ensuring that all transactions are available even when peers are offline. When peers come back online, the node provides missed transactions and new transactions for replication."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Blob Storage"}),": These nodes also store encrypted blobs of non-state-transitional data, ensuring that all necessary data is always available without holding decryption keys."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Delegated Execution Nodes"}),":"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Context Maintenance"}),": These nodes fully join a context and maintain the context state on their end. They can handle resource-intensive executions, delegating specific calls to optimize performance and resource utilization."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Administrative Nodes"}),":"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Event Observation and Action"}),": These nodes observe real-world events and act on them within the context. For example, in a billionaire's club context, an administrative node could monitor members' accounts on a blockchain and evict them if their balance falls below a certain threshold."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"reliability-through-decentralization",children:"Reliability Through Decentralization"}),"\n",(0,i.jsx)(n.p,{children:"Specialized nodes ensure that the context remains operational and consistent, even when primary peers are offline. They provide the necessary data and transactions to keep the context up-to-date. The decentralized nature ensures that the state is eventually consistent. Fragmentation does not cause issues as the system reconciles itself when peers come back online, highlighting the network's reliability without reliance on any single specialized node."})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},5710:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>r});var i=t(758);const s={},a=i.createContext(s);function o(e){const n=i.useContext(a);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),i.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[6673],{8171:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>a,metadata:()=>r,toc:()=>l});var i=t(6070),s=t(5710);const a={id:"specialized-nodes",title:"Specialized Nodes"},o=void 0,r={id:"learn/advanced-concepts/specialized-nodes",title:"Specialized Nodes",description:"Specialized nodes in the Calimero Network are third-party nodes that augment a context's capacity and reliability. They participate in a context but have additional capabilities, providing various services while maintaining the decentralized nature of the network.",source:"@site/docs/02-learn/04-advanced-concepts/01-specialized-nodes.mdx",sourceDirName:"02-learn/04-advanced-concepts",slug:"/learn/advanced-concepts/specialized-nodes",permalink:"/learn/advanced-concepts/specialized-nodes",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718723446e3,sidebarPosition:1,frontMatter:{id:"specialized-nodes",title:"Specialized Nodes"},sidebar:"tutorialSidebar",previous:{title:"Contexts",permalink:"/learn/core-concepts/contexts"},next:{title:"Encryption",permalink:"/learn/advanced-concepts/encryption"}},c={},l=[{value:"Key Concepts",id:"key-concepts",level:3},{value:"Types of Specialized Nodes",id:"types-of-specialized-nodes",level:3},{value:"Reliability Through Decentralization",id:"reliability-through-decentralization",level:3}];function d(e){const n={h3:"h3",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.p,{children:"Specialized nodes in the Calimero Network are third-party nodes that augment a context's capacity and reliability. They participate in a context but have additional capabilities, providing various services while maintaining the decentralized nature of the network."}),"\n",(0,i.jsx)(n.h3,{id:"key-concepts",children:"Key Concepts"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Incentivization"}),": These nodes can be incentivized through contracts on blockchains that pay them for their services, ensuring they remain motivated to perform their roles effectively."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Permissions and Roles"}),": Specialized nodes can have different levels of permissions, ranging from being subscribed to encrypted network events to fully participating as part of the context."]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"types-of-specialized-nodes",children:"Types of Specialized Nodes"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Storage Nodes"}),":"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Encrypted Transaction Storage"}),": These nodes store encrypted transactions without the ability to read them. They guarantee 100% uptime, ensuring that all transactions are available even when peers are offline. When peers come back online, the node provides missed transactions and new transactions for replication."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Blob Storage"}),": These nodes also store encrypted blobs of non-state-transitional data, ensuring that all necessary data is always available without holding decryption keys."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Delegated Execution Nodes"}),":"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Context Maintenance"}),": These nodes fully join a context and maintain the context state on their end. They can handle resource-intensive executions, delegating specific calls to optimize performance and resource utilization."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Administrative Nodes"}),":"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Event Observation and Action"}),": These nodes observe real-world events and act on them within the context. For example, in a billionaire's club context, an administrative node could monitor members' accounts on a blockchain and evict them if their balance falls below a certain threshold."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"reliability-through-decentralization",children:"Reliability Through Decentralization"}),"\n",(0,i.jsx)(n.p,{children:"Specialized nodes ensure that the context remains operational and consistent, even when primary peers are offline. They provide the necessary data and transactions to keep the context up-to-date. The decentralized nature ensures that the state is eventually consistent. Fragmentation does not cause issues as the system reconciles itself when peers come back online, highlighting the network's reliability without reliance on any single specialized node."})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},5710:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>r});var i=t(758);const s={},a=i.createContext(s);function o(e){const n=i.useContext(a);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),i.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/13477880.8cbafae9.js b/assets/js/13477880.43635d74.js similarity index 97% rename from assets/js/13477880.8cbafae9.js rename to assets/js/13477880.43635d74.js index bd219adb..5a7256c6 100644 --- a/assets/js/13477880.8cbafae9.js +++ b/assets/js/13477880.43635d74.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[105],{3130:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>c,contentTitle:()=>i,default:()=>u,frontMatter:()=>s,metadata:()=>a,toc:()=>l});var r=t(6070),n=t(5710);const s={id:"only-peers",title:"Only Peers"},i=void 0,a={id:"explore/awesome-projects/only-peers",title:"Only Peers",description:"Only Peers is a decentralized social networking app that empowers you to share your thoughts and engage with your community without compromising your privacy. It allows you to write posts, leave comments, and interact with friends. However, unlike traditional social networks, Only Peers ensures your data remains under your control, protected from central authorities and prying eyes. Experience the freedom of a decentralized platform where your voice cannot be censored and your privacy is prioritized. Explore the source code on GitHub repository.",source:"@site/docs/01-explore/06-awesome-projects/01-only-peers.mdx",sourceDirName:"01-explore/06-awesome-projects",slug:"/explore/awesome-projects/only-peers",permalink:"/explore/awesome-projects/only-peers",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718634626e3,sidebarPosition:1,frontMatter:{id:"only-peers",title:"Only Peers"},sidebar:"tutorialSidebar",previous:{title:"Decentralized Intellectual Property Management",permalink:"/explore/use-cases/decentralized-intellectual-property-management"},next:{title:"Rock Paper Scissors",permalink:"/explore/awesome-projects/rock-paper-scissors"}},c={},l=[];function p(e){const o={a:"a",p:"p",...(0,n.R)(),...e.components};return(0,r.jsxs)(o.p,{children:["Only Peers is a decentralized social networking app that empowers you to share your thoughts and engage with your community without compromising your privacy. It allows you to write posts, leave comments, and interact with friends. However, unlike traditional social networks, Only Peers ensures your data remains under your control, protected from central authorities and prying eyes. Experience the freedom of a decentralized platform where your voice cannot be censored and your privacy is prioritized. Explore the source code on ",(0,r.jsx)(o.a,{href:"https://github.com/calimero-network/only-peers-client",children:"GitHub repository"}),"."]})}function u(e={}){const{wrapper:o}={...(0,n.R)(),...e.components};return o?(0,r.jsx)(o,{...e,children:(0,r.jsx)(p,{...e})}):p(e)}},5710:(e,o,t)=>{t.d(o,{R:()=>i,x:()=>a});var r=t(758);const n={},s=r.createContext(n);function i(e){const o=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),r.createElement(s.Provider,{value:o},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[105],{3130:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>c,contentTitle:()=>i,default:()=>u,frontMatter:()=>s,metadata:()=>a,toc:()=>l});var r=t(6070),n=t(5710);const s={id:"only-peers",title:"Only Peers"},i=void 0,a={id:"explore/awesome-projects/only-peers",title:"Only Peers",description:"Only Peers is a decentralized social networking app that empowers you to share your thoughts and engage with your community without compromising your privacy. It allows you to write posts, leave comments, and interact with friends. However, unlike traditional social networks, Only Peers ensures your data remains under your control, protected from central authorities and prying eyes. Experience the freedom of a decentralized platform where your voice cannot be censored and your privacy is prioritized. Explore the source code on GitHub repository.",source:"@site/docs/01-explore/06-awesome-projects/01-only-peers.mdx",sourceDirName:"01-explore/06-awesome-projects",slug:"/explore/awesome-projects/only-peers",permalink:"/explore/awesome-projects/only-peers",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718723446e3,sidebarPosition:1,frontMatter:{id:"only-peers",title:"Only Peers"},sidebar:"tutorialSidebar",previous:{title:"Decentralized Intellectual Property Management",permalink:"/explore/use-cases/decentralized-intellectual-property-management"},next:{title:"Rock Paper Scissors",permalink:"/explore/awesome-projects/rock-paper-scissors"}},c={},l=[];function p(e){const o={a:"a",p:"p",...(0,n.R)(),...e.components};return(0,r.jsxs)(o.p,{children:["Only Peers is a decentralized social networking app that empowers you to share your thoughts and engage with your community without compromising your privacy. It allows you to write posts, leave comments, and interact with friends. However, unlike traditional social networks, Only Peers ensures your data remains under your control, protected from central authorities and prying eyes. Experience the freedom of a decentralized platform where your voice cannot be censored and your privacy is prioritized. Explore the source code on ",(0,r.jsx)(o.a,{href:"https://github.com/calimero-network/only-peers-client",children:"GitHub repository"}),"."]})}function u(e={}){const{wrapper:o}={...(0,n.R)(),...e.components};return o?(0,r.jsx)(o,{...e,children:(0,r.jsx)(p,{...e})}):p(e)}},5710:(e,o,t)=>{t.d(o,{R:()=>i,x:()=>a});var r=t(758);const n={},s=r.createContext(n);function i(e){const o=r.useContext(s);return r.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),r.createElement(s.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/150624dd.8662a7f4.js b/assets/js/150624dd.f65b10fc.js similarity index 98% rename from assets/js/150624dd.8662a7f4.js rename to assets/js/150624dd.f65b10fc.js index d80f763d..cea5ed44 100644 --- a/assets/js/150624dd.8662a7f4.js +++ b/assets/js/150624dd.f65b10fc.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2329],{749:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>l});var n=i(6070),o=i(5710);const r={id:"terminology",title:"Terminology"},s=void 0,a={id:"learn/terminology",title:"Terminology",description:"As projects grow, it's important to have a shared vocabulary to help communicate effectively. This page provides a list of terms used in the documentation and throughout the codebase.",source:"@site/docs/02-learn/01-terminology.mdx",sourceDirName:"02-learn",slug:"/learn/terminology",permalink:"/learn/terminology",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718634626e3,sidebarPosition:1,frontMatter:{id:"terminology",title:"Terminology"},sidebar:"tutorialSidebar",previous:{title:"Rock Paper Scissors",permalink:"/explore/awesome-projects/rock-paper-scissors"},next:{title:"Architecture",permalink:"/learn/architecture"}},c={},l=[];function d(e){const t={li:"li",p:"p",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.p,{children:"As projects grow, it's important to have a shared vocabulary to help communicate effectively. This page provides a list of terms used in the documentation and throughout the codebase."}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.strong,{children:"Node"})," is any individual device or computer that participates in the network. To avoid confusion with network layer used in the protocol, instead of network we are using term ",(0,n.jsx)(t.strong,{children:"Context"}),"."]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.strong,{children:"Peer"})," is a specific instance of a node within a P2P network that interacts with other peers. Peer represents user."]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.strong,{children:"Peer Id"})," is a unique identifier assigned to each peer in the network. It is used to distinguish between different peers and ensure that messages are delivered to the correct recipient."]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.strong,{children:"Context"})," is the core of the Calimero ecosystem. It is an application specific network designed to enable direct communication between users, eliminating the need for intermediaries"]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.strong,{children:"Application"})," is a software program designed to perform specific tasks or solve particular problems. To ensure compatibility and functionality, it should be developed according to the protocol SDK instructions provided. Once developed, the application should be published in a format that others can use during runtime, specifically in WebAssembly (WASM) format. Developer can also build frontend for an application, deployed separately, allowing users to interact with an app directly. This user interface facilitates interaction with the underlying software, making the application accessible and user-friendly."]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.strong,{children:"Root key"})," is the public part of a wallet cryptographic key pair used to verify the signature of sensitive actions. This public key is used to ensure that any data or actions signed with the corresponding private key can be trusted. Essentially, the root key serves as a trust anchor, enabling users to validate the authenticity and integrity of operations or communications associated with the node. It does not grant direct control over the node but ensures that actions authenticated with the private part of the root key are legitimate."]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.strong,{children:"Client key"})," is a cryptographic key tailored for each user session, acting as a session key or token. Each client key must be signed with the root key to be valid which is done automatically during login. This ensures that only sessions authenticated by the trusted root key can interact with the node."]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.strong,{children:"Specialized node"})," is third-party node that augment a context's capacity and reliability. It participates in a context but have additional capabilities, providing various services while maintaining the decentralized nature of the network."]}),"\n"]})]})}function h(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},5710:(e,t,i)=>{i.d(t,{R:()=>s,x:()=>a});var n=i(758);const o={},r=n.createContext(o);function s(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2329],{749:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>l});var n=i(6070),o=i(5710);const r={id:"terminology",title:"Terminology"},s=void 0,a={id:"learn/terminology",title:"Terminology",description:"As projects grow, it's important to have a shared vocabulary to help communicate effectively. This page provides a list of terms used in the documentation and throughout the codebase.",source:"@site/docs/02-learn/01-terminology.mdx",sourceDirName:"02-learn",slug:"/learn/terminology",permalink:"/learn/terminology",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718723446e3,sidebarPosition:1,frontMatter:{id:"terminology",title:"Terminology"},sidebar:"tutorialSidebar",previous:{title:"Rock Paper Scissors",permalink:"/explore/awesome-projects/rock-paper-scissors"},next:{title:"Architecture",permalink:"/learn/architecture"}},c={},l=[];function d(e){const t={li:"li",p:"p",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.p,{children:"As projects grow, it's important to have a shared vocabulary to help communicate effectively. This page provides a list of terms used in the documentation and throughout the codebase."}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.strong,{children:"Node"})," is any individual device or computer that participates in the network. To avoid confusion with network layer used in the protocol, instead of network we are using term ",(0,n.jsx)(t.strong,{children:"Context"}),"."]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.strong,{children:"Peer"})," is a specific instance of a node within a P2P network that interacts with other peers. Peer represents user."]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.strong,{children:"Peer Id"})," is a unique identifier assigned to each peer in the network. It is used to distinguish between different peers and ensure that messages are delivered to the correct recipient."]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.strong,{children:"Context"})," is the core of the Calimero ecosystem. It is an application specific network designed to enable direct communication between users, eliminating the need for intermediaries"]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.strong,{children:"Application"})," is a software program designed to perform specific tasks or solve particular problems. To ensure compatibility and functionality, it should be developed according to the protocol SDK instructions provided. Once developed, the application should be published in a format that others can use during runtime, specifically in WebAssembly (WASM) format. Developer can also build frontend for an application, deployed separately, allowing users to interact with an app directly. This user interface facilitates interaction with the underlying software, making the application accessible and user-friendly."]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.strong,{children:"Root key"})," is the public part of a wallet cryptographic key pair used to verify the signature of sensitive actions. This public key is used to ensure that any data or actions signed with the corresponding private key can be trusted. Essentially, the root key serves as a trust anchor, enabling users to validate the authenticity and integrity of operations or communications associated with the node. It does not grant direct control over the node but ensures that actions authenticated with the private part of the root key are legitimate."]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.strong,{children:"Client key"})," is a cryptographic key tailored for each user session, acting as a session key or token. Each client key must be signed with the root key to be valid which is done automatically during login. This ensures that only sessions authenticated by the trusted root key can interact with the node."]}),"\n",(0,n.jsxs)(t.li,{children:[(0,n.jsx)(t.strong,{children:"Specialized node"})," is third-party node that augment a context's capacity and reliability. It participates in a context but have additional capabilities, providing various services while maintaining the decentralized nature of the network."]}),"\n"]})]})}function h(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},5710:(e,t,i)=>{i.d(t,{R:()=>s,x:()=>a});var n=i(758);const o={},r=n.createContext(o);function s(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/190ec3a6.566087c8.js b/assets/js/190ec3a6.84db3e62.js similarity index 99% rename from assets/js/190ec3a6.566087c8.js rename to assets/js/190ec3a6.84db3e62.js index c01c978b..c59e1534 100644 --- a/assets/js/190ec3a6.566087c8.js +++ b/assets/js/190ec3a6.84db3e62.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[7707],{8202:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>c});var s=i(6070),t=i(5710);const r={id:"admin-client-api",title:"Admin Client API"},l=void 0,a={id:"learn/core-concepts/node/admin-client-api",title:"Admin Client API",description:"About Admin Client API",source:"@site/docs/02-learn/03-core-concepts/02-node/admin-api.mdx",sourceDirName:"02-learn/03-core-concepts/02-node",slug:"/learn/core-concepts/node/admin-client-api",permalink:"/learn/core-concepts/node/admin-client-api",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718634626e3,frontMatter:{id:"admin-client-api",title:"Admin Client API"},sidebar:"tutorialSidebar",previous:{title:"Network",permalink:"/learn/core-concepts/node/network"},next:{title:"Applications",permalink:"/learn/core-concepts/applications"}},o={},c=[{value:"About Admin Client API",id:"about-admin-client-api",level:3},{value:"How to Use",id:"how-to-use",level:3},{value:"API Endpoints",id:"api-endpoints",level:3}];function d(e){const n={code:"code",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h3,{id:"about-admin-client-api",children:"About Admin Client API"}),"\n",(0,s.jsxs)(n.p,{children:["Our Admin Client API offers a comprehensive set of endpoints designed to facilitate the management and administration of the node states.\nWith intuitive routes and robust handlers, administrators can seamlessly navigate various node operations with ease and efficiency.\nThe Admin Client API, paired with the ",(0,s.jsx)(n.strong,{children:"Admin UI"})," \u2014 a web application, is your go-to tool for managing node states,\nsimplifying interactions with the server."]}),"\n",(0,s.jsx)(n.p,{children:"The Admin API empowers you to:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Revoke root keys"}),"\n",(0,s.jsx)(n.li,{children:"Request validation challenge"}),"\n",(0,s.jsx)(n.li,{children:"Install and list node applications"}),"\n",(0,s.jsx)(n.li,{children:"Fetch decentralized identifiers (DID)"}),"\n",(0,s.jsx)(n.li,{children:"Manage client keys"}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"In essence, the Admin API simplifies node management, while the Admin UI offers an intuitive interface for seamless control."}),"\n",(0,s.jsx)(n.h3,{id:"how-to-use",children:"How to Use"}),"\n",(0,s.jsxs)(n.p,{children:["To utilize the Admin API endpoints effectively, the recommended approach is to leverage the ",(0,s.jsx)(n.strong,{children:"Admin UI web application"}),". The Admin UI automates various steps involved in interacting with the Admin API, ensuring seamless integration and providing the best user experience."]}),"\n",(0,s.jsx)(n.p,{children:"By using the Admin UI, administrators can streamline their workflow, access essential functionalities with ease, and benefit from intuitive visualizations and controls. This approach not only simplifies the management of decentralized networks but also ensures that administrators have access to the best options and features available."}),"\n",(0,s.jsx)(n.h3,{id:"api-endpoints",children:"API Endpoints"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Root Key Request"})," - This endpoint allows administrators to add root keys for secure authentication and access control within the decentralized network environment.\nValidation Challenge Generation"]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Pre requirements"}),' - Before calling "Root Key Request" endpoint, it is essential to first call the "/request-challenge" endpoint. This step is necessary as the "Root Key Request" endpoint requires a challenge to be passed and verified during the process of adding the root key']}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"POST"})," ",(0,s.jsx)(n.code,{children:"/root-key"})]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Parameters"}),":"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"accountId"})," : The account identifier associated with the request."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"signature"})," : The signature generated by signing the challenge and message with the wallet."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"publicKey"})," : The public key used for verification."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"callbackUrl"})," : The URL to which the response callback should be sent."]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Note: The parameters for this POST request, including accountId, signature, and publicKey, are generated by signing the challenge and message with the wallet."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Example call with curl"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:'curl -X POST \\\n-H "Content-Type: application/json" \\\n-d \'{"accountId": "", "signature": "", "publicKey": "", "callbackUrl": ""}\' \\\nhttp:///admin-api/root-key\n'})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Example response"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:'> Success response\n { data: "Root key added" }\n> Error response\n { error: "Failed to add root key: " }\n'})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Request authentication challenge"})," - Administrators can utilize this endpoint to generate validation challenges, enabling users to authenticate their identity via wallet signatures for enhanced security measures."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"POST"})," ",(0,s.jsx)(n.code,{children:"/request-challenge"})]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Example call with curl"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"curl -X POST http:///admin-api/request-challenge\n"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Example response"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:'> Success response\n { data: { challenge: } }\n> Error response\n { error: "Failed to fetch challenge: " }\n'})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Install Application"})," - This endpoint facilitates the installation of new applications on the node, expanding the functionality and capabilities of the decentralized network ecosystem."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"POST"})," ",(0,s.jsx)(n.code,{children:"/install-application"})]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Parameters"}),":"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"application"})," : Application name - can be selected from the Admin UI"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"version"})," : Application release version - can be selected from the Admin UI"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Example call with curl"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:'curl -X POST \\\n-H "Content-Type: application/json" \\\n-d \'{"application": "", "version": ""}\' \\\nhttp:///admin-api/install-application\n'})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Example response"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:'> Success response\n { data: "Application Installed" }\n> Error response\n { error: "Failed to install application: " }\n'})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"List installed Application"})," - This endpoint returns a list of installed applications, providing valuable insights into the current state of the decentralized network ecosystem"]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"GET"})," ",(0,s.jsx)(n.code,{children:"/applications"})]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Example call with curl"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"curl -X GET http:///admin-api/applications\n"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Example response"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:'> Success response\n { data: {\n applications:\n [{\n application_name: ,\n version: \n }]\n }}\n> Error response\n { error: "Failed to fetch installed applications: " }\n'})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Add Client Key"})," - Administrators can add new client keys via this endpoint, enabling seamless access and authentication for authorized users within the network."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"POST"})," ",(0,s.jsx)(n.code,{children:"/add-client-key"})]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Parameters"}),":"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"wallet_signature"})," : Signature generated with the wallet"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"payload"})," : Reqest payload containing message and metadata"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"wallet_metadata"})," : Crypto wallet metadata containing information for wallet_type and signing_key"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Example call with curl"})}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:'curl -X POST \\\n-H "Content-Type: application/json" \\\n-d \'{"wallet_signature": "", "payload": { "message": , "metadata": }. "wallet_metadata": {"wallet_type": , "signing_key": }}\' \\\nhttp:///admin-api/add-client-key\n'})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Example response"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:'> Success response\n { data: "Client key stored" }\n> Error response\n { error: "Failed to add client key: " }\n'})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Get the DID"})," - Fetches the Decentralized Identifier (DID) associated with the node, providing a unique identifier for network entities and enabling interoperability across decentralized applications."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"GET"})," ",(0,s.jsx)(n.code,{children:"/did"})]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"curl -X GET http:///admin-api/did\n"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Example response"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:'> Success response\n { data:\n {\n id: ,\n root_keys:\n [{\n signing_key: \n }]\n }\n }\n> Error response\n { error: "Failed to fetch DID: " }\n'})}),"\n"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},5710:(e,n,i)=>{i.d(n,{R:()=>l,x:()=>a});var s=i(758);const t={},r=s.createContext(t);function l(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:l(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[7707],{8202:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>o,contentTitle:()=>l,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>c});var s=i(6070),t=i(5710);const r={id:"admin-client-api",title:"Admin Client API"},l=void 0,a={id:"learn/core-concepts/node/admin-client-api",title:"Admin Client API",description:"About Admin Client API",source:"@site/docs/02-learn/03-core-concepts/02-node/admin-api.mdx",sourceDirName:"02-learn/03-core-concepts/02-node",slug:"/learn/core-concepts/node/admin-client-api",permalink:"/learn/core-concepts/node/admin-client-api",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718723446e3,frontMatter:{id:"admin-client-api",title:"Admin Client API"},sidebar:"tutorialSidebar",previous:{title:"Network",permalink:"/learn/core-concepts/node/network"},next:{title:"Applications",permalink:"/learn/core-concepts/applications"}},o={},c=[{value:"About Admin Client API",id:"about-admin-client-api",level:3},{value:"How to Use",id:"how-to-use",level:3},{value:"API Endpoints",id:"api-endpoints",level:3}];function d(e){const n={code:"code",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h3,{id:"about-admin-client-api",children:"About Admin Client API"}),"\n",(0,s.jsxs)(n.p,{children:["Our Admin Client API offers a comprehensive set of endpoints designed to facilitate the management and administration of the node states.\nWith intuitive routes and robust handlers, administrators can seamlessly navigate various node operations with ease and efficiency.\nThe Admin Client API, paired with the ",(0,s.jsx)(n.strong,{children:"Admin UI"})," \u2014 a web application, is your go-to tool for managing node states,\nsimplifying interactions with the server."]}),"\n",(0,s.jsx)(n.p,{children:"The Admin API empowers you to:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Revoke root keys"}),"\n",(0,s.jsx)(n.li,{children:"Request validation challenge"}),"\n",(0,s.jsx)(n.li,{children:"Install and list node applications"}),"\n",(0,s.jsx)(n.li,{children:"Fetch decentralized identifiers (DID)"}),"\n",(0,s.jsx)(n.li,{children:"Manage client keys"}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"In essence, the Admin API simplifies node management, while the Admin UI offers an intuitive interface for seamless control."}),"\n",(0,s.jsx)(n.h3,{id:"how-to-use",children:"How to Use"}),"\n",(0,s.jsxs)(n.p,{children:["To utilize the Admin API endpoints effectively, the recommended approach is to leverage the ",(0,s.jsx)(n.strong,{children:"Admin UI web application"}),". The Admin UI automates various steps involved in interacting with the Admin API, ensuring seamless integration and providing the best user experience."]}),"\n",(0,s.jsx)(n.p,{children:"By using the Admin UI, administrators can streamline their workflow, access essential functionalities with ease, and benefit from intuitive visualizations and controls. This approach not only simplifies the management of decentralized networks but also ensures that administrators have access to the best options and features available."}),"\n",(0,s.jsx)(n.h3,{id:"api-endpoints",children:"API Endpoints"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Root Key Request"})," - This endpoint allows administrators to add root keys for secure authentication and access control within the decentralized network environment.\nValidation Challenge Generation"]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Pre requirements"}),' - Before calling "Root Key Request" endpoint, it is essential to first call the "/request-challenge" endpoint. This step is necessary as the "Root Key Request" endpoint requires a challenge to be passed and verified during the process of adding the root key']}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"POST"})," ",(0,s.jsx)(n.code,{children:"/root-key"})]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Parameters"}),":"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"accountId"})," : The account identifier associated with the request."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"signature"})," : The signature generated by signing the challenge and message with the wallet."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"publicKey"})," : The public key used for verification."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"callbackUrl"})," : The URL to which the response callback should be sent."]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Note: The parameters for this POST request, including accountId, signature, and publicKey, are generated by signing the challenge and message with the wallet."}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Example call with curl"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:'curl -X POST \\\n-H "Content-Type: application/json" \\\n-d \'{"accountId": "", "signature": "", "publicKey": "", "callbackUrl": ""}\' \\\nhttp:///admin-api/root-key\n'})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Example response"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:'> Success response\n { data: "Root key added" }\n> Error response\n { error: "Failed to add root key: " }\n'})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Request authentication challenge"})," - Administrators can utilize this endpoint to generate validation challenges, enabling users to authenticate their identity via wallet signatures for enhanced security measures."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"POST"})," ",(0,s.jsx)(n.code,{children:"/request-challenge"})]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Example call with curl"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"curl -X POST http:///admin-api/request-challenge\n"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Example response"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:'> Success response\n { data: { challenge: } }\n> Error response\n { error: "Failed to fetch challenge: " }\n'})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Install Application"})," - This endpoint facilitates the installation of new applications on the node, expanding the functionality and capabilities of the decentralized network ecosystem."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"POST"})," ",(0,s.jsx)(n.code,{children:"/install-application"})]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Parameters"}),":"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"application"})," : Application name - can be selected from the Admin UI"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"version"})," : Application release version - can be selected from the Admin UI"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Example call with curl"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:'curl -X POST \\\n-H "Content-Type: application/json" \\\n-d \'{"application": "", "version": ""}\' \\\nhttp:///admin-api/install-application\n'})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Example response"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:'> Success response\n { data: "Application Installed" }\n> Error response\n { error: "Failed to install application: " }\n'})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"List installed Application"})," - This endpoint returns a list of installed applications, providing valuable insights into the current state of the decentralized network ecosystem"]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"GET"})," ",(0,s.jsx)(n.code,{children:"/applications"})]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Example call with curl"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"curl -X GET http:///admin-api/applications\n"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Example response"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:'> Success response\n { data: {\n applications:\n [{\n application_name: ,\n version: \n }]\n }}\n> Error response\n { error: "Failed to fetch installed applications: " }\n'})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Add Client Key"})," - Administrators can add new client keys via this endpoint, enabling seamless access and authentication for authorized users within the network."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"POST"})," ",(0,s.jsx)(n.code,{children:"/add-client-key"})]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Parameters"}),":"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"wallet_signature"})," : Signature generated with the wallet"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"payload"})," : Reqest payload containing message and metadata"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"wallet_metadata"})," : Crypto wallet metadata containing information for wallet_type and signing_key"]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Example call with curl"})}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:'curl -X POST \\\n-H "Content-Type: application/json" \\\n-d \'{"wallet_signature": "", "payload": { "message": , "metadata": }. "wallet_metadata": {"wallet_type": , "signing_key": }}\' \\\nhttp:///admin-api/add-client-key\n'})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Example response"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:'> Success response\n { data: "Client key stored" }\n> Error response\n { error: "Failed to add client key: " }\n'})}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Get the DID"})," - Fetches the Decentralized Identifier (DID) associated with the node, providing a unique identifier for network entities and enabling interoperability across decentralized applications."]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"GET"})," ",(0,s.jsx)(n.code,{children:"/did"})]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"curl -X GET http:///admin-api/did\n"})}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.strong,{children:"Example response"})}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:'> Success response\n { data:\n {\n id: ,\n root_keys:\n [{\n signing_key: \n }]\n }\n }\n> Error response\n { error: "Failed to fetch DID: " }\n'})}),"\n"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},5710:(e,n,i)=>{i.d(n,{R:()=>l,x:()=>a});var s=i(758);const t={},r=s.createContext(t);function l(e){const n=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:l(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1a4e3797.a25287f0.js b/assets/js/1a4e3797.a25287f0.js new file mode 100644 index 00000000..91c559ad --- /dev/null +++ b/assets/js/1a4e3797.a25287f0.js @@ -0,0 +1,2 @@ +/*! For license information please see 1a4e3797.a25287f0.js.LICENSE.txt */ +(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2138],{8181:e=>{function t(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function r(e){return"function"==typeof e}function n(e){return"object"==typeof e&&null!==e}function i(e){return void 0===e}e.exports=t,t.prototype._events=void 0,t.prototype._maxListeners=void 0,t.defaultMaxListeners=10,t.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||isNaN(e))throw TypeError("n must be a positive number");return this._maxListeners=e,this},t.prototype.emit=function(e){var t,s,a,c,o,u;if(this._events||(this._events={}),"error"===e&&(!this._events.error||n(this._events.error)&&!this._events.error.length)){if((t=arguments[1])instanceof Error)throw t;var h=new Error('Uncaught, unspecified "error" event. ('+t+")");throw h.context=t,h}if(i(s=this._events[e]))return!1;if(r(s))switch(arguments.length){case 1:s.call(this);break;case 2:s.call(this,arguments[1]);break;case 3:s.call(this,arguments[1],arguments[2]);break;default:c=Array.prototype.slice.call(arguments,1),s.apply(this,c)}else if(n(s))for(c=Array.prototype.slice.call(arguments,1),a=(u=s.slice()).length,o=0;o0&&this._events[e].length>a&&(this._events[e].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[e].length),"function"==typeof console.trace&&console.trace()),this},t.prototype.on=t.prototype.addListener,t.prototype.once=function(e,t){if(!r(t))throw TypeError("listener must be a function");var n=!1;function i(){this.removeListener(e,i),n||(n=!0,t.apply(this,arguments))}return i.listener=t,this.on(e,i),this},t.prototype.removeListener=function(e,t){var i,s,a,c;if(!r(t))throw TypeError("listener must be a function");if(!this._events||!this._events[e])return this;if(a=(i=this._events[e]).length,s=-1,i===t||r(i.listener)&&i.listener===t)delete this._events[e],this._events.removeListener&&this.emit("removeListener",e,t);else if(n(i)){for(c=a;c-- >0;)if(i[c]===t||i[c].listener&&i[c].listener===t){s=c;break}if(s<0)return this;1===i.length?(i.length=0,delete this._events[e]):i.splice(s,1),this._events.removeListener&&this.emit("removeListener",e,t)}return this},t.prototype.removeAllListeners=function(e){var t,n;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[e]&&delete this._events[e],this;if(0===arguments.length){for(t in this._events)"removeListener"!==t&&this.removeAllListeners(t);return this.removeAllListeners("removeListener"),this._events={},this}if(r(n=this._events[e]))this.removeListener(e,n);else if(n)for(;n.length;)this.removeListener(e,n[n.length-1]);return delete this._events[e],this},t.prototype.listeners=function(e){return this._events&&this._events[e]?r(this._events[e])?[this._events[e]]:this._events[e].slice():[]},t.prototype.listenerCount=function(e){if(this._events){var t=this._events[e];if(r(t))return 1;if(t)return t.length}return 0},t.listenerCount=function(e,t){return e.listenerCount(t)}},7946:(e,t,r)=>{"use strict";var n=r(3748),i=r(4582),s=r(2403),a=r(9536),c=r(4446);function o(e,t,r,i){return new n(e,t,r,i)}o.version=r(6155),o.AlgoliaSearchHelper=n,o.SearchParameters=a,o.RecommendParameters=i,o.SearchResults=c,o.RecommendResults=s,e.exports=o},7710:(e,t,r)=>{"use strict";var n=r(8181);function i(e,t,r){this.main=e,this.fn=t,this.recommendFn=r,this.lastResults=null,this.lastRecommendResults=null}r(6481)(i,n),i.prototype.detach=function(){this.removeAllListeners(),this.main.detachDerivedHelper(this)},i.prototype.getModifiedState=function(e){return this.fn(e)},i.prototype.getModifiedRecommendState=function(e){return this.recommendFn(e)},e.exports=i},4582:e=>{"use strict";function t(e){e=e||{},this.params=e.params||[]}t.prototype={constructor:t,addParams:function(e){var r=this.params.slice();return r.push(e),new t({params:r})},removeParams:function(e){return new t({params:this.params.filter((function(t){return t.$$id!==e}))})},addFrequentlyBoughtTogether:function(e){return this.addParams(Object.assign({},e,{model:"bought-together"}))},addRelatedProducts:function(e){return this.addParams(Object.assign({},e,{model:"related-products"}))},addTrendingItems:function(e){return this.addParams(Object.assign({},e,{model:"trending-items"}))},addTrendingFacets:function(e){return this.addParams(Object.assign({},e,{model:"trending-facets"}))},addLookingSimilar:function(e){return this.addParams(Object.assign({},e,{model:"looking-similar"}))},_buildQueries:function(e,t){return this.params.filter((function(e){return void 0===t[e.$$id]})).map((function(t){var r=Object.assign({},t,{indexName:e});return delete r.$$id,r}))}},e.exports=t},2403:e=>{"use strict";function t(e,t){this._state=e,this._rawResults={};var r=this;e.params.forEach((function(e){var n=e.$$id;r[n]=t[n],r._rawResults[n]=t[n]}))}t.prototype={constructor:t},e.exports=t},7867:(e,t,r)=>{"use strict";var n=r(2973),i=r(4996),s=r(1968),a={addRefinement:function(e,t,r){if(a.isRefined(e,t,r))return e;var i=""+r,s=e[t]?e[t].concat(i):[i],c={};return c[t]=s,n({},c,e)},removeRefinement:function(e,t,r){if(void 0===r)return a.clearRefinement(e,(function(e,r){return t===r}));var n=""+r;return a.clearRefinement(e,(function(e,r){return t===r&&n===e}))},toggleRefinement:function(e,t,r){if(void 0===r)throw new Error("toggleRefinement should be used with a value");return a.isRefined(e,t,r)?a.removeRefinement(e,t,r):a.addRefinement(e,t,r)},clearRefinement:function(e,t,r){if(void 0===t)return i(e)?{}:e;if("string"==typeof t)return s(e,[t]);if("function"==typeof t){var n=!1,a=Object.keys(e).reduce((function(i,s){var a=e[s]||[],c=a.filter((function(e){return!t(e,s,r)}));return c.length!==a.length&&(n=!0),i[s]=c,i}),{});return n?a:e}},isRefined:function(e,t,r){var n=Boolean(e[t])&&e[t].length>0;if(void 0===r||!n)return n;var i=""+r;return-1!==e[t].indexOf(i)}};e.exports=a},9536:(e,t,r)=>{"use strict";var n=r(2973),i=r(8622),s=r(2020),a=r(597),c=r(4996),o=r(1968),u=r(7042),h=r(1939),f=r(7867);function l(e,t){return Array.isArray(e)&&Array.isArray(t)?e.length===t.length&&e.every((function(e,r){return l(t[r],e)})):e===t}function m(e){var t=e?m._parseNumbers(e):{};void 0===t.userToken||h(t.userToken)||console.warn("[algoliasearch-helper] The `userToken` parameter is invalid. This can lead to wrong analytics.\n - Format: [a-zA-Z0-9_-]{1,64}"),this.facets=t.facets||[],this.disjunctiveFacets=t.disjunctiveFacets||[],this.hierarchicalFacets=t.hierarchicalFacets||[],this.facetsRefinements=t.facetsRefinements||{},this.facetsExcludes=t.facetsExcludes||{},this.disjunctiveFacetsRefinements=t.disjunctiveFacetsRefinements||{},this.numericRefinements=t.numericRefinements||{},this.tagRefinements=t.tagRefinements||[],this.hierarchicalFacetsRefinements=t.hierarchicalFacetsRefinements||{};var r=this;Object.keys(t).forEach((function(e){var n=-1!==m.PARAMETERS.indexOf(e),i=void 0!==t[e];!n&&i&&(r[e]=t[e])}))}m.PARAMETERS=Object.keys(new m),m._parseNumbers=function(e){if(e instanceof m)return e;var t={};if(["aroundPrecision","aroundRadius","getRankingInfo","minWordSizefor2Typos","minWordSizefor1Typo","page","maxValuesPerFacet","distinct","minimumAroundRadius","hitsPerPage","minProximity"].forEach((function(r){var n=e[r];if("string"==typeof n){var i=parseFloat(n);t[r]=isNaN(i)?n:i}})),Array.isArray(e.insideBoundingBox)&&(t.insideBoundingBox=e.insideBoundingBox.map((function(e){return Array.isArray(e)?e.map((function(e){return parseFloat(e)})):e}))),e.numericRefinements){var r={};Object.keys(e.numericRefinements).forEach((function(t){var n=e.numericRefinements[t]||{};r[t]={},Object.keys(n).forEach((function(e){var i=n[e].map((function(e){return Array.isArray(e)?e.map((function(e){return"string"==typeof e?parseFloat(e):e})):"string"==typeof e?parseFloat(e):e}));r[t][e]=i}))})),t.numericRefinements=r}return a(e,t)},m.make=function(e){var t=new m(e);return(e.hierarchicalFacets||[]).forEach((function(e){if(e.rootPath){var r=t.getHierarchicalRefinement(e.name);r.length>0&&0!==r[0].indexOf(e.rootPath)&&(t=t.clearRefinements(e.name)),0===(r=t.getHierarchicalRefinement(e.name)).length&&(t=t.toggleHierarchicalFacetRefinement(e.name,e.rootPath))}})),t},m.validate=function(e,t){var r=t||{};return e.tagFilters&&r.tagRefinements&&r.tagRefinements.length>0?new Error("[Tags] Cannot switch from the managed tag API to the advanced API. It is probably an error, if it is really what you want, you should first clear the tags with clearTags method."):e.tagRefinements.length>0&&r.tagFilters?new Error("[Tags] Cannot switch from the advanced tag API to the managed API. It is probably an error, if it is not, you should first clear the tags with clearTags method."):e.numericFilters&&r.numericRefinements&&c(r.numericRefinements)?new Error("[Numeric filters] Can't switch from the advanced to the managed API. It is probably an error, if this is really what you want, you have to first clear the numeric filters."):c(e.numericRefinements)&&r.numericFilters?new Error("[Numeric filters] Can't switch from the managed API to the advanced. It is probably an error, if this is really what you want, you have to first clear the numeric filters."):null},m.prototype={constructor:m,clearRefinements:function(e){var t={numericRefinements:this._clearNumericRefinements(e),facetsRefinements:f.clearRefinement(this.facetsRefinements,e,"conjunctiveFacet"),facetsExcludes:f.clearRefinement(this.facetsExcludes,e,"exclude"),disjunctiveFacetsRefinements:f.clearRefinement(this.disjunctiveFacetsRefinements,e,"disjunctiveFacet"),hierarchicalFacetsRefinements:f.clearRefinement(this.hierarchicalFacetsRefinements,e,"hierarchicalFacet")};return t.numericRefinements===this.numericRefinements&&t.facetsRefinements===this.facetsRefinements&&t.facetsExcludes===this.facetsExcludes&&t.disjunctiveFacetsRefinements===this.disjunctiveFacetsRefinements&&t.hierarchicalFacetsRefinements===this.hierarchicalFacetsRefinements?this:this.setQueryParameters(t)},clearTags:function(){return void 0===this.tagFilters&&0===this.tagRefinements.length?this:this.setQueryParameters({tagFilters:void 0,tagRefinements:[]})},setIndex:function(e){return e===this.index?this:this.setQueryParameters({index:e})},setQuery:function(e){return e===this.query?this:this.setQueryParameters({query:e})},setPage:function(e){return e===this.page?this:this.setQueryParameters({page:e})},setFacets:function(e){return this.setQueryParameters({facets:e})},setDisjunctiveFacets:function(e){return this.setQueryParameters({disjunctiveFacets:e})},setHitsPerPage:function(e){return this.hitsPerPage===e?this:this.setQueryParameters({hitsPerPage:e})},setTypoTolerance:function(e){return this.typoTolerance===e?this:this.setQueryParameters({typoTolerance:e})},addNumericRefinement:function(e,t,r){var n=u(r);if(this.isNumericRefined(e,t,n))return this;var i=a({},this.numericRefinements);return i[e]=a({},i[e]),i[e][t]?(i[e][t]=i[e][t].slice(),i[e][t].push(n)):i[e][t]=[n],this.setQueryParameters({numericRefinements:i})},getConjunctiveRefinements:function(e){return this.isConjunctiveFacet(e)&&this.facetsRefinements[e]||[]},getDisjunctiveRefinements:function(e){return this.isDisjunctiveFacet(e)&&this.disjunctiveFacetsRefinements[e]||[]},getHierarchicalRefinement:function(e){return this.hierarchicalFacetsRefinements[e]||[]},getExcludeRefinements:function(e){return this.isConjunctiveFacet(e)&&this.facetsExcludes[e]||[]},removeNumericRefinement:function(e,t,r){var n=r;return void 0!==n?this.isNumericRefined(e,t,n)?this.setQueryParameters({numericRefinements:this._clearNumericRefinements((function(r,i){return i===e&&r.op===t&&l(r.val,u(n))}))}):this:void 0!==t?this.isNumericRefined(e,t)?this.setQueryParameters({numericRefinements:this._clearNumericRefinements((function(r,n){return n===e&&r.op===t}))}):this:this.isNumericRefined(e)?this.setQueryParameters({numericRefinements:this._clearNumericRefinements((function(t,r){return r===e}))}):this},getNumericRefinements:function(e){return this.numericRefinements[e]||{}},getNumericRefinement:function(e,t){return this.numericRefinements[e]&&this.numericRefinements[e][t]},_clearNumericRefinements:function(e){if(void 0===e)return c(this.numericRefinements)?{}:this.numericRefinements;if("string"==typeof e)return o(this.numericRefinements,[e]);if("function"==typeof e){var t=!1,r=this.numericRefinements,n=Object.keys(r).reduce((function(n,i){var s=r[i],a={};return s=s||{},Object.keys(s).forEach((function(r){var n=s[r]||[],c=[];n.forEach((function(t){e({val:t,op:r},i,"numeric")||c.push(t)})),c.length!==n.length&&(t=!0),a[r]=c})),n[i]=a,n}),{});return t?n:this.numericRefinements}},addFacet:function(e){return this.isConjunctiveFacet(e)?this:this.setQueryParameters({facets:this.facets.concat([e])})},addDisjunctiveFacet:function(e){return this.isDisjunctiveFacet(e)?this:this.setQueryParameters({disjunctiveFacets:this.disjunctiveFacets.concat([e])})},addHierarchicalFacet:function(e){if(this.isHierarchicalFacet(e.name))throw new Error("Cannot declare two hierarchical facets with the same name: `"+e.name+"`");return this.setQueryParameters({hierarchicalFacets:this.hierarchicalFacets.concat([e])})},addFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsRefinements,e,t)?this:this.setQueryParameters({facetsRefinements:f.addRefinement(this.facetsRefinements,e,t)})},addExcludeRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsExcludes,e,t)?this:this.setQueryParameters({facetsExcludes:f.addRefinement(this.facetsExcludes,e,t)})},addDisjunctiveFacetRefinement:function(e,t){if(!this.isDisjunctiveFacet(e))throw new Error(e+" is not defined in the disjunctiveFacets attribute of the helper configuration");return f.isRefined(this.disjunctiveFacetsRefinements,e,t)?this:this.setQueryParameters({disjunctiveFacetsRefinements:f.addRefinement(this.disjunctiveFacetsRefinements,e,t)})},addTagRefinement:function(e){if(this.isTagRefined(e))return this;var t={tagRefinements:this.tagRefinements.concat(e)};return this.setQueryParameters(t)},removeFacet:function(e){return this.isConjunctiveFacet(e)?this.clearRefinements(e).setQueryParameters({facets:this.facets.filter((function(t){return t!==e}))}):this},removeDisjunctiveFacet:function(e){return this.isDisjunctiveFacet(e)?this.clearRefinements(e).setQueryParameters({disjunctiveFacets:this.disjunctiveFacets.filter((function(t){return t!==e}))}):this},removeHierarchicalFacet:function(e){return this.isHierarchicalFacet(e)?this.clearRefinements(e).setQueryParameters({hierarchicalFacets:this.hierarchicalFacets.filter((function(t){return t.name!==e}))}):this},removeFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsRefinements,e,t)?this.setQueryParameters({facetsRefinements:f.removeRefinement(this.facetsRefinements,e,t)}):this},removeExcludeRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsExcludes,e,t)?this.setQueryParameters({facetsExcludes:f.removeRefinement(this.facetsExcludes,e,t)}):this},removeDisjunctiveFacetRefinement:function(e,t){if(!this.isDisjunctiveFacet(e))throw new Error(e+" is not defined in the disjunctiveFacets attribute of the helper configuration");return f.isRefined(this.disjunctiveFacetsRefinements,e,t)?this.setQueryParameters({disjunctiveFacetsRefinements:f.removeRefinement(this.disjunctiveFacetsRefinements,e,t)}):this},removeTagRefinement:function(e){if(!this.isTagRefined(e))return this;var t={tagRefinements:this.tagRefinements.filter((function(t){return t!==e}))};return this.setQueryParameters(t)},toggleRefinement:function(e,t){return this.toggleFacetRefinement(e,t)},toggleFacetRefinement:function(e,t){if(this.isHierarchicalFacet(e))return this.toggleHierarchicalFacetRefinement(e,t);if(this.isConjunctiveFacet(e))return this.toggleConjunctiveFacetRefinement(e,t);if(this.isDisjunctiveFacet(e))return this.toggleDisjunctiveFacetRefinement(e,t);throw new Error("Cannot refine the undeclared facet "+e+"; it should be added to the helper options facets, disjunctiveFacets or hierarchicalFacets")},toggleConjunctiveFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return this.setQueryParameters({facetsRefinements:f.toggleRefinement(this.facetsRefinements,e,t)})},toggleExcludeFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return this.setQueryParameters({facetsExcludes:f.toggleRefinement(this.facetsExcludes,e,t)})},toggleDisjunctiveFacetRefinement:function(e,t){if(!this.isDisjunctiveFacet(e))throw new Error(e+" is not defined in the disjunctiveFacets attribute of the helper configuration");return this.setQueryParameters({disjunctiveFacetsRefinements:f.toggleRefinement(this.disjunctiveFacetsRefinements,e,t)})},toggleHierarchicalFacetRefinement:function(e,t){if(!this.isHierarchicalFacet(e))throw new Error(e+" is not defined in the hierarchicalFacets attribute of the helper configuration");var r=this._getHierarchicalFacetSeparator(this.getHierarchicalFacetByName(e)),i={};return void 0!==this.hierarchicalFacetsRefinements[e]&&this.hierarchicalFacetsRefinements[e].length>0&&(this.hierarchicalFacetsRefinements[e][0]===t||0===this.hierarchicalFacetsRefinements[e][0].indexOf(t+r))?-1===t.indexOf(r)?i[e]=[]:i[e]=[t.slice(0,t.lastIndexOf(r))]:i[e]=[t],this.setQueryParameters({hierarchicalFacetsRefinements:n({},i,this.hierarchicalFacetsRefinements)})},addHierarchicalFacetRefinement:function(e,t){if(this.isHierarchicalFacetRefined(e))throw new Error(e+" is already refined.");if(!this.isHierarchicalFacet(e))throw new Error(e+" is not defined in the hierarchicalFacets attribute of the helper configuration.");var r={};return r[e]=[t],this.setQueryParameters({hierarchicalFacetsRefinements:n({},r,this.hierarchicalFacetsRefinements)})},removeHierarchicalFacetRefinement:function(e){if(!this.isHierarchicalFacetRefined(e))return this;var t={};return t[e]=[],this.setQueryParameters({hierarchicalFacetsRefinements:n({},t,this.hierarchicalFacetsRefinements)})},toggleTagRefinement:function(e){return this.isTagRefined(e)?this.removeTagRefinement(e):this.addTagRefinement(e)},isDisjunctiveFacet:function(e){return this.disjunctiveFacets.indexOf(e)>-1},isHierarchicalFacet:function(e){return void 0!==this.getHierarchicalFacetByName(e)},isConjunctiveFacet:function(e){return this.facets.indexOf(e)>-1},isFacetRefined:function(e,t){return!!this.isConjunctiveFacet(e)&&f.isRefined(this.facetsRefinements,e,t)},isExcludeRefined:function(e,t){return!!this.isConjunctiveFacet(e)&&f.isRefined(this.facetsExcludes,e,t)},isDisjunctiveFacetRefined:function(e,t){return!!this.isDisjunctiveFacet(e)&&f.isRefined(this.disjunctiveFacetsRefinements,e,t)},isHierarchicalFacetRefined:function(e,t){if(!this.isHierarchicalFacet(e))return!1;var r=this.getHierarchicalRefinement(e);return t?-1!==r.indexOf(t):r.length>0},isNumericRefined:function(e,t,r){if(void 0===r&&void 0===t)return Boolean(this.numericRefinements[e]);var n=this.numericRefinements[e]&&void 0!==this.numericRefinements[e][t];if(void 0===r||!n)return n;var s,a,c=u(r),o=void 0!==(s=this.numericRefinements[e][t],a=c,i(s,(function(e){return l(e,a)})));return n&&o},isTagRefined:function(e){return-1!==this.tagRefinements.indexOf(e)},getRefinedDisjunctiveFacets:function(){var e=this,t=s(Object.keys(this.numericRefinements).filter((function(t){return Object.keys(e.numericRefinements[t]).length>0})),this.disjunctiveFacets);return Object.keys(this.disjunctiveFacetsRefinements).filter((function(t){return e.disjunctiveFacetsRefinements[t].length>0})).concat(t).concat(this.getRefinedHierarchicalFacets()).sort()},getRefinedHierarchicalFacets:function(){var e=this;return s(this.hierarchicalFacets.map((function(e){return e.name})),Object.keys(this.hierarchicalFacetsRefinements).filter((function(t){return e.hierarchicalFacetsRefinements[t].length>0}))).sort()},getUnrefinedDisjunctiveFacets:function(){var e=this.getRefinedDisjunctiveFacets();return this.disjunctiveFacets.filter((function(t){return-1===e.indexOf(t)}))},managedParameters:["index","facets","disjunctiveFacets","facetsRefinements","hierarchicalFacets","facetsExcludes","disjunctiveFacetsRefinements","numericRefinements","tagRefinements","hierarchicalFacetsRefinements"],getQueryParams:function(){var e=this.managedParameters,t={},r=this;return Object.keys(this).forEach((function(n){var i=r[n];-1===e.indexOf(n)&&void 0!==i&&(t[n]=i)})),t},setQueryParameter:function(e,t){if(this[e]===t)return this;var r={};return r[e]=t,this.setQueryParameters(r)},setQueryParameters:function(e){if(!e)return this;var t=m.validate(this,e);if(t)throw t;var r=this,n=m._parseNumbers(e),i=Object.keys(this).reduce((function(e,t){return e[t]=r[t],e}),{}),s=Object.keys(n).reduce((function(e,t){var r=void 0!==e[t],i=void 0!==n[t];return r&&!i?o(e,[t]):(i&&(e[t]=n[t]),e)}),i);return new this.constructor(s)},resetPage:function(){return void 0===this.page?this:this.setPage(0)},_getHierarchicalFacetSortBy:function(e){return e.sortBy||["isRefined:desc","name:asc"]},_getHierarchicalFacetSeparator:function(e){return e.separator||" > "},_getHierarchicalRootPath:function(e){return e.rootPath||null},_getHierarchicalShowParentLevel:function(e){return"boolean"!=typeof e.showParentLevel||e.showParentLevel},getHierarchicalFacetByName:function(e){return i(this.hierarchicalFacets,(function(t){return t.name===e}))},getHierarchicalFacetBreadcrumb:function(e){if(!this.isHierarchicalFacet(e))return[];var t=this.getHierarchicalRefinement(e)[0];if(!t)return[];var r=this._getHierarchicalFacetSeparator(this.getHierarchicalFacetByName(e));return t.split(r).map((function(e){return e.trim()}))},toString:function(){return JSON.stringify(this,null,2)}},e.exports=m},6458:(e,t,r)=>{"use strict";e.exports=function(e){return function(t,r){var n=e.hierarchicalFacets[r],u=e.hierarchicalFacetsRefinements[n.name]&&e.hierarchicalFacetsRefinements[n.name][0]||"",h=e._getHierarchicalFacetSeparator(n),f=e._getHierarchicalRootPath(n),l=e._getHierarchicalShowParentLevel(n),m=s(e._getHierarchicalFacetSortBy(n)),d=t.every((function(e){return e.exhaustive})),p=function(e,t,r,n,s){return function(u,h,f){var l=u;if(f>0){var m=0;for(l=u;m{"use strict";var n=r(4228),i=r(2973),s=r(9978),a=r(8622),c=r(6136),o=r(9934),u=r(597),h=r(2344),f=s.escapeFacetValue,l=s.unescapeFacetValue,m=r(6458);function d(e){var t={};return e.forEach((function(e,r){t[e]=r})),t}function p(e,t,r){t&&t[r]&&(e.stats=t[r])}function g(e,t,r){var s=t[0];this._rawResults=t;var o=this;Object.keys(s).forEach((function(e){o[e]=s[e]}));var h=u({persistHierarchicalRootCount:!1},r);Object.keys(h).forEach((function(e){o[e]=h[e]})),this.processingTimeMS=t.reduce((function(e,t){return void 0===t.processingTimeMS?e:e+t.processingTimeMS}),0),this.disjunctiveFacets=[],this.hierarchicalFacets=e.hierarchicalFacets.map((function(){return[]})),this.facets=[];var f=e.getRefinedDisjunctiveFacets(),g=d(e.facets),v=d(e.disjunctiveFacets),y=1,R=s.facets||{};Object.keys(R).forEach((function(t){var r,n,i=R[t],u=(r=e.hierarchicalFacets,n=t,a(r,(function(e){return(e.attributes||[]).indexOf(n)>-1})));if(u){var h=u.attributes.indexOf(t),f=c(e.hierarchicalFacets,(function(e){return e.name===u.name}));o.hierarchicalFacets[f][h]={attribute:t,data:i,exhaustive:s.exhaustiveFacetsCount}}else{var l,m=-1!==e.disjunctiveFacets.indexOf(t),d=-1!==e.facets.indexOf(t);m&&(l=v[t],o.disjunctiveFacets[l]={name:t,data:i,exhaustive:s.exhaustiveFacetsCount},p(o.disjunctiveFacets[l],s.facets_stats,t)),d&&(l=g[t],o.facets[l]={name:t,data:i,exhaustive:s.exhaustiveFacetsCount},p(o.facets[l],s.facets_stats,t))}})),this.hierarchicalFacets=n(this.hierarchicalFacets),f.forEach((function(r){var n=t[y],a=n&&n.facets?n.facets:{},h=e.getHierarchicalFacetByName(r);Object.keys(a).forEach((function(t){var r,f=a[t];if(h){r=c(e.hierarchicalFacets,(function(e){return e.name===h.name}));var m=c(o.hierarchicalFacets[r],(function(e){return e.attribute===t}));if(-1===m)return;o.hierarchicalFacets[r][m].data=u({},o.hierarchicalFacets[r][m].data,f)}else{r=v[t];var d=s.facets&&s.facets[t]||{};o.disjunctiveFacets[r]={name:t,data:i({},f,d),exhaustive:n.exhaustiveFacetsCount},p(o.disjunctiveFacets[r],n.facets_stats,t),e.disjunctiveFacetsRefinements[t]&&e.disjunctiveFacetsRefinements[t].forEach((function(n){!o.disjunctiveFacets[r].data[n]&&e.disjunctiveFacetsRefinements[t].indexOf(l(n))>-1&&(o.disjunctiveFacets[r].data[n]=0)}))}})),y++})),e.getRefinedHierarchicalFacets().forEach((function(r){var n=e.getHierarchicalFacetByName(r),s=e._getHierarchicalFacetSeparator(n),a=e.getHierarchicalRefinement(r);0===a.length||a[0].split(s).length<2||t.slice(y).forEach((function(t){var r=t&&t.facets?t.facets:{};Object.keys(r).forEach((function(t){var u=r[t],h=c(e.hierarchicalFacets,(function(e){return e.name===n.name})),f=c(o.hierarchicalFacets[h],(function(e){return e.attribute===t}));if(-1!==f){var l={};if(a.length>0&&!o.persistHierarchicalRootCount){var m=a[0].split(s)[0];l[m]=o.hierarchicalFacets[h][f].data[m]}o.hierarchicalFacets[h][f].data=i(l,u,o.hierarchicalFacets[h][f].data)}})),y++}))})),Object.keys(e.facetsExcludes).forEach((function(t){var r=e.facetsExcludes[t],n=g[t];o.facets[n]={name:t,data:R[t],exhaustive:s.exhaustiveFacetsCount},r.forEach((function(e){o.facets[n]=o.facets[n]||{name:t},o.facets[n].data=o.facets[n].data||{},o.facets[n].data[e]=0}))})),this.hierarchicalFacets=this.hierarchicalFacets.map(m(e)),this.facets=n(this.facets),this.disjunctiveFacets=n(this.disjunctiveFacets),this._state=e}function v(e,t){function r(e){return e.name===t}if(e._state.isConjunctiveFacet(t)){var n=a(e.facets,r);return n?Object.keys(n.data).map((function(r){var i=f(r);return{name:r,escapedValue:i,count:n.data[r],isRefined:e._state.isFacetRefined(t,i),isExcluded:e._state.isExcludeRefined(t,r)}})):[]}if(e._state.isDisjunctiveFacet(t)){var i=a(e.disjunctiveFacets,r);return i?Object.keys(i.data).map((function(r){var n=f(r);return{name:r,escapedValue:n,count:i.data[r],isRefined:e._state.isDisjunctiveFacetRefined(t,n)}})):[]}if(e._state.isHierarchicalFacet(t)){var s=a(e.hierarchicalFacets,r);if(!s)return s;var c=e._state.getHierarchicalFacetByName(t),o=e._state._getHierarchicalFacetSeparator(c),u=l(e._state.getHierarchicalRefinement(t)[0]||"");0===u.indexOf(c.rootPath)&&(u=u.replace(c.rootPath+o,""));var h=u.split(o);return h.unshift(t),y(s,h,0),s}}function y(e,t,r){e.isRefined=e.name===(t[r]&&t[r].trim()),e.data&&e.data.forEach((function(e){y(e,t,r+1)}))}function R(e,t,r,n){if(n=n||0,Array.isArray(t))return e(t,r[n]);if(!t.data||0===t.data.length)return t;var s=t.data.map((function(t){return R(e,t,r,n+1)})),a=e(s,r[n]);return i({data:a},t)}function F(e,t){var r=a(e,(function(e){return e.name===t}));return r&&r.stats}function b(e,t,r,n,i){var s=a(i,(function(e){return e.name===r})),c=s&&s.data&&s.data[n]?s.data[n]:0,o=s&&s.exhaustive||!1;return{type:t,attributeName:r,name:n,count:c,exhaustive:o}}g.prototype.getFacetByName=function(e){function t(t){return t.name===e}return a(this.facets,t)||a(this.disjunctiveFacets,t)||a(this.hierarchicalFacets,t)},g.DEFAULT_SORT=["isRefined:desc","count:desc","name:asc"],g.prototype.getFacetValues=function(e,t){var r=v(this,e);if(r){var n,s=i({},t,{sortBy:g.DEFAULT_SORT,facetOrdering:!(t&&t.sortBy)}),a=this;if(Array.isArray(r))n=[e];else n=a._state.getHierarchicalFacetByName(r.name).attributes;return R((function(e,t){if(s.facetOrdering){var r=function(e,t){return e.renderingContent&&e.renderingContent.facetOrdering&&e.renderingContent.facetOrdering.values&&e.renderingContent.facetOrdering.values[t]}(a,t);if(r)return function(e,t){var r=[],n=[],i=t.hide||[],s=(t.order||[]).reduce((function(e,t,r){return e[t]=r,e}),{});e.forEach((function(e){var t=e.path||e.name,a=i.indexOf(t)>-1;a||void 0===s[t]?a||n.push(e):r[s[t]]=e})),r=r.filter((function(e){return e}));var a,c=t.sortRemainingBy;return"hidden"===c?r:(a="alpha"===c?[["path","name"],["asc","asc"]]:[["count"],["desc"]],r.concat(h(n,a[0],a[1])))}(e,r)}if(Array.isArray(s.sortBy)){var n=o(s.sortBy,g.DEFAULT_SORT);return h(e,n[0],n[1])}if("function"==typeof s.sortBy)return function(e,t){return t.sort(e)}(s.sortBy,e);throw new Error("options.sortBy is optional but if defined it must be either an array of string (predicates) or a sorting function")}),r,n)}},g.prototype.getFacetStats=function(e){return this._state.isConjunctiveFacet(e)?F(this.facets,e):this._state.isDisjunctiveFacet(e)?F(this.disjunctiveFacets,e):void 0},g.prototype.getRefinements=function(){var e=this._state,t=this,r=[];return Object.keys(e.facetsRefinements).forEach((function(n){e.facetsRefinements[n].forEach((function(i){r.push(b(e,"facet",n,i,t.facets))}))})),Object.keys(e.facetsExcludes).forEach((function(n){e.facetsExcludes[n].forEach((function(i){r.push(b(e,"exclude",n,i,t.facets))}))})),Object.keys(e.disjunctiveFacetsRefinements).forEach((function(n){e.disjunctiveFacetsRefinements[n].forEach((function(i){r.push(b(e,"disjunctive",n,i,t.disjunctiveFacets))}))})),Object.keys(e.hierarchicalFacetsRefinements).forEach((function(n){e.hierarchicalFacetsRefinements[n].forEach((function(i){r.push(function(e,t,r,n){var i=e.getHierarchicalFacetByName(t),s=e._getHierarchicalFacetSeparator(i),c=r.split(s),o=a(n,(function(e){return e.name===t})),u=c.reduce((function(e,t){var r=e&&a(e.data,(function(e){return e.name===t}));return void 0!==r?r:e}),o),h=u&&u.count||0,f=u&&u.exhaustive||!1,l=u&&u.path||"";return{type:"hierarchical",attributeName:t,name:l,count:h,exhaustive:f}}(e,n,i,t.hierarchicalFacets))}))})),Object.keys(e.numericRefinements).forEach((function(t){var n=e.numericRefinements[t];Object.keys(n).forEach((function(e){n[e].forEach((function(n){r.push({type:"numeric",attributeName:t,name:n,numericValue:n,operator:e})}))}))})),e.tagRefinements.forEach((function(e){r.push({type:"tag",attributeName:"_tags",name:e})})),r},e.exports=g},3748:(e,t,r)=>{"use strict";var n=r(8181),i=r(7710),s=r(9978).escapeFacetValue,a=r(6481),c=r(597),o=r(4996),u=r(1968),h=r(4582),f=r(2403),l=r(3355),m=r(9536),d=r(4446),p=r(636),g=r(6155);function v(e,t,r,n){"function"==typeof e.addAlgoliaAgent&&e.addAlgoliaAgent("JS Helper ("+g+")"),this.setClient(e);var i=r||{};i.index=t,this.state=m.make(i),this.recommendState=new h({params:i.recommendState}),this.lastResults=null,this.lastRecommendResults=null,this._queryId=0,this._recommendQueryId=0,this._lastQueryIdReceived=-1,this._lastRecommendQueryIdReceived=-1,this.derivedHelpers=[],this._currentNbQueries=0,this._currentNbRecommendQueries=0,this._searchResultsOptions=n,this._recommendCache={}}function y(e){if(e<0)throw new Error("Page requested below 0.");return this._change({state:this.state.setPage(e),isPageReset:!1}),this}function R(){return this.state.page}a(v,n),v.prototype.search=function(){return this._search({onlyWithDerivedHelpers:!1}),this},v.prototype.searchOnlyWithDerivedHelpers=function(){return this._search({onlyWithDerivedHelpers:!0}),this},v.prototype.recommend=function(){return this._recommend(),this},v.prototype.getQuery=function(){var e=this.state;return l._getHitsSearchParams(e)},v.prototype.searchOnce=function(e,t){var r=e?this.state.setQueryParameters(e):this.state,n=l._getQueries(r.index,r),i=this;if(this._currentNbQueries++,this.emit("searchOnce",{state:r}),!t)return this.client.search(n).then((function(e){return i._currentNbQueries--,0===i._currentNbQueries&&i.emit("searchQueueEmpty"),{content:new d(r,e.results),state:r,_originalResponse:e}}),(function(e){throw i._currentNbQueries--,0===i._currentNbQueries&&i.emit("searchQueueEmpty"),e}));this.client.search(n).then((function(e){i._currentNbQueries--,0===i._currentNbQueries&&i.emit("searchQueueEmpty"),t(null,new d(r,e.results),r)})).catch((function(e){i._currentNbQueries--,0===i._currentNbQueries&&i.emit("searchQueueEmpty"),t(e,null,r)}))},v.prototype.findAnswers=function(e){console.warn("[algoliasearch-helper] answers is no longer supported");var t=this.state,r=this.derivedHelpers[0];if(!r)return Promise.resolve([]);var n=r.getModifiedState(t),i=c({attributesForPrediction:e.attributesForPrediction,nbHits:e.nbHits},{params:u(l._getHitsSearchParams(n),["attributesToSnippet","hitsPerPage","restrictSearchableAttributes","snippetEllipsisText"])}),s="search for answers was called, but this client does not have a function client.initIndex(index).findAnswers";if("function"!=typeof this.client.initIndex)throw new Error(s);var a=this.client.initIndex(n.index);if("function"!=typeof a.findAnswers)throw new Error(s);return a.findAnswers(n.query,e.queryLanguages,i)},v.prototype.searchForFacetValues=function(e,t,r,n){var i="function"==typeof this.client.searchForFacetValues,a="function"==typeof this.client.initIndex;if(!i&&!a&&"function"!=typeof this.client.search)throw new Error("search for facet values (searchable) was called, but this client does not have a function client.searchForFacetValues or client.initIndex(index).searchForFacetValues");var c=this.state.setQueryParameters(n||{}),o=c.isDisjunctiveFacet(e),u=l.getSearchForFacetQuery(e,t,r,c);this._currentNbQueries++;var h,f=this;return i?h=this.client.searchForFacetValues([{indexName:c.index,params:u}]):a?h=this.client.initIndex(c.index).searchForFacetValues(u):(delete u.facetName,h=this.client.search([{type:"facet",facet:e,indexName:c.index,params:u}]).then((function(e){return e.results[0]}))),this.emit("searchForFacetValues",{state:c,facet:e,query:t}),h.then((function(t){return f._currentNbQueries--,0===f._currentNbQueries&&f.emit("searchQueueEmpty"),(t=Array.isArray(t)?t[0]:t).facetHits.forEach((function(t){t.escapedValue=s(t.value),t.isRefined=o?c.isDisjunctiveFacetRefined(e,t.escapedValue):c.isFacetRefined(e,t.escapedValue)})),t}),(function(e){throw f._currentNbQueries--,0===f._currentNbQueries&&f.emit("searchQueueEmpty"),e}))},v.prototype.setQuery=function(e){return this._change({state:this.state.resetPage().setQuery(e),isPageReset:!0}),this},v.prototype.clearRefinements=function(e){return this._change({state:this.state.resetPage().clearRefinements(e),isPageReset:!0}),this},v.prototype.clearTags=function(){return this._change({state:this.state.resetPage().clearTags(),isPageReset:!0}),this},v.prototype.addDisjunctiveFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().addDisjunctiveFacetRefinement(e,t),isPageReset:!0}),this},v.prototype.addDisjunctiveRefine=function(){return this.addDisjunctiveFacetRefinement.apply(this,arguments)},v.prototype.addHierarchicalFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().addHierarchicalFacetRefinement(e,t),isPageReset:!0}),this},v.prototype.addNumericRefinement=function(e,t,r){return this._change({state:this.state.resetPage().addNumericRefinement(e,t,r),isPageReset:!0}),this},v.prototype.addFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().addFacetRefinement(e,t),isPageReset:!0}),this},v.prototype.addRefine=function(){return this.addFacetRefinement.apply(this,arguments)},v.prototype.addFacetExclusion=function(e,t){return this._change({state:this.state.resetPage().addExcludeRefinement(e,t),isPageReset:!0}),this},v.prototype.addExclude=function(){return this.addFacetExclusion.apply(this,arguments)},v.prototype.addTag=function(e){return this._change({state:this.state.resetPage().addTagRefinement(e),isPageReset:!0}),this},v.prototype.addFrequentlyBoughtTogether=function(e){return this._recommendChange({state:this.recommendState.addFrequentlyBoughtTogether(e)}),this},v.prototype.addRelatedProducts=function(e){return this._recommendChange({state:this.recommendState.addRelatedProducts(e)}),this},v.prototype.addTrendingItems=function(e){return this._recommendChange({state:this.recommendState.addTrendingItems(e)}),this},v.prototype.addTrendingFacets=function(e){return this._recommendChange({state:this.recommendState.addTrendingFacets(e)}),this},v.prototype.addLookingSimilar=function(e){return this._recommendChange({state:this.recommendState.addLookingSimilar(e)}),this},v.prototype.removeNumericRefinement=function(e,t,r){return this._change({state:this.state.resetPage().removeNumericRefinement(e,t,r),isPageReset:!0}),this},v.prototype.removeDisjunctiveFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().removeDisjunctiveFacetRefinement(e,t),isPageReset:!0}),this},v.prototype.removeDisjunctiveRefine=function(){return this.removeDisjunctiveFacetRefinement.apply(this,arguments)},v.prototype.removeHierarchicalFacetRefinement=function(e){return this._change({state:this.state.resetPage().removeHierarchicalFacetRefinement(e),isPageReset:!0}),this},v.prototype.removeFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().removeFacetRefinement(e,t),isPageReset:!0}),this},v.prototype.removeRefine=function(){return this.removeFacetRefinement.apply(this,arguments)},v.prototype.removeFacetExclusion=function(e,t){return this._change({state:this.state.resetPage().removeExcludeRefinement(e,t),isPageReset:!0}),this},v.prototype.removeExclude=function(){return this.removeFacetExclusion.apply(this,arguments)},v.prototype.removeTag=function(e){return this._change({state:this.state.resetPage().removeTagRefinement(e),isPageReset:!0}),this},v.prototype.removeFrequentlyBoughtTogether=function(e){return this._recommendChange({state:this.recommendState.removeParams(e)}),this},v.prototype.removeRelatedProducts=function(e){return this._recommendChange({state:this.recommendState.removeParams(e)}),this},v.prototype.removeTrendingItems=function(e){return this._recommendChange({state:this.recommendState.removeParams(e)}),this},v.prototype.removeTrendingFacets=function(e){return this._recommendChange({state:this.recommendState.removeParams(e)}),this},v.prototype.removeLookingSimilar=function(e){return this._recommendChange({state:this.recommendState.removeParams(e)}),this},v.prototype.toggleFacetExclusion=function(e,t){return this._change({state:this.state.resetPage().toggleExcludeFacetRefinement(e,t),isPageReset:!0}),this},v.prototype.toggleExclude=function(){return this.toggleFacetExclusion.apply(this,arguments)},v.prototype.toggleRefinement=function(e,t){return this.toggleFacetRefinement(e,t)},v.prototype.toggleFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().toggleFacetRefinement(e,t),isPageReset:!0}),this},v.prototype.toggleRefine=function(){return this.toggleFacetRefinement.apply(this,arguments)},v.prototype.toggleTag=function(e){return this._change({state:this.state.resetPage().toggleTagRefinement(e),isPageReset:!0}),this},v.prototype.nextPage=function(){var e=this.state.page||0;return this.setPage(e+1)},v.prototype.previousPage=function(){var e=this.state.page||0;return this.setPage(e-1)},v.prototype.setCurrentPage=y,v.prototype.setPage=y,v.prototype.setIndex=function(e){return this._change({state:this.state.resetPage().setIndex(e),isPageReset:!0}),this},v.prototype.setQueryParameter=function(e,t){return this._change({state:this.state.resetPage().setQueryParameter(e,t),isPageReset:!0}),this},v.prototype.setState=function(e){return this._change({state:m.make(e),isPageReset:!1}),this},v.prototype.overrideStateWithoutTriggeringChangeEvent=function(e){return this.state=new m(e),this},v.prototype.hasRefinements=function(e){return!!o(this.state.getNumericRefinements(e))||(this.state.isConjunctiveFacet(e)?this.state.isFacetRefined(e):this.state.isDisjunctiveFacet(e)?this.state.isDisjunctiveFacetRefined(e):!!this.state.isHierarchicalFacet(e)&&this.state.isHierarchicalFacetRefined(e))},v.prototype.isExcluded=function(e,t){return this.state.isExcludeRefined(e,t)},v.prototype.isDisjunctiveRefined=function(e,t){return this.state.isDisjunctiveFacetRefined(e,t)},v.prototype.hasTag=function(e){return this.state.isTagRefined(e)},v.prototype.isTagRefined=function(){return this.hasTagRefinements.apply(this,arguments)},v.prototype.getIndex=function(){return this.state.index},v.prototype.getCurrentPage=R,v.prototype.getPage=R,v.prototype.getTags=function(){return this.state.tagRefinements},v.prototype.getRefinements=function(e){var t=[];if(this.state.isConjunctiveFacet(e))this.state.getConjunctiveRefinements(e).forEach((function(e){t.push({value:e,type:"conjunctive"})})),this.state.getExcludeRefinements(e).forEach((function(e){t.push({value:e,type:"exclude"})}));else if(this.state.isDisjunctiveFacet(e)){this.state.getDisjunctiveRefinements(e).forEach((function(e){t.push({value:e,type:"disjunctive"})}))}var r=this.state.getNumericRefinements(e);return Object.keys(r).forEach((function(e){var n=r[e];t.push({value:n,operator:e,type:"numeric"})})),t},v.prototype.getNumericRefinement=function(e,t){return this.state.getNumericRefinement(e,t)},v.prototype.getHierarchicalFacetBreadcrumb=function(e){return this.state.getHierarchicalFacetBreadcrumb(e)},v.prototype._search=function(e){var t=this.state,r=[],n=[];e.onlyWithDerivedHelpers||(n=l._getQueries(t.index,t),r.push({state:t,queriesCount:n.length,helper:this}),this.emit("search",{state:t,results:this.lastResults}));var i=this.derivedHelpers.map((function(e){var n=e.getModifiedState(t),i=n.index?l._getQueries(n.index,n):[];return r.push({state:n,queriesCount:i.length,helper:e}),e.emit("search",{state:n,results:e.lastResults}),i})),s=Array.prototype.concat.apply(n,i),a=this._queryId++;if(this._currentNbQueries++,!s.length)return Promise.resolve({results:[]}).then(this._dispatchAlgoliaResponse.bind(this,r,a));try{this.client.search(s).then(this._dispatchAlgoliaResponse.bind(this,r,a)).catch(this._dispatchAlgoliaError.bind(this,a))}catch(c){this.emit("error",{error:c})}},v.prototype._recommend=function(){var e=this.state,t=this.recommendState,r=this.getIndex(),n=[{state:t,index:r,helper:this}],i=t.params.map((function(e){return e.$$id}));this.emit("fetch",{recommend:{state:t,results:this.lastRecommendResults}});var s=this._recommendCache,a=this.derivedHelpers.map((function(t){var r=t.getModifiedState(e).index;if(!r)return[];var a=t.getModifiedRecommendState(new h);return n.push({state:a,index:r,helper:t}),i=Array.prototype.concat.apply(i,a.params.map((function(e){return e.$$id}))),t.emit("fetch",{recommend:{state:a,results:t.lastRecommendResults}}),a._buildQueries(r,s)})),c=Array.prototype.concat.apply(this.recommendState._buildQueries(r,s),a);if(0!==c.length)if(c.length>0&&void 0===this.client.getRecommendations)console.warn("Please update algoliasearch/lite to the latest version in order to use recommend widgets.");else{var o=this._recommendQueryId++;this._currentNbRecommendQueries++;try{this.client.getRecommendations(c).then(this._dispatchRecommendResponse.bind(this,o,n,i)).catch(this._dispatchRecommendError.bind(this,o))}catch(u){this.emit("error",{error:u})}}},v.prototype._dispatchAlgoliaResponse=function(e,t,r){var n=this;if(!(t0},v.prototype._change=function(e){var t=e.state,r=e.isPageReset;t!==this.state&&(this.state=t,this.emit("change",{state:this.state,results:this.lastResults,isPageReset:r}))},v.prototype._recommendChange=function(e){var t=e.state;t!==this.recommendState&&(this.recommendState=t,this.emit("recommend:change",{search:{results:this.lastResults,state:this.state},recommend:{results:this.lastRecommendResults,state:this.recommendState}}))},v.prototype.clearCache=function(){return this.client.clearCache&&this.client.clearCache(),this},v.prototype.setClient=function(e){return this.client===e||("function"==typeof e.addAlgoliaAgent&&e.addAlgoliaAgent("JS Helper ("+g+")"),this.client=e),this},v.prototype.getClient=function(){return this.client},v.prototype.derive=function(e,t){var r=new i(this,e,t);return this.derivedHelpers.push(r),r},v.prototype.detachDerivedHelper=function(e){var t=this.derivedHelpers.indexOf(e);if(-1===t)throw new Error("Derived helper already detached");this.derivedHelpers.splice(t,1)},v.prototype.hasPendingRequests=function(){return this._currentNbQueries>0},e.exports=v},4228:e=>{"use strict";e.exports=function(e){return Array.isArray(e)?e.filter(Boolean):[]}},2973:e=>{"use strict";e.exports=function(){return Array.prototype.slice.call(arguments).reduceRight((function(e,t){return Object.keys(Object(t)).forEach((function(r){void 0!==t[r]&&(void 0!==e[r]&&delete e[r],e[r]=t[r])})),e}),{})}},9978:e=>{"use strict";e.exports={escapeFacetValue:function(e){return"string"!=typeof e?e:String(e).replace(/^-/,"\\-")},unescapeFacetValue:function(e){return"string"!=typeof e?e:e.replace(/^\\-/,"-")}}},8622:e=>{"use strict";e.exports=function(e,t){if(Array.isArray(e))for(var r=0;r{"use strict";e.exports=function(e,t){if(!Array.isArray(e))return-1;for(var r=0;r{e.exports=function(e){return e.reduce((function(e,t){return e.concat(t)}),[])}},9934:(e,t,r)=>{"use strict";var n=r(8622);e.exports=function(e,t){var r=(t||[]).map((function(e){return e.split(":")}));return e.reduce((function(e,t){var i=t.split(":"),s=n(r,(function(e){return e[0]===i[0]}));return i.length>1||!s?(e[0].push(i[0]),e[1].push(i[1]),e):(e[0].push(s[0]),e[1].push(s[1]),e)}),[[],[]])}},6481:e=>{"use strict";e.exports=function(e,t){e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})}},2020:e=>{"use strict";e.exports=function(e,t){return e.filter((function(r,n){return t.indexOf(r)>-1&&e.indexOf(r)===n}))}},597:e=>{"use strict";function t(e){return"function"==typeof e||Array.isArray(e)||"[object Object]"===Object.prototype.toString.call(e)}function r(e,n){if(e===n)return e;for(var i in n)if(Object.prototype.hasOwnProperty.call(n,i)&&"__proto__"!==i&&"constructor"!==i){var s=n[i],a=e[i];void 0!==a&&void 0===s||(t(a)&&t(s)?e[i]=r(a,s):e[i]="object"==typeof(c=s)&&null!==c?r(Array.isArray(c)?[]:{},c):c)}var c;return e}e.exports=function(e){t(e)||(e={});for(var n=1,i=arguments.length;n{"use strict";e.exports=function(e){return e&&Object.keys(e).length>0}},1968:e=>{"use strict";e.exports=function(e,t){if(null===e)return{};var r,n,i={},s=Object.keys(e);for(n=0;n=0||(i[r]=e[r]);return i}},2344:e=>{"use strict";function t(e,t){if(e!==t){var r=void 0!==e,n=null===e,i=void 0!==t,s=null===t;if(!s&&e>t||n&&i||!r)return 1;if(!n&&e=n.length?s:"desc"===n[i]?-s:s}return e.index-r.index})),i.map((function(e){return e.value}))}},7042:e=>{"use strict";e.exports=function e(t){if("number"==typeof t)return t;if("string"==typeof t)return parseFloat(t);if(Array.isArray(t))return t.map(e);throw new Error("The value should be a number, a parsable string or an array of those.")}},3355:(e,t,r)=>{"use strict";var n=r(597);function i(e){return Object.keys(e).sort().reduce((function(t,r){return t[r]=e[r],t}),{})}var s={_getQueries:function(e,t){var r=[];return r.push({indexName:e,params:s._getHitsSearchParams(t)}),t.getRefinedDisjunctiveFacets().forEach((function(n){r.push({indexName:e,params:s._getDisjunctiveFacetSearchParams(t,n)})})),t.getRefinedHierarchicalFacets().forEach((function(n){var i=t.getHierarchicalFacetByName(n),a=t.getHierarchicalRefinement(n),c=t._getHierarchicalFacetSeparator(i);if(a.length>0&&a[0].split(c).length>1){var o=a[0].split(c).slice(0,-1).reduce((function(e,t,r){return e.concat({attribute:i.attributes[r],value:0===r?t:[e[e.length-1].value,t].join(c)})}),[]);o.forEach((function(n,a){var c=s._getDisjunctiveFacetSearchParams(t,n.attribute,0===a);function u(e){return i.attributes.some((function(t){return t===e.split(":")[0]}))}var h=(c.facetFilters||[]).reduce((function(e,t){if(Array.isArray(t)){var r=t.filter((function(e){return!u(e)}));r.length>0&&e.push(r)}return"string"!=typeof t||u(t)||e.push(t),e}),[]),f=o[a-1];c.facetFilters=a>0?h.concat(f.attribute+":"+f.value):h.length>0?h:void 0,r.push({indexName:e,params:c})}))}})),r},_getHitsSearchParams:function(e){var t=e.facets.concat(e.disjunctiveFacets).concat(s._getHitsHierarchicalFacetsAttributes(e)).sort(),r=s._getFacetFilters(e),a=s._getNumericFilters(e),c=s._getTagFilters(e),o={facets:t.indexOf("*")>-1?["*"]:t,tagFilters:c};return r.length>0&&(o.facetFilters=r),a.length>0&&(o.numericFilters=a),i(n({},e.getQueryParams(),o))},_getDisjunctiveFacetSearchParams:function(e,t,r){var a=s._getFacetFilters(e,t,r),c=s._getNumericFilters(e,t),o=s._getTagFilters(e),u={hitsPerPage:0,page:0,analytics:!1,clickAnalytics:!1};o.length>0&&(u.tagFilters=o);var h=e.getHierarchicalFacetByName(t);return u.facets=h?s._getDisjunctiveHierarchicalFacetAttribute(e,h,r):t,c.length>0&&(u.numericFilters=c),a.length>0&&(u.facetFilters=a),i(n({},e.getQueryParams(),u))},_getNumericFilters:function(e,t){if(e.numericFilters)return e.numericFilters;var r=[];return Object.keys(e.numericRefinements).forEach((function(n){var i=e.numericRefinements[n]||{};Object.keys(i).forEach((function(e){var s=i[e]||[];t!==n&&s.forEach((function(t){if(Array.isArray(t)){var i=t.map((function(t){return n+e+t}));r.push(i)}else r.push(n+e+t)}))}))})),r},_getTagFilters:function(e){return e.tagFilters?e.tagFilters:e.tagRefinements.join(",")},_getFacetFilters:function(e,t,r){var n=[],i=e.facetsRefinements||{};Object.keys(i).sort().forEach((function(e){(i[e]||[]).slice().sort().forEach((function(t){n.push(e+":"+t)}))}));var s=e.facetsExcludes||{};Object.keys(s).sort().forEach((function(e){(s[e]||[]).sort().forEach((function(t){n.push(e+":-"+t)}))}));var a=e.disjunctiveFacetsRefinements||{};Object.keys(a).sort().forEach((function(e){var r=a[e]||[];if(e!==t&&r&&0!==r.length){var i=[];r.slice().sort().forEach((function(t){i.push(e+":"+t)})),n.push(i)}}));var c=e.hierarchicalFacetsRefinements||{};return Object.keys(c).sort().forEach((function(i){var s=(c[i]||[])[0];if(void 0!==s){var a,o,u=e.getHierarchicalFacetByName(i),h=e._getHierarchicalFacetSeparator(u),f=e._getHierarchicalRootPath(u);if(t===i){if(-1===s.indexOf(h)||!f&&!0===r||f&&f.split(h).length===s.split(h).length)return;f?(o=f.split(h).length-1,s=f):(o=s.split(h).length-2,s=s.slice(0,s.lastIndexOf(h))),a=u.attributes[o]}else o=s.split(h).length-1,a=u.attributes[o];a&&n.push([a+":"+s])}})),n},_getHitsHierarchicalFacetsAttributes:function(e){return e.hierarchicalFacets.reduce((function(t,r){var n=e.getHierarchicalRefinement(r.name)[0];if(!n)return t.push(r.attributes[0]),t;var i=e._getHierarchicalFacetSeparator(r),s=n.split(i).length,a=r.attributes.slice(0,s+1);return t.concat(a)}),[])},_getDisjunctiveHierarchicalFacetAttribute:function(e,t,r){var n=e._getHierarchicalFacetSeparator(t);if(!0===r){var i=e._getHierarchicalRootPath(t),s=0;return i&&(s=i.split(n).length),[t.attributes[s]]}var a=(e.getHierarchicalRefinement(t.name)[0]||"").split(n).length-1;return t.attributes.slice(0,a+1)},getSearchForFacetQuery:function(e,t,r,a){var c=a.isDisjunctiveFacet(e)?a.clearRefinements(e):a,o={facetQuery:t,facetName:e};return"number"==typeof r&&(o.maxFacetHits=r),i(n({},s._getHitsSearchParams(c),o))}};e.exports=s},1939:e=>{"use strict";e.exports=function(e){return null!==e&&/^[a-zA-Z0-9_-]{1,64}$/.test(e)}},636:(e,t,r)=>{"use strict";var n=r(8622),i=r(4702);e.exports=function(e){var t={};return e.forEach((function(e){e.forEach((function(e,r){t[e.objectID]?t[e.objectID]={indexSum:t[e.objectID].indexSum+r,count:t[e.objectID].count+1}:t[e.objectID]={indexSum:r,count:1}}))})),function(e,t){var r=[];return Object.keys(e).forEach((function(n){e[n].count<2&&(e[n].indexSum+=100),r.push({objectID:n,avgOfIndices:e[n].indexSum/t})})),r.sort((function(e,t){return e.avgOfIndices>t.avgOfIndices?1:-1}))}(t,e.length).reduce((function(t,r){var s=n(i(e),(function(e){return e.objectID===r.objectID}));return s?t.concat(s):t}),[])}},6155:e=>{"use strict";e.exports="3.22.0"},370:function(e){e.exports=function(){"use strict";function e(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function t(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function r(r){for(var n=1;n=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}function i(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){if(Symbol.iterator in Object(e)||"[object Arguments]"===Object.prototype.toString.call(e)){var r=[],n=!0,i=!1,s=void 0;try{for(var a,c=e[Symbol.iterator]();!(n=(a=c.next()).done)&&(r.push(a.value),!t||r.length!==t);n=!0);}catch(e){i=!0,s=e}finally{try{n||null==c.return||c.return()}finally{if(i)throw s}}return r}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}()}function s(e){return function(e){if(Array.isArray(e)){for(var t=0,r=new Array(e.length);t2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return Promise.resolve().then((function(){c();var t=JSON.stringify(e);return s()[t]})).then((function(e){return Promise.all([e?e.value:t(),void 0!==e])})).then((function(e){var t=i(e,2),n=t[0],s=t[1];return Promise.all([n,s||r.miss(n)])})).then((function(e){return i(e,1)[0]}))},set:function(e,t){return Promise.resolve().then((function(){var i=s();return i[JSON.stringify(e)]={timestamp:(new Date).getTime(),value:t},n().setItem(r,JSON.stringify(i)),t}))},delete:function(e){return Promise.resolve().then((function(){var t=s();delete t[JSON.stringify(e)],n().setItem(r,JSON.stringify(t))}))},clear:function(){return Promise.resolve().then((function(){n().removeItem(r)}))}}}function c(e){var t=s(e.caches),r=t.shift();return void 0===r?{get:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return t().then((function(e){return Promise.all([e,r.miss(e)])})).then((function(e){return i(e,1)[0]}))},set:function(e,t){return Promise.resolve(t)},delete:function(e){return Promise.resolve()},clear:function(){return Promise.resolve()}}:{get:function(e,n){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return r.get(e,n,i).catch((function(){return c({caches:t}).get(e,n,i)}))},set:function(e,n){return r.set(e,n).catch((function(){return c({caches:t}).set(e,n)}))},delete:function(e){return r.delete(e).catch((function(){return c({caches:t}).delete(e)}))},clear:function(){return r.clear().catch((function(){return c({caches:t}).clear()}))}}}function o(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{serializable:!0},t={};return{get:function(r,n){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}},s=JSON.stringify(r);if(s in t)return Promise.resolve(e.serializable?JSON.parse(t[s]):t[s]);var a=n(),c=i&&i.miss||function(){return Promise.resolve()};return a.then((function(e){return c(e)})).then((function(){return a}))},set:function(r,n){return t[JSON.stringify(r)]=e.serializable?JSON.stringify(n):n,Promise.resolve(n)},delete:function(e){return delete t[JSON.stringify(e)],Promise.resolve()},clear:function(){return t={},Promise.resolve()}}}function u(e){for(var t=e.length-1;t>0;t--){var r=Math.floor(Math.random()*(t+1)),n=e[t];e[t]=e[r],e[r]=n}return e}function h(e,t){return t?(Object.keys(t).forEach((function(r){e[r]=t[r](e)})),e):e}function f(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),n=1;n0?n:void 0,timeout:r.timeout||t,headers:r.headers||{},queryParameters:r.queryParameters||{},cacheable:r.cacheable}}var d={Read:1,Write:2,Any:3},p=1,g=2,v=3;function y(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:p;return r(r({},e),{},{status:t,lastUpdate:Date.now()})}function R(e){return"string"==typeof e?{protocol:"https",url:e,accept:d.Any}:{protocol:e.protocol||"https",url:e.url,accept:e.accept||d.Any}}var F="GET",b="POST";function j(e,t){return Promise.all(t.map((function(t){return e.get(t,(function(){return Promise.resolve(y(t))}))}))).then((function(e){var r=e.filter((function(e){return function(e){return e.status===p||Date.now()-e.lastUpdate>12e4}(e)})),n=e.filter((function(e){return function(e){return e.status===v&&Date.now()-e.lastUpdate<=12e4}(e)})),i=[].concat(s(r),s(n));return{getTimeout:function(e,t){return(0===n.length&&0===e?1:n.length+3+e)*t},statelessHosts:i.length>0?i.map((function(e){return R(e)})):t}}))}function _(e,t,n,i){var a=[],c=function(e,t){if(e.method!==F&&(void 0!==e.data||void 0!==t.data)){var n=Array.isArray(e.data)?e.data:r(r({},e.data),t.data);return JSON.stringify(n)}}(n,i),o=function(e,t){var n=r(r({},e.headers),t.headers),i={};return Object.keys(n).forEach((function(e){var t=n[e];i[e.toLowerCase()]=t})),i}(e,i),u=n.method,h=n.method!==F?{}:r(r({},n.data),i.data),f=r(r(r({"x-algolia-agent":e.userAgent.value},e.queryParameters),h),i.queryParameters),l=0,m=function t(r,s){var h=r.pop();if(void 0===h)throw{name:"RetryError",message:"Unreachable hosts - your application id may be incorrect. If the error persists, contact support@algolia.com.",transporterStackTrace:O(a)};var m={data:c,headers:o,method:u,url:x(h,n.path,f),connectTimeout:s(l,e.timeouts.connect),responseTimeout:s(l,i.timeout)},d=function(e){var t={request:m,response:e,host:h,triesLeft:r.length};return a.push(t),t},p={onSuccess:function(e){return function(e){try{return JSON.parse(e.content)}catch(t){throw function(e,t){return{name:"DeserializationError",message:e,response:t}}(t.message,e)}}(e)},onRetry:function(n){var i=d(n);return n.isTimedOut&&l++,Promise.all([e.logger.info("Retryable failure",w(i)),e.hostsCache.set(h,y(h,n.isTimedOut?v:g))]).then((function(){return t(r,s)}))},onFail:function(e){throw d(e),function(e,t){var r=e.content,n=e.status,i=r;try{i=JSON.parse(r).message}catch(e){}return function(e,t,r){return{name:"ApiError",message:e,status:t,transporterStackTrace:r}}(i,n,t)}(e,O(a))}};return e.requester.send(m).then((function(e){return function(e,t){return function(e){var t=e.status;return e.isTimedOut||function(e){var t=e.isTimedOut,r=e.status;return!t&&!~~r}(e)||2!=~~(t/100)&&4!=~~(t/100)}(e)?t.onRetry(e):2==~~(e.status/100)?t.onSuccess(e):t.onFail(e)}(e,p)}))};return j(e.hostsCache,t).then((function(e){return m(s(e.statelessHosts).reverse(),e.getTimeout)}))}function P(e){var t={value:"Algolia for JavaScript (".concat(e,")"),add:function(e){var r="; ".concat(e.segment).concat(void 0!==e.version?" (".concat(e.version,")"):"");return-1===t.value.indexOf(r)&&(t.value="".concat(t.value).concat(r)),t}};return t}function x(e,t,r){var n=E(r),i="".concat(e.protocol,"://").concat(e.url,"/").concat("/"===t.charAt(0)?t.substr(1):t);return n.length&&(i+="?".concat(n)),i}function E(e){return Object.keys(e).map((function(t){return f("%s=%s",t,(r=e[t],"[object Object]"===Object.prototype.toString.call(r)||"[object Array]"===Object.prototype.toString.call(r)?JSON.stringify(e[t]):e[t]));var r})).join("&")}function O(e){return e.map((function(e){return w(e)}))}function w(e){var t=e.request.headers["x-algolia-api-key"]?{"x-algolia-api-key":"*****"}:{};return r(r({},e),{},{request:r(r({},e.request),{},{headers:r(r({},e.request.headers),t)})})}var S=function(e){var t=e.appId,n=function(e,t,r){var n={"x-algolia-api-key":r,"x-algolia-application-id":t};return{headers:function(){return e===l.WithinHeaders?n:{}},queryParameters:function(){return e===l.WithinQueryParameters?n:{}}}}(void 0!==e.authMode?e.authMode:l.WithinHeaders,t,e.apiKey),s=function(e){var t=e.hostsCache,r=e.logger,n=e.requester,s=e.requestsCache,a=e.responsesCache,c=e.timeouts,o=e.userAgent,u=e.hosts,h=e.queryParameters,f={hostsCache:t,logger:r,requester:n,requestsCache:s,responsesCache:a,timeouts:c,userAgent:o,headers:e.headers,queryParameters:h,hosts:u.map((function(e){return R(e)})),read:function(e,t){var r=m(t,f.timeouts.read),n=function(){return _(f,f.hosts.filter((function(e){return!!(e.accept&d.Read)})),e,r)};if(!0!==(void 0!==r.cacheable?r.cacheable:e.cacheable))return n();var s={request:e,mappedRequestOptions:r,transporter:{queryParameters:f.queryParameters,headers:f.headers}};return f.responsesCache.get(s,(function(){return f.requestsCache.get(s,(function(){return f.requestsCache.set(s,n()).then((function(e){return Promise.all([f.requestsCache.delete(s),e])}),(function(e){return Promise.all([f.requestsCache.delete(s),Promise.reject(e)])})).then((function(e){var t=i(e,2);return t[0],t[1]}))}))}),{miss:function(e){return f.responsesCache.set(s,e)}})},write:function(e,t){return _(f,f.hosts.filter((function(e){return!!(e.accept&d.Write)})),e,m(t,f.timeouts.write))}};return f}(r(r({hosts:[{url:"".concat(t,"-dsn.algolia.net"),accept:d.Read},{url:"".concat(t,".algolia.net"),accept:d.Write}].concat(u([{url:"".concat(t,"-1.algolianet.com")},{url:"".concat(t,"-2.algolianet.com")},{url:"".concat(t,"-3.algolianet.com")}]))},e),{},{headers:r(r(r({},n.headers()),{"content-type":"application/x-www-form-urlencoded"}),e.headers),queryParameters:r(r({},n.queryParameters()),e.queryParameters)}));return h({transporter:s,appId:t,addAlgoliaAgent:function(e,t){s.userAgent.add({segment:e,version:t})},clearCache:function(){return Promise.all([s.requestsCache.clear(),s.responsesCache.clear()]).then((function(){}))}},e.methods)},A=function(e){return function(t,r){return t.method===F?e.transporter.read(t,r):e.transporter.write(t,r)}},N=function(e){return function(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return h({transporter:e.transporter,appId:e.appId,indexName:t},r.methods)}},T=function(e){return function(t,n){var i=t.map((function(e){return r(r({},e),{},{params:E(e.params||{})})}));return e.transporter.read({method:b,path:"1/indexes/*/queries",data:{requests:i},cacheable:!0},n)}},Q=function(e){return function(t,i){return Promise.all(t.map((function(t){var s=t.params,a=s.facetName,c=s.facetQuery,o=n(s,["facetName","facetQuery"]);return N(e)(t.indexName,{methods:{searchForFacetValues:I}}).searchForFacetValues(a,c,r(r({},i),o))})))}},H=function(e){return function(t,r,n){return e.transporter.read({method:b,path:f("1/answers/%s/prediction",e.indexName),data:{query:t,queryLanguages:r},cacheable:!0},n)}},C=function(e){return function(t,r){return e.transporter.read({method:b,path:f("1/indexes/%s/query",e.indexName),data:{query:t},cacheable:!0},r)}},I=function(e){return function(t,r,n){return e.transporter.read({method:b,path:f("1/indexes/%s/facets/%s/query",e.indexName,t),data:{facetQuery:r},cacheable:!0},n)}},D=1,k=2,q=3,L=function(e){return function(t,n){var i=t.map((function(e){return r(r({},e),{},{threshold:e.threshold||0})}));return e.transporter.read({method:b,path:"1/indexes/*/recommendations",data:{requests:i},cacheable:!0},n)}};function V(e,t,n){var i,s={appId:e,apiKey:t,timeouts:{connect:1,read:2,write:30},requester:{send:function(e){return new Promise((function(t){var r=new XMLHttpRequest;r.open(e.method,e.url,!0),Object.keys(e.headers).forEach((function(t){return r.setRequestHeader(t,e.headers[t])}));var n,i=function(e,n){return setTimeout((function(){r.abort(),t({status:0,content:n,isTimedOut:!0})}),1e3*e)},s=i(e.connectTimeout,"Connection timeout");r.onreadystatechange=function(){r.readyState>r.OPENED&&void 0===n&&(clearTimeout(s),n=i(e.responseTimeout,"Socket timeout"))},r.onerror=function(){0===r.status&&(clearTimeout(s),clearTimeout(n),t({content:r.responseText||"Network request failed",status:r.status,isTimedOut:!1}))},r.onload=function(){clearTimeout(s),clearTimeout(n),t({content:r.responseText,status:r.status,isTimedOut:!1})},r.send(e.data)}))}},logger:(i=q,{debug:function(e,t){return D>=i&&console.debug(e,t),Promise.resolve()},info:function(e,t){return k>=i&&console.info(e,t),Promise.resolve()},error:function(e,t){return console.error(e,t),Promise.resolve()}}),responsesCache:o(),requestsCache:o({serializable:!1}),hostsCache:c({caches:[a({key:"".concat("4.23.3","-").concat(e)}),o()]}),userAgent:P("4.23.3").add({segment:"Browser",version:"lite"}),authMode:l.WithinQueryParameters};return S(r(r(r({},s),n),{},{methods:{search:T,searchForFacetValues:Q,multipleQueries:T,multipleSearchForFacetValues:Q,customRequest:A,initIndex:function(e){return function(t){return N(e)(t,{methods:{search:C,searchForFacetValues:I,findAnswers:H}})}},getRecommendations:L}}))}return V.version="4.23.3",V}()},7920:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>T});var n=r(758),i=r(3526),s=r(7946),a=r.n(s),c=r(370),o=r.n(c),u=r(9902),h=r(5463),f=r(8257),l=r(2907),m=r(8765);const d=["zero","one","two","few","many","other"];function p(e){return d.filter((t=>e.includes(t)))}const g={locale:"en",pluralForms:p(["one","other"]),select:e=>1===e?"one":"other"};function v(){const{i18n:{currentLocale:e}}=(0,m.A)();return(0,n.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:p(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),g}}),[e])}function y(){const e=v();return{selectMessage:(t,r)=>function(e,t,r){const n=e.split("|");if(1===n.length)return n[0];n.length>r.pluralForms.length&&console.error(`For locale=${r.locale}, a maximum of ${r.pluralForms.length} plural forms are expected (${r.pluralForms.join(",")}), but the message contains ${n.length}: ${e}`);const i=r.select(t),s=r.pluralForms.indexOf(i);return n[Math.min(s,n.length-1)]}(r,t,e)}}var R=r(2062),F=r(1495),b=r(2667),j=r(4574),_=r(7706),P=r(8923),x=r(9447),E=r(8013),O=r(9663);const w={searchQueryInput:"searchQueryInput_B20W",searchVersionInput:"searchVersionInput_XKiE",searchResultsColumn:"searchResultsColumn_uKu3",algoliaLogo:"algoliaLogo_uTtI",algoliaLogoPathFill:"algoliaLogoPathFill_XheT",searchResultItem:"searchResultItem_BQ4N",searchResultItemHeading:"searchResultItemHeading_Ix7K",searchResultItemPath:"searchResultItemPath_4_jz",searchResultItemSummary:"searchResultItemSummary_qv9c",searchQueryColumn:"searchQueryColumn_N3Rm",searchVersionColumn:"searchVersionColumn_SjMe",searchLogoColumn:"searchLogoColumn_QOW7",loadingSpinner:"loadingSpinner_qN0K","loading-spin":"loading-spin_Pikw",loader:"loader_JTMt"};var S=r(6070);function A(e){let{docsSearchVersionsHelpers:t}=e;const r=Object.entries(t.allDocsData).filter((e=>{let[,t]=e;return t.versions.length>1}));return(0,S.jsx)("div",{className:(0,i.A)("col","col--3","padding-left--none",w.searchVersionColumn),children:r.map((e=>{let[n,i]=e;const s=r.length>1?`${n}: `:"";return(0,S.jsx)("select",{onChange:e=>t.setSearchVersion(n,e.target.value),defaultValue:t.searchVersions[n],className:w.searchVersionInput,children:i.versions.map(((e,t)=>(0,S.jsx)("option",{label:`${s}${e.label}`,value:e.name},t)))},n)}))})}function N(){const{i18n:{currentLocale:e}}=(0,m.A)(),{algolia:{appId:t,apiKey:r,indexName:s,contextualSearch:c}}=(0,P.c)(),d=(0,x.C)(),p=function(){const{selectMessage:e}=y();return t=>e(t,(0,_.T)({id:"theme.SearchPage.documentsFound.plurals",description:'Pluralized label for "{count} documents found". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One document found|{count} documents found"},{count:t}))}(),g=function(){const e=(0,l.Gy)(),[t,r]=(0,n.useState)((()=>Object.entries(e).reduce(((e,t)=>{let[r,n]=t;return{...e,[r]:n.versions[0].name}}),{}))),i=Object.values(e).some((e=>e.versions.length>1));return{allDocsData:e,versioningEnabled:i,searchVersions:t,setSearchVersion:(e,t)=>r((r=>({...r,[e]:t})))}}(),[v,b]=(0,R.b)(),N={items:[],query:null,totalResults:null,totalPages:null,lastPage:null,hasMore:null,loading:null},[T,Q]=(0,n.useReducer)(((e,t)=>{switch(t.type){case"reset":return N;case"loading":return{...e,loading:!0};case"update":return v!==t.value.query?e:{...t.value,items:0===t.value.lastPage?t.value.items:e.items.concat(t.value.items)};case"advance":{const t=e.totalPages>e.lastPage+1;return{...e,lastPage:t?e.lastPage+1:e.lastPage,hasMore:t}}default:return e}}),N),H=c?["language","docusaurus_tag"]:[],C=o()(t,r),I=a()(C,s,{hitsPerPage:15,advancedSyntax:!0,disjunctiveFacets:H});I.on("result",(e=>{let{results:{query:t,hits:r,page:n,nbHits:i,nbPages:s}}=e;if(""===t||!Array.isArray(r))return void Q({type:"reset"});const a=e=>e.replace(/algolia-docsearch-suggestion--highlight/g,"search-result-match"),c=r.map((e=>{let{url:t,_highlightResult:{hierarchy:r},_snippetResult:n={}}=e;const i=Object.keys(r).map((e=>a(r[e].value)));return{title:i.pop(),url:d(t),summary:n.content?`${a(n.content.value)}...`:"",breadcrumbs:i}}));Q({type:"update",value:{items:c,query:t,totalResults:i,totalPages:s,lastPage:n,hasMore:s>n+1,loading:!1}})}));const[D,k]=(0,n.useState)(null),q=(0,n.useRef)(0),L=(0,n.useRef)(u.A.canUseIntersectionObserver&&new IntersectionObserver((e=>{const{isIntersecting:t,boundingClientRect:{y:r}}=e[0];t&&q.current>r&&Q({type:"advance"}),q.current=r}),{threshold:1})),V=()=>v?(0,_.T)({id:"theme.SearchPage.existingResultsTitle",message:'Search results for "{query}"',description:"The search page title for non-empty query"},{query:v}):(0,_.T)({id:"theme.SearchPage.emptyResultsTitle",message:"Search the documentation",description:"The search page title for empty query"}),B=(0,F._q)((function(t){void 0===t&&(t=0),c&&(I.addDisjunctiveFacetRefinement("docusaurus_tag","default"),I.addDisjunctiveFacetRefinement("language",e),Object.entries(g.searchVersions).forEach((e=>{let[t,r]=e;I.addDisjunctiveFacetRefinement("docusaurus_tag",`docs-${t}-${r}`)}))),I.setQuery(v).setPage(t).search()}));return(0,n.useEffect)((()=>{if(!D)return;const e=L.current;return e?(e.observe(D),()=>e.unobserve(D)):()=>!0}),[D]),(0,n.useEffect)((()=>{Q({type:"reset"}),v&&(Q({type:"loading"}),setTimeout((()=>{B()}),300))}),[v,g.searchVersions,B]),(0,n.useEffect)((()=>{T.lastPage&&0!==T.lastPage&&B(T.lastPage)}),[B,T.lastPage]),(0,S.jsxs)(E.A,{children:[(0,S.jsxs)(h.A,{children:[(0,S.jsx)("title",{children:(0,j.s)(V())}),(0,S.jsx)("meta",{property:"robots",content:"noindex, follow"})]}),(0,S.jsxs)("div",{className:"container margin-vert--lg",children:[(0,S.jsx)(O.A,{as:"h1",children:V()}),(0,S.jsxs)("form",{className:"row",onSubmit:e=>e.preventDefault(),children:[(0,S.jsx)("div",{className:(0,i.A)("col",w.searchQueryColumn,{"col--9":g.versioningEnabled,"col--12":!g.versioningEnabled}),children:(0,S.jsx)("input",{type:"search",name:"q",className:w.searchQueryInput,placeholder:(0,_.T)({id:"theme.SearchPage.inputPlaceholder",message:"Type your search here",description:"The placeholder for search page input"}),"aria-label":(0,_.T)({id:"theme.SearchPage.inputLabel",message:"Search",description:"The ARIA label for search page input"}),onChange:e=>b(e.target.value),value:v,autoComplete:"off",autoFocus:!0})}),c&&g.versioningEnabled&&(0,S.jsx)(A,{docsSearchVersionsHelpers:g})]}),(0,S.jsxs)("div",{className:"row",children:[(0,S.jsx)("div",{className:(0,i.A)("col","col--8",w.searchResultsColumn),children:!!T.totalResults&&p(T.totalResults)}),(0,S.jsx)("div",{className:(0,i.A)("col","col--4","text--right",w.searchLogoColumn),children:(0,S.jsx)(f.A,{to:"https://www.algolia.com/","aria-label":(0,_.T)({id:"theme.SearchPage.algoliaLabel",message:"Search by Algolia",description:"The ARIA label for Algolia mention"}),children:(0,S.jsx)("svg",{viewBox:"0 0 168 24",className:w.algoliaLogo,children:(0,S.jsxs)("g",{fill:"none",children:[(0,S.jsx)("path",{className:w.algoliaLogoPathFill,d:"M120.925 18.804c-4.386.02-4.386-3.54-4.386-4.106l-.007-13.336 2.675-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-10.846-2.18c.821 0 1.43-.047 1.855-.129v-2.719a6.334 6.334 0 0 0-1.574-.199 5.7 5.7 0 0 0-.897.069 2.699 2.699 0 0 0-.814.24c-.24.116-.439.28-.582.491-.15.212-.219.335-.219.656 0 .628.219.991.616 1.23s.938.362 1.615.362zm-.233-9.7c.883 0 1.629.109 2.231.328.602.218 1.088.525 1.444.915.363.396.609.922.76 1.483.157.56.232 1.175.232 1.85v6.874a32.5 32.5 0 0 1-1.868.314c-.834.123-1.772.185-2.813.185-.69 0-1.327-.069-1.895-.198a4.001 4.001 0 0 1-1.471-.636 3.085 3.085 0 0 1-.951-1.134c-.226-.465-.343-1.12-.343-1.803 0-.656.13-1.073.384-1.525a3.24 3.24 0 0 1 1.047-1.106c.445-.287.95-.492 1.532-.615a8.8 8.8 0 0 1 1.82-.185 8.404 8.404 0 0 1 1.972.24v-.438c0-.307-.035-.6-.11-.874a1.88 1.88 0 0 0-.384-.73 1.784 1.784 0 0 0-.724-.493 3.164 3.164 0 0 0-1.143-.205c-.616 0-1.177.075-1.69.164a7.735 7.735 0 0 0-1.26.307l-.321-2.192c.335-.117.834-.233 1.478-.349a10.98 10.98 0 0 1 2.073-.178zm52.842 9.626c.822 0 1.43-.048 1.854-.13V13.7a6.347 6.347 0 0 0-1.574-.199c-.294 0-.595.021-.896.069a2.7 2.7 0 0 0-.814.24 1.46 1.46 0 0 0-.582.491c-.15.212-.218.335-.218.656 0 .628.218.991.615 1.23.404.245.938.362 1.615.362zm-.226-9.694c.883 0 1.629.108 2.231.327.602.219 1.088.526 1.444.915.355.39.609.923.759 1.483a6.8 6.8 0 0 1 .233 1.852v6.873c-.41.088-1.034.19-1.868.314-.834.123-1.772.184-2.813.184-.69 0-1.327-.068-1.895-.198a4.001 4.001 0 0 1-1.471-.635 3.085 3.085 0 0 1-.951-1.134c-.226-.465-.343-1.12-.343-1.804 0-.656.13-1.073.384-1.524.26-.45.608-.82 1.047-1.107.445-.286.95-.491 1.532-.614a8.803 8.803 0 0 1 2.751-.13c.329.034.671.096 1.04.185v-.437a3.3 3.3 0 0 0-.109-.875 1.873 1.873 0 0 0-.384-.731 1.784 1.784 0 0 0-.724-.492 3.165 3.165 0 0 0-1.143-.205c-.616 0-1.177.075-1.69.164a7.75 7.75 0 0 0-1.26.307l-.321-2.193c.335-.116.834-.232 1.478-.348a11.633 11.633 0 0 1 2.073-.177zm-8.034-1.271a1.626 1.626 0 0 1-1.628-1.62c0-.895.725-1.62 1.628-1.62.904 0 1.63.725 1.63 1.62 0 .895-.733 1.62-1.63 1.62zm1.348 13.22h-2.689V7.27l2.69-.423v11.956zm-4.714 0c-4.386.02-4.386-3.54-4.386-4.107l-.008-13.336 2.676-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-8.698-5.903c0-1.156-.253-2.119-.746-2.788-.493-.677-1.183-1.01-2.067-1.01-.882 0-1.574.333-2.065 1.01-.493.676-.733 1.632-.733 2.788 0 1.168.246 1.953.74 2.63.492.683 1.183 1.018 2.066 1.018.882 0 1.574-.342 2.067-1.019.492-.683.738-1.46.738-2.63zm2.737-.007c0 .902-.13 1.584-.397 2.33a5.52 5.52 0 0 1-1.128 1.906 4.986 4.986 0 0 1-1.752 1.223c-.685.286-1.739.45-2.265.45-.528-.006-1.574-.157-2.252-.45a5.096 5.096 0 0 1-1.744-1.223c-.487-.527-.863-1.162-1.137-1.906a6.345 6.345 0 0 1-.41-2.33c0-.902.123-1.77.397-2.508a5.554 5.554 0 0 1 1.15-1.892 5.133 5.133 0 0 1 1.75-1.216c.679-.287 1.425-.423 2.232-.423.808 0 1.553.142 2.237.423a4.88 4.88 0 0 1 1.753 1.216 5.644 5.644 0 0 1 1.135 1.892c.287.738.431 1.606.431 2.508zm-20.138 0c0 1.12.246 2.363.738 2.882.493.52 1.13.78 1.91.78.424 0 .828-.062 1.204-.178.377-.116.677-.253.917-.417V9.33a10.476 10.476 0 0 0-1.766-.226c-.971-.028-1.71.37-2.23 1.004-.513.636-.773 1.75-.773 2.788zm7.438 5.274c0 1.824-.466 3.156-1.404 4.004-.936.846-2.367 1.27-4.296 1.27-.705 0-2.17-.137-3.34-.396l.431-2.118c.98.205 2.272.26 2.95.26 1.074 0 1.84-.219 2.299-.656.459-.437.684-1.086.684-1.948v-.437a8.07 8.07 0 0 1-1.047.397c-.43.13-.93.198-1.492.198-.739 0-1.41-.116-2.018-.349a4.206 4.206 0 0 1-1.567-1.025c-.431-.45-.774-1.017-1.013-1.694-.24-.677-.363-1.885-.363-2.773 0-.834.13-1.88.384-2.577.26-.696.629-1.298 1.129-1.796.493-.498 1.095-.881 1.8-1.162a6.605 6.605 0 0 1 2.428-.457c.87 0 1.67.109 2.45.24.78.129 1.444.265 1.985.415V18.17zM6.972 6.677v1.627c-.712-.446-1.52-.67-2.425-.67-.585 0-1.045.13-1.38.391a1.24 1.24 0 0 0-.502 1.03c0 .425.164.765.494 1.02.33.256.835.532 1.516.83.447.192.795.356 1.045.495.25.138.537.332.862.582.324.25.563.548.718.894.154.345.23.741.23 1.188 0 .947-.334 1.691-1.004 2.234-.67.542-1.537.814-2.601.814-1.18 0-2.16-.229-2.936-.686v-1.708c.84.628 1.814.942 2.92.942.585 0 1.048-.136 1.388-.407.34-.271.51-.646.51-1.125 0-.287-.1-.55-.302-.79-.203-.24-.42-.42-.655-.542-.234-.123-.585-.29-1.053-.503a61.27 61.27 0 0 1-.582-.271 13.67 13.67 0 0 1-.55-.287 4.275 4.275 0 0 1-.567-.351 6.92 6.92 0 0 1-.455-.4c-.18-.17-.31-.34-.39-.51-.08-.17-.155-.37-.224-.598a2.553 2.553 0 0 1-.104-.742c0-.915.333-1.638.998-2.17.664-.532 1.523-.798 2.576-.798.968 0 1.793.17 2.473.51zm7.468 5.696v-.287c-.022-.607-.187-1.088-.495-1.444-.309-.357-.75-.535-1.324-.535-.532 0-.99.194-1.373.583-.382.388-.622.949-.717 1.683h3.909zm1.005 2.792v1.404c-.596.34-1.383.51-2.362.51-1.255 0-2.255-.377-3-1.132-.744-.755-1.116-1.744-1.116-2.968 0-1.297.34-2.316 1.021-3.055.68-.74 1.548-1.11 2.6-1.11 1.033 0 1.852.323 2.458.966.606.644.91 1.572.91 2.784 0 .33-.033.676-.096 1.038h-5.314c.107.702.405 1.239.894 1.611.49.372 1.106.558 1.85.558.862 0 1.58-.202 2.155-.606zm6.605-1.77h-1.212c-.596 0-1.045.116-1.349.35-.303.234-.454.532-.454.894 0 .372.117.664.35.877.235.213.575.32 1.022.32.51 0 .912-.142 1.204-.424.293-.281.44-.651.44-1.108v-.91zm-4.068-2.554V9.325c.627-.361 1.457-.542 2.489-.542 2.116 0 3.175 1.026 3.175 3.08V17h-1.548v-.957c-.415.68-1.143 1.02-2.186 1.02-.766 0-1.38-.22-1.843-.661-.462-.442-.694-1.003-.694-1.684 0-.776.293-1.38.878-1.81.585-.431 1.404-.647 2.457-.647h1.34V11.8c0-.554-.133-.971-.399-1.253-.266-.282-.707-.423-1.324-.423a4.07 4.07 0 0 0-2.345.718zm9.333-1.93v1.42c.394-1 1.101-1.5 2.123-1.5.148 0 .313.016.494.048v1.531a1.885 1.885 0 0 0-.75-.143c-.542 0-.989.24-1.34.718-.351.479-.527 1.048-.527 1.707V17h-1.563V8.91h1.563zm5.01 4.084c.022.82.272 1.492.75 2.019.479.526 1.15.79 2.01.79.639 0 1.235-.176 1.788-.527v1.404c-.521.319-1.186.479-1.995.479-1.265 0-2.276-.4-3.031-1.197-.755-.798-1.133-1.792-1.133-2.984 0-1.16.38-2.151 1.14-2.975.761-.825 1.79-1.237 3.088-1.237.702 0 1.346.149 1.93.447v1.436a3.242 3.242 0 0 0-1.77-.495c-.84 0-1.513.266-2.019.798-.505.532-.758 1.213-.758 2.042zM40.24 5.72v4.579c.458-1 1.293-1.5 2.505-1.5.787 0 1.42.245 1.899.734.479.49.718 1.17.718 2.042V17h-1.564v-5.106c0-.553-.14-.98-.422-1.284-.282-.303-.652-.455-1.11-.455-.531 0-1.002.202-1.411.606-.41.405-.615 1.022-.615 1.851V17h-1.563V5.72h1.563zm14.966 10.02c.596 0 1.096-.253 1.5-.758.404-.506.606-1.157.606-1.955 0-.915-.202-1.62-.606-2.114-.404-.495-.92-.742-1.548-.742-.553 0-1.05.224-1.491.67-.442.447-.662 1.133-.662 2.058 0 .958.212 1.67.638 2.138.425.469.946.703 1.563.703zM53.004 5.72v4.42c.574-.894 1.388-1.341 2.44-1.341 1.022 0 1.857.383 2.506 1.149.649.766.973 1.781.973 3.047 0 1.138-.309 2.109-.925 2.912-.617.803-1.463 1.205-2.537 1.205-1.075 0-1.894-.447-2.457-1.34V17h-1.58V5.72h1.58zm9.908 11.104l-3.223-7.913h1.739l1.005 2.632 1.26 3.415c.096-.32.48-1.458 1.15-3.415l.909-2.632h1.66l-2.92 7.866c-.777 2.074-1.963 3.11-3.559 3.11a2.92 2.92 0 0 1-.734-.079v-1.34c.17.042.351.064.543.064 1.032 0 1.755-.57 2.17-1.708z"}),(0,S.jsx)("path",{fill:"#5468FF",d:"M78.988.938h16.594a2.968 2.968 0 0 1 2.966 2.966V20.5a2.967 2.967 0 0 1-2.966 2.964H78.988a2.967 2.967 0 0 1-2.966-2.964V3.897A2.961 2.961 0 0 1 78.988.938z"}),(0,S.jsx)("path",{fill:"white",d:"M89.632 5.967v-.772a.978.978 0 0 0-.978-.977h-2.28a.978.978 0 0 0-.978.977v.793c0 .088.082.15.171.13a7.127 7.127 0 0 1 1.984-.28c.65 0 1.295.088 1.917.259.082.02.164-.04.164-.13m-6.248 1.01l-.39-.389a.977.977 0 0 0-1.382 0l-.465.465a.973.973 0 0 0 0 1.38l.383.383c.062.061.15.047.205-.014.226-.307.472-.601.746-.874.281-.28.568-.526.883-.751.068-.042.075-.137.02-.2m4.16 2.453v3.341c0 .096.104.165.192.117l2.97-1.537c.068-.034.089-.117.055-.184a3.695 3.695 0 0 0-3.08-1.866c-.068 0-.136.054-.136.13m0 8.048a4.489 4.489 0 0 1-4.49-4.482 4.488 4.488 0 0 1 4.49-4.482 4.488 4.488 0 0 1 4.489 4.482 4.484 4.484 0 0 1-4.49 4.482m0-10.85a6.363 6.363 0 1 0 0 12.729 6.37 6.37 0 0 0 6.372-6.368 6.358 6.358 0 0 0-6.371-6.36"})]})})})})]}),T.items.length>0?(0,S.jsx)("main",{children:T.items.map(((e,t)=>{let{title:r,url:n,summary:s,breadcrumbs:a}=e;return(0,S.jsxs)("article",{className:w.searchResultItem,children:[(0,S.jsx)(O.A,{as:"h2",className:w.searchResultItemHeading,children:(0,S.jsx)(f.A,{to:n,dangerouslySetInnerHTML:{__html:r}})}),a.length>0&&(0,S.jsx)("nav",{"aria-label":"breadcrumbs",children:(0,S.jsx)("ul",{className:(0,i.A)("breadcrumbs",w.searchResultItemPath),children:a.map(((e,t)=>(0,S.jsx)("li",{className:"breadcrumbs__item",dangerouslySetInnerHTML:{__html:e}},t)))})}),s&&(0,S.jsx)("p",{className:w.searchResultItemSummary,dangerouslySetInnerHTML:{__html:s}})]},t)}))}):[v&&!T.loading&&(0,S.jsx)("p",{children:(0,S.jsx)(_.A,{id:"theme.SearchPage.noResultsText",description:"The paragraph for empty search result",children:"No results were found"})},"no-results"),!!T.loading&&(0,S.jsx)("div",{className:w.loadingSpinner},"spinner")],T.hasMore&&(0,S.jsx)("div",{className:w.loader,ref:k,children:(0,S.jsx)(_.A,{id:"theme.SearchPage.fetchingNewResults",description:"The paragraph for fetching new search results",children:"Fetching new results..."})})]})]})}function T(){return(0,S.jsx)(b.e3,{className:"search-page-wrapper",children:(0,S.jsx)(N,{})})}}}]); \ No newline at end of file diff --git a/assets/js/1a4e3797.d6bdb385.js.LICENSE.txt b/assets/js/1a4e3797.a25287f0.js.LICENSE.txt similarity index 100% rename from assets/js/1a4e3797.d6bdb385.js.LICENSE.txt rename to assets/js/1a4e3797.a25287f0.js.LICENSE.txt diff --git a/assets/js/1a4e3797.d6bdb385.js b/assets/js/1a4e3797.d6bdb385.js deleted file mode 100644 index 994c510c..00000000 --- a/assets/js/1a4e3797.d6bdb385.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see 1a4e3797.d6bdb385.js.LICENSE.txt */ -(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2138],{8181:e=>{function t(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function r(e){return"function"==typeof e}function n(e){return"object"==typeof e&&null!==e}function i(e){return void 0===e}e.exports=t,t.prototype._events=void 0,t.prototype._maxListeners=void 0,t.defaultMaxListeners=10,t.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||isNaN(e))throw TypeError("n must be a positive number");return this._maxListeners=e,this},t.prototype.emit=function(e){var t,s,a,c,o,u;if(this._events||(this._events={}),"error"===e&&(!this._events.error||n(this._events.error)&&!this._events.error.length)){if((t=arguments[1])instanceof Error)throw t;var h=new Error('Uncaught, unspecified "error" event. ('+t+")");throw h.context=t,h}if(i(s=this._events[e]))return!1;if(r(s))switch(arguments.length){case 1:s.call(this);break;case 2:s.call(this,arguments[1]);break;case 3:s.call(this,arguments[1],arguments[2]);break;default:c=Array.prototype.slice.call(arguments,1),s.apply(this,c)}else if(n(s))for(c=Array.prototype.slice.call(arguments,1),a=(u=s.slice()).length,o=0;o0&&this._events[e].length>a&&(this._events[e].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[e].length),"function"==typeof console.trace&&console.trace()),this},t.prototype.on=t.prototype.addListener,t.prototype.once=function(e,t){if(!r(t))throw TypeError("listener must be a function");var n=!1;function i(){this.removeListener(e,i),n||(n=!0,t.apply(this,arguments))}return i.listener=t,this.on(e,i),this},t.prototype.removeListener=function(e,t){var i,s,a,c;if(!r(t))throw TypeError("listener must be a function");if(!this._events||!this._events[e])return this;if(a=(i=this._events[e]).length,s=-1,i===t||r(i.listener)&&i.listener===t)delete this._events[e],this._events.removeListener&&this.emit("removeListener",e,t);else if(n(i)){for(c=a;c-- >0;)if(i[c]===t||i[c].listener&&i[c].listener===t){s=c;break}if(s<0)return this;1===i.length?(i.length=0,delete this._events[e]):i.splice(s,1),this._events.removeListener&&this.emit("removeListener",e,t)}return this},t.prototype.removeAllListeners=function(e){var t,n;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[e]&&delete this._events[e],this;if(0===arguments.length){for(t in this._events)"removeListener"!==t&&this.removeAllListeners(t);return this.removeAllListeners("removeListener"),this._events={},this}if(r(n=this._events[e]))this.removeListener(e,n);else if(n)for(;n.length;)this.removeListener(e,n[n.length-1]);return delete this._events[e],this},t.prototype.listeners=function(e){return this._events&&this._events[e]?r(this._events[e])?[this._events[e]]:this._events[e].slice():[]},t.prototype.listenerCount=function(e){if(this._events){var t=this._events[e];if(r(t))return 1;if(t)return t.length}return 0},t.listenerCount=function(e,t){return e.listenerCount(t)}},3629:(e,t,r)=>{"use strict";var n=r(3237),i=r(4341),s=r(281),a=r(9121),c=r(8861);function o(e,t,r,i){return new n(e,t,r,i)}o.version=r(4968),o.AlgoliaSearchHelper=n,o.SearchParameters=a,o.RecommendParameters=i,o.SearchResults=c,o.RecommendResults=s,e.exports=o},6178:(e,t,r)=>{"use strict";var n=r(8181);function i(e,t,r){this.main=e,this.fn=t,this.recommendFn=r,this.lastResults=null,this.lastRecommendResults=null}r(3292)(i,n),i.prototype.detach=function(){this.removeAllListeners(),this.main.detachDerivedHelper(this)},i.prototype.getModifiedState=function(e){return this.fn(e)},i.prototype.getModifiedRecommendState=function(e){return this.recommendFn(e)},e.exports=i},4341:e=>{"use strict";function t(e){e=e||{},this.params=e.params||[]}t.prototype={constructor:t,addParams:function(e){var r=this.params.slice();return r.push(e),new t({params:r})},removeParams:function(e){return new t({params:this.params.filter((function(t){return t.$$id!==e}))})},addFrequentlyBoughtTogether:function(e){return this.addParams(Object.assign({},e,{model:"bought-together"}))},addRelatedProducts:function(e){return this.addParams(Object.assign({},e,{model:"related-products"}))},addTrendingItems:function(e){return this.addParams(Object.assign({},e,{model:"trending-items"}))},addTrendingFacets:function(e){return this.addParams(Object.assign({},e,{model:"trending-facets"}))},addLookingSimilar:function(e){return this.addParams(Object.assign({},e,{model:"looking-similar"}))},_buildQueries:function(e,t){return this.params.filter((function(e){return void 0===t[e.$$id]})).map((function(t){var r=Object.assign({},t,{indexName:e});return delete r.$$id,r}))}},e.exports=t},281:e=>{"use strict";function t(e,t){this._state=e,this._rawResults={};var r=this;e.params.forEach((function(e){var n=e.$$id;r[n]=t[n],r._rawResults[n]=t[n]}))}t.prototype={constructor:t},e.exports=t},5912:(e,t,r)=>{"use strict";var n=r(3020),i=r(2655),s=r(4517),a={addRefinement:function(e,t,r){if(a.isRefined(e,t,r))return e;var i=""+r,s=e[t]?e[t].concat(i):[i],c={};return c[t]=s,n({},c,e)},removeRefinement:function(e,t,r){if(void 0===r)return a.clearRefinement(e,(function(e,r){return t===r}));var n=""+r;return a.clearRefinement(e,(function(e,r){return t===r&&n===e}))},toggleRefinement:function(e,t,r){if(void 0===r)throw new Error("toggleRefinement should be used with a value");return a.isRefined(e,t,r)?a.removeRefinement(e,t,r):a.addRefinement(e,t,r)},clearRefinement:function(e,t,r){if(void 0===t)return i(e)?{}:e;if("string"==typeof t)return s(e,[t]);if("function"==typeof t){var n=!1,a=Object.keys(e).reduce((function(i,s){var a=e[s]||[],c=a.filter((function(e){return!t(e,s,r)}));return c.length!==a.length&&(n=!0),i[s]=c,i}),{});return n?a:e}},isRefined:function(e,t,r){var n=Boolean(e[t])&&e[t].length>0;if(void 0===r||!n)return n;var i=""+r;return-1!==e[t].indexOf(i)}};e.exports=a},9121:(e,t,r)=>{"use strict";var n=r(3020),i=r(6627),s=r(6013),a=r(2446),c=r(2655),o=r(4517),u=r(3653),h=r(3610),f=r(5912);function l(e,t){return Array.isArray(e)&&Array.isArray(t)?e.length===t.length&&e.every((function(e,r){return l(t[r],e)})):e===t}function m(e){var t=e?m._parseNumbers(e):{};void 0===t.userToken||h(t.userToken)||console.warn("[algoliasearch-helper] The `userToken` parameter is invalid. This can lead to wrong analytics.\n - Format: [a-zA-Z0-9_-]{1,64}"),this.facets=t.facets||[],this.disjunctiveFacets=t.disjunctiveFacets||[],this.hierarchicalFacets=t.hierarchicalFacets||[],this.facetsRefinements=t.facetsRefinements||{},this.facetsExcludes=t.facetsExcludes||{},this.disjunctiveFacetsRefinements=t.disjunctiveFacetsRefinements||{},this.numericRefinements=t.numericRefinements||{},this.tagRefinements=t.tagRefinements||[],this.hierarchicalFacetsRefinements=t.hierarchicalFacetsRefinements||{};var r=this;Object.keys(t).forEach((function(e){var n=-1!==m.PARAMETERS.indexOf(e),i=void 0!==t[e];!n&&i&&(r[e]=t[e])}))}m.PARAMETERS=Object.keys(new m),m._parseNumbers=function(e){if(e instanceof m)return e;var t={};if(["aroundPrecision","aroundRadius","getRankingInfo","minWordSizefor2Typos","minWordSizefor1Typo","page","maxValuesPerFacet","distinct","minimumAroundRadius","hitsPerPage","minProximity"].forEach((function(r){var n=e[r];if("string"==typeof n){var i=parseFloat(n);t[r]=isNaN(i)?n:i}})),Array.isArray(e.insideBoundingBox)&&(t.insideBoundingBox=e.insideBoundingBox.map((function(e){return Array.isArray(e)?e.map((function(e){return parseFloat(e)})):e}))),e.numericRefinements){var r={};Object.keys(e.numericRefinements).forEach((function(t){var n=e.numericRefinements[t]||{};r[t]={},Object.keys(n).forEach((function(e){var i=n[e].map((function(e){return Array.isArray(e)?e.map((function(e){return"string"==typeof e?parseFloat(e):e})):"string"==typeof e?parseFloat(e):e}));r[t][e]=i}))})),t.numericRefinements=r}return a(e,t)},m.make=function(e){var t=new m(e);return(e.hierarchicalFacets||[]).forEach((function(e){if(e.rootPath){var r=t.getHierarchicalRefinement(e.name);r.length>0&&0!==r[0].indexOf(e.rootPath)&&(t=t.clearRefinements(e.name)),0===(r=t.getHierarchicalRefinement(e.name)).length&&(t=t.toggleHierarchicalFacetRefinement(e.name,e.rootPath))}})),t},m.validate=function(e,t){var r=t||{};return e.tagFilters&&r.tagRefinements&&r.tagRefinements.length>0?new Error("[Tags] Cannot switch from the managed tag API to the advanced API. It is probably an error, if it is really what you want, you should first clear the tags with clearTags method."):e.tagRefinements.length>0&&r.tagFilters?new Error("[Tags] Cannot switch from the advanced tag API to the managed API. It is probably an error, if it is not, you should first clear the tags with clearTags method."):e.numericFilters&&r.numericRefinements&&c(r.numericRefinements)?new Error("[Numeric filters] Can't switch from the advanced to the managed API. It is probably an error, if this is really what you want, you have to first clear the numeric filters."):c(e.numericRefinements)&&r.numericFilters?new Error("[Numeric filters] Can't switch from the managed API to the advanced. It is probably an error, if this is really what you want, you have to first clear the numeric filters."):null},m.prototype={constructor:m,clearRefinements:function(e){var t={numericRefinements:this._clearNumericRefinements(e),facetsRefinements:f.clearRefinement(this.facetsRefinements,e,"conjunctiveFacet"),facetsExcludes:f.clearRefinement(this.facetsExcludes,e,"exclude"),disjunctiveFacetsRefinements:f.clearRefinement(this.disjunctiveFacetsRefinements,e,"disjunctiveFacet"),hierarchicalFacetsRefinements:f.clearRefinement(this.hierarchicalFacetsRefinements,e,"hierarchicalFacet")};return t.numericRefinements===this.numericRefinements&&t.facetsRefinements===this.facetsRefinements&&t.facetsExcludes===this.facetsExcludes&&t.disjunctiveFacetsRefinements===this.disjunctiveFacetsRefinements&&t.hierarchicalFacetsRefinements===this.hierarchicalFacetsRefinements?this:this.setQueryParameters(t)},clearTags:function(){return void 0===this.tagFilters&&0===this.tagRefinements.length?this:this.setQueryParameters({tagFilters:void 0,tagRefinements:[]})},setIndex:function(e){return e===this.index?this:this.setQueryParameters({index:e})},setQuery:function(e){return e===this.query?this:this.setQueryParameters({query:e})},setPage:function(e){return e===this.page?this:this.setQueryParameters({page:e})},setFacets:function(e){return this.setQueryParameters({facets:e})},setDisjunctiveFacets:function(e){return this.setQueryParameters({disjunctiveFacets:e})},setHitsPerPage:function(e){return this.hitsPerPage===e?this:this.setQueryParameters({hitsPerPage:e})},setTypoTolerance:function(e){return this.typoTolerance===e?this:this.setQueryParameters({typoTolerance:e})},addNumericRefinement:function(e,t,r){var n=u(r);if(this.isNumericRefined(e,t,n))return this;var i=a({},this.numericRefinements);return i[e]=a({},i[e]),i[e][t]?(i[e][t]=i[e][t].slice(),i[e][t].push(n)):i[e][t]=[n],this.setQueryParameters({numericRefinements:i})},getConjunctiveRefinements:function(e){return this.isConjunctiveFacet(e)&&this.facetsRefinements[e]||[]},getDisjunctiveRefinements:function(e){return this.isDisjunctiveFacet(e)&&this.disjunctiveFacetsRefinements[e]||[]},getHierarchicalRefinement:function(e){return this.hierarchicalFacetsRefinements[e]||[]},getExcludeRefinements:function(e){return this.isConjunctiveFacet(e)&&this.facetsExcludes[e]||[]},removeNumericRefinement:function(e,t,r){var n=r;return void 0!==n?this.isNumericRefined(e,t,n)?this.setQueryParameters({numericRefinements:this._clearNumericRefinements((function(r,i){return i===e&&r.op===t&&l(r.val,u(n))}))}):this:void 0!==t?this.isNumericRefined(e,t)?this.setQueryParameters({numericRefinements:this._clearNumericRefinements((function(r,n){return n===e&&r.op===t}))}):this:this.isNumericRefined(e)?this.setQueryParameters({numericRefinements:this._clearNumericRefinements((function(t,r){return r===e}))}):this},getNumericRefinements:function(e){return this.numericRefinements[e]||{}},getNumericRefinement:function(e,t){return this.numericRefinements[e]&&this.numericRefinements[e][t]},_clearNumericRefinements:function(e){if(void 0===e)return c(this.numericRefinements)?{}:this.numericRefinements;if("string"==typeof e)return o(this.numericRefinements,[e]);if("function"==typeof e){var t=!1,r=this.numericRefinements,n=Object.keys(r).reduce((function(n,i){var s=r[i],a={};return s=s||{},Object.keys(s).forEach((function(r){var n=s[r]||[],c=[];n.forEach((function(t){e({val:t,op:r},i,"numeric")||c.push(t)})),c.length!==n.length&&(t=!0),a[r]=c})),n[i]=a,n}),{});return t?n:this.numericRefinements}},addFacet:function(e){return this.isConjunctiveFacet(e)?this:this.setQueryParameters({facets:this.facets.concat([e])})},addDisjunctiveFacet:function(e){return this.isDisjunctiveFacet(e)?this:this.setQueryParameters({disjunctiveFacets:this.disjunctiveFacets.concat([e])})},addHierarchicalFacet:function(e){if(this.isHierarchicalFacet(e.name))throw new Error("Cannot declare two hierarchical facets with the same name: `"+e.name+"`");return this.setQueryParameters({hierarchicalFacets:this.hierarchicalFacets.concat([e])})},addFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsRefinements,e,t)?this:this.setQueryParameters({facetsRefinements:f.addRefinement(this.facetsRefinements,e,t)})},addExcludeRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsExcludes,e,t)?this:this.setQueryParameters({facetsExcludes:f.addRefinement(this.facetsExcludes,e,t)})},addDisjunctiveFacetRefinement:function(e,t){if(!this.isDisjunctiveFacet(e))throw new Error(e+" is not defined in the disjunctiveFacets attribute of the helper configuration");return f.isRefined(this.disjunctiveFacetsRefinements,e,t)?this:this.setQueryParameters({disjunctiveFacetsRefinements:f.addRefinement(this.disjunctiveFacetsRefinements,e,t)})},addTagRefinement:function(e){if(this.isTagRefined(e))return this;var t={tagRefinements:this.tagRefinements.concat(e)};return this.setQueryParameters(t)},removeFacet:function(e){return this.isConjunctiveFacet(e)?this.clearRefinements(e).setQueryParameters({facets:this.facets.filter((function(t){return t!==e}))}):this},removeDisjunctiveFacet:function(e){return this.isDisjunctiveFacet(e)?this.clearRefinements(e).setQueryParameters({disjunctiveFacets:this.disjunctiveFacets.filter((function(t){return t!==e}))}):this},removeHierarchicalFacet:function(e){return this.isHierarchicalFacet(e)?this.clearRefinements(e).setQueryParameters({hierarchicalFacets:this.hierarchicalFacets.filter((function(t){return t.name!==e}))}):this},removeFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsRefinements,e,t)?this.setQueryParameters({facetsRefinements:f.removeRefinement(this.facetsRefinements,e,t)}):this},removeExcludeRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return f.isRefined(this.facetsExcludes,e,t)?this.setQueryParameters({facetsExcludes:f.removeRefinement(this.facetsExcludes,e,t)}):this},removeDisjunctiveFacetRefinement:function(e,t){if(!this.isDisjunctiveFacet(e))throw new Error(e+" is not defined in the disjunctiveFacets attribute of the helper configuration");return f.isRefined(this.disjunctiveFacetsRefinements,e,t)?this.setQueryParameters({disjunctiveFacetsRefinements:f.removeRefinement(this.disjunctiveFacetsRefinements,e,t)}):this},removeTagRefinement:function(e){if(!this.isTagRefined(e))return this;var t={tagRefinements:this.tagRefinements.filter((function(t){return t!==e}))};return this.setQueryParameters(t)},toggleRefinement:function(e,t){return this.toggleFacetRefinement(e,t)},toggleFacetRefinement:function(e,t){if(this.isHierarchicalFacet(e))return this.toggleHierarchicalFacetRefinement(e,t);if(this.isConjunctiveFacet(e))return this.toggleConjunctiveFacetRefinement(e,t);if(this.isDisjunctiveFacet(e))return this.toggleDisjunctiveFacetRefinement(e,t);throw new Error("Cannot refine the undeclared facet "+e+"; it should be added to the helper options facets, disjunctiveFacets or hierarchicalFacets")},toggleConjunctiveFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return this.setQueryParameters({facetsRefinements:f.toggleRefinement(this.facetsRefinements,e,t)})},toggleExcludeFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return this.setQueryParameters({facetsExcludes:f.toggleRefinement(this.facetsExcludes,e,t)})},toggleDisjunctiveFacetRefinement:function(e,t){if(!this.isDisjunctiveFacet(e))throw new Error(e+" is not defined in the disjunctiveFacets attribute of the helper configuration");return this.setQueryParameters({disjunctiveFacetsRefinements:f.toggleRefinement(this.disjunctiveFacetsRefinements,e,t)})},toggleHierarchicalFacetRefinement:function(e,t){if(!this.isHierarchicalFacet(e))throw new Error(e+" is not defined in the hierarchicalFacets attribute of the helper configuration");var r=this._getHierarchicalFacetSeparator(this.getHierarchicalFacetByName(e)),i={};return void 0!==this.hierarchicalFacetsRefinements[e]&&this.hierarchicalFacetsRefinements[e].length>0&&(this.hierarchicalFacetsRefinements[e][0]===t||0===this.hierarchicalFacetsRefinements[e][0].indexOf(t+r))?-1===t.indexOf(r)?i[e]=[]:i[e]=[t.slice(0,t.lastIndexOf(r))]:i[e]=[t],this.setQueryParameters({hierarchicalFacetsRefinements:n({},i,this.hierarchicalFacetsRefinements)})},addHierarchicalFacetRefinement:function(e,t){if(this.isHierarchicalFacetRefined(e))throw new Error(e+" is already refined.");if(!this.isHierarchicalFacet(e))throw new Error(e+" is not defined in the hierarchicalFacets attribute of the helper configuration.");var r={};return r[e]=[t],this.setQueryParameters({hierarchicalFacetsRefinements:n({},r,this.hierarchicalFacetsRefinements)})},removeHierarchicalFacetRefinement:function(e){if(!this.isHierarchicalFacetRefined(e))return this;var t={};return t[e]=[],this.setQueryParameters({hierarchicalFacetsRefinements:n({},t,this.hierarchicalFacetsRefinements)})},toggleTagRefinement:function(e){return this.isTagRefined(e)?this.removeTagRefinement(e):this.addTagRefinement(e)},isDisjunctiveFacet:function(e){return this.disjunctiveFacets.indexOf(e)>-1},isHierarchicalFacet:function(e){return void 0!==this.getHierarchicalFacetByName(e)},isConjunctiveFacet:function(e){return this.facets.indexOf(e)>-1},isFacetRefined:function(e,t){return!!this.isConjunctiveFacet(e)&&f.isRefined(this.facetsRefinements,e,t)},isExcludeRefined:function(e,t){return!!this.isConjunctiveFacet(e)&&f.isRefined(this.facetsExcludes,e,t)},isDisjunctiveFacetRefined:function(e,t){return!!this.isDisjunctiveFacet(e)&&f.isRefined(this.disjunctiveFacetsRefinements,e,t)},isHierarchicalFacetRefined:function(e,t){if(!this.isHierarchicalFacet(e))return!1;var r=this.getHierarchicalRefinement(e);return t?-1!==r.indexOf(t):r.length>0},isNumericRefined:function(e,t,r){if(void 0===r&&void 0===t)return Boolean(this.numericRefinements[e]);var n=this.numericRefinements[e]&&void 0!==this.numericRefinements[e][t];if(void 0===r||!n)return n;var s,a,c=u(r),o=void 0!==(s=this.numericRefinements[e][t],a=c,i(s,(function(e){return l(e,a)})));return n&&o},isTagRefined:function(e){return-1!==this.tagRefinements.indexOf(e)},getRefinedDisjunctiveFacets:function(){var e=this,t=s(Object.keys(this.numericRefinements).filter((function(t){return Object.keys(e.numericRefinements[t]).length>0})),this.disjunctiveFacets);return Object.keys(this.disjunctiveFacetsRefinements).filter((function(t){return e.disjunctiveFacetsRefinements[t].length>0})).concat(t).concat(this.getRefinedHierarchicalFacets()).sort()},getRefinedHierarchicalFacets:function(){var e=this;return s(this.hierarchicalFacets.map((function(e){return e.name})),Object.keys(this.hierarchicalFacetsRefinements).filter((function(t){return e.hierarchicalFacetsRefinements[t].length>0}))).sort()},getUnrefinedDisjunctiveFacets:function(){var e=this.getRefinedDisjunctiveFacets();return this.disjunctiveFacets.filter((function(t){return-1===e.indexOf(t)}))},managedParameters:["index","facets","disjunctiveFacets","facetsRefinements","hierarchicalFacets","facetsExcludes","disjunctiveFacetsRefinements","numericRefinements","tagRefinements","hierarchicalFacetsRefinements"],getQueryParams:function(){var e=this.managedParameters,t={},r=this;return Object.keys(this).forEach((function(n){var i=r[n];-1===e.indexOf(n)&&void 0!==i&&(t[n]=i)})),t},setQueryParameter:function(e,t){if(this[e]===t)return this;var r={};return r[e]=t,this.setQueryParameters(r)},setQueryParameters:function(e){if(!e)return this;var t=m.validate(this,e);if(t)throw t;var r=this,n=m._parseNumbers(e),i=Object.keys(this).reduce((function(e,t){return e[t]=r[t],e}),{}),s=Object.keys(n).reduce((function(e,t){var r=void 0!==e[t],i=void 0!==n[t];return r&&!i?o(e,[t]):(i&&(e[t]=n[t]),e)}),i);return new this.constructor(s)},resetPage:function(){return void 0===this.page?this:this.setPage(0)},_getHierarchicalFacetSortBy:function(e){return e.sortBy||["isRefined:desc","name:asc"]},_getHierarchicalFacetSeparator:function(e){return e.separator||" > "},_getHierarchicalRootPath:function(e){return e.rootPath||null},_getHierarchicalShowParentLevel:function(e){return"boolean"!=typeof e.showParentLevel||e.showParentLevel},getHierarchicalFacetByName:function(e){return i(this.hierarchicalFacets,(function(t){return t.name===e}))},getHierarchicalFacetBreadcrumb:function(e){if(!this.isHierarchicalFacet(e))return[];var t=this.getHierarchicalRefinement(e)[0];if(!t)return[];var r=this._getHierarchicalFacetSeparator(this.getHierarchicalFacetByName(e));return t.split(r).map((function(e){return e.trim()}))},toString:function(){return JSON.stringify(this,null,2)}},e.exports=m},3387:(e,t,r)=>{"use strict";e.exports=function(e){return function(t,r){var n=e.hierarchicalFacets[r],u=e.hierarchicalFacetsRefinements[n.name]&&e.hierarchicalFacetsRefinements[n.name][0]||"",h=e._getHierarchicalFacetSeparator(n),f=e._getHierarchicalRootPath(n),l=e._getHierarchicalShowParentLevel(n),m=s(e._getHierarchicalFacetSortBy(n)),d=t.every((function(e){return e.exhaustive})),p=function(e,t,r,n,s){return function(u,h,f){var l=u;if(f>0){var m=0;for(l=u;m{"use strict";var n=r(6999),i=r(3020),s=r(4739),a=r(6627),c=r(2055),o=r(699),u=r(2446),h=r(4191),f=s.escapeFacetValue,l=s.unescapeFacetValue,m=r(3387);function d(e){var t={};return e.forEach((function(e,r){t[e]=r})),t}function p(e,t,r){t&&t[r]&&(e.stats=t[r])}function g(e,t,r){var s=t[0];this._rawResults=t;var o=this;Object.keys(s).forEach((function(e){o[e]=s[e]}));var h=u({persistHierarchicalRootCount:!1},r);Object.keys(h).forEach((function(e){o[e]=h[e]})),this.processingTimeMS=t.reduce((function(e,t){return void 0===t.processingTimeMS?e:e+t.processingTimeMS}),0),this.disjunctiveFacets=[],this.hierarchicalFacets=e.hierarchicalFacets.map((function(){return[]})),this.facets=[];var f=e.getRefinedDisjunctiveFacets(),g=d(e.facets),v=d(e.disjunctiveFacets),y=1,R=s.facets||{};Object.keys(R).forEach((function(t){var r,n,i=R[t],u=(r=e.hierarchicalFacets,n=t,a(r,(function(e){return(e.attributes||[]).indexOf(n)>-1})));if(u){var h=u.attributes.indexOf(t),f=c(e.hierarchicalFacets,(function(e){return e.name===u.name}));o.hierarchicalFacets[f][h]={attribute:t,data:i,exhaustive:s.exhaustiveFacetsCount}}else{var l,m=-1!==e.disjunctiveFacets.indexOf(t),d=-1!==e.facets.indexOf(t);m&&(l=v[t],o.disjunctiveFacets[l]={name:t,data:i,exhaustive:s.exhaustiveFacetsCount},p(o.disjunctiveFacets[l],s.facets_stats,t)),d&&(l=g[t],o.facets[l]={name:t,data:i,exhaustive:s.exhaustiveFacetsCount},p(o.facets[l],s.facets_stats,t))}})),this.hierarchicalFacets=n(this.hierarchicalFacets),f.forEach((function(r){var n=t[y],a=n&&n.facets?n.facets:{},h=e.getHierarchicalFacetByName(r);Object.keys(a).forEach((function(t){var r,f=a[t];if(h){r=c(e.hierarchicalFacets,(function(e){return e.name===h.name}));var m=c(o.hierarchicalFacets[r],(function(e){return e.attribute===t}));if(-1===m)return;o.hierarchicalFacets[r][m].data=u({},o.hierarchicalFacets[r][m].data,f)}else{r=v[t];var d=s.facets&&s.facets[t]||{};o.disjunctiveFacets[r]={name:t,data:i({},f,d),exhaustive:n.exhaustiveFacetsCount},p(o.disjunctiveFacets[r],n.facets_stats,t),e.disjunctiveFacetsRefinements[t]&&e.disjunctiveFacetsRefinements[t].forEach((function(n){!o.disjunctiveFacets[r].data[n]&&e.disjunctiveFacetsRefinements[t].indexOf(l(n))>-1&&(o.disjunctiveFacets[r].data[n]=0)}))}})),y++})),e.getRefinedHierarchicalFacets().forEach((function(r){var n=e.getHierarchicalFacetByName(r),s=e._getHierarchicalFacetSeparator(n),a=e.getHierarchicalRefinement(r);0===a.length||a[0].split(s).length<2||t.slice(y).forEach((function(t){var r=t&&t.facets?t.facets:{};Object.keys(r).forEach((function(t){var u=r[t],h=c(e.hierarchicalFacets,(function(e){return e.name===n.name})),f=c(o.hierarchicalFacets[h],(function(e){return e.attribute===t}));if(-1!==f){var l={};if(a.length>0&&!o.persistHierarchicalRootCount){var m=a[0].split(s)[0];l[m]=o.hierarchicalFacets[h][f].data[m]}o.hierarchicalFacets[h][f].data=i(l,u,o.hierarchicalFacets[h][f].data)}})),y++}))})),Object.keys(e.facetsExcludes).forEach((function(t){var r=e.facetsExcludes[t],n=g[t];o.facets[n]={name:t,data:R[t],exhaustive:s.exhaustiveFacetsCount},r.forEach((function(e){o.facets[n]=o.facets[n]||{name:t},o.facets[n].data=o.facets[n].data||{},o.facets[n].data[e]=0}))})),this.hierarchicalFacets=this.hierarchicalFacets.map(m(e)),this.facets=n(this.facets),this.disjunctiveFacets=n(this.disjunctiveFacets),this._state=e}function v(e,t){function r(e){return e.name===t}if(e._state.isConjunctiveFacet(t)){var n=a(e.facets,r);return n?Object.keys(n.data).map((function(r){var i=f(r);return{name:r,escapedValue:i,count:n.data[r],isRefined:e._state.isFacetRefined(t,i),isExcluded:e._state.isExcludeRefined(t,r)}})):[]}if(e._state.isDisjunctiveFacet(t)){var i=a(e.disjunctiveFacets,r);return i?Object.keys(i.data).map((function(r){var n=f(r);return{name:r,escapedValue:n,count:i.data[r],isRefined:e._state.isDisjunctiveFacetRefined(t,n)}})):[]}if(e._state.isHierarchicalFacet(t)){var s=a(e.hierarchicalFacets,r);if(!s)return s;var c=e._state.getHierarchicalFacetByName(t),o=e._state._getHierarchicalFacetSeparator(c),u=l(e._state.getHierarchicalRefinement(t)[0]||"");0===u.indexOf(c.rootPath)&&(u=u.replace(c.rootPath+o,""));var h=u.split(o);return h.unshift(t),y(s,h,0),s}}function y(e,t,r){e.isRefined=e.name===(t[r]&&t[r].trim()),e.data&&e.data.forEach((function(e){y(e,t,r+1)}))}function R(e,t,r,n){if(n=n||0,Array.isArray(t))return e(t,r[n]);if(!t.data||0===t.data.length)return t;var s=t.data.map((function(t){return R(e,t,r,n+1)})),a=e(s,r[n]);return i({data:a},t)}function F(e,t){var r=a(e,(function(e){return e.name===t}));return r&&r.stats}function b(e,t,r,n,i){var s=a(i,(function(e){return e.name===r})),c=s&&s.data&&s.data[n]?s.data[n]:0,o=s&&s.exhaustive||!1;return{type:t,attributeName:r,name:n,count:c,exhaustive:o}}g.prototype.getFacetByName=function(e){function t(t){return t.name===e}return a(this.facets,t)||a(this.disjunctiveFacets,t)||a(this.hierarchicalFacets,t)},g.DEFAULT_SORT=["isRefined:desc","count:desc","name:asc"],g.prototype.getFacetValues=function(e,t){var r=v(this,e);if(r){var n,s=i({},t,{sortBy:g.DEFAULT_SORT,facetOrdering:!(t&&t.sortBy)}),a=this;if(Array.isArray(r))n=[e];else n=a._state.getHierarchicalFacetByName(r.name).attributes;return R((function(e,t){if(s.facetOrdering){var r=function(e,t){return e.renderingContent&&e.renderingContent.facetOrdering&&e.renderingContent.facetOrdering.values&&e.renderingContent.facetOrdering.values[t]}(a,t);if(r)return function(e,t){var r=[],n=[],i=(t.order||[]).reduce((function(e,t,r){return e[t]=r,e}),{});e.forEach((function(e){var t=e.path||e.name;void 0!==i[t]?r[i[t]]=e:n.push(e)})),r=r.filter((function(e){return e}));var s,a=t.sortRemainingBy;return"hidden"===a?r:(s="alpha"===a?[["path","name"],["asc","asc"]]:[["count"],["desc"]],r.concat(h(n,s[0],s[1])))}(e,r)}if(Array.isArray(s.sortBy)){var n=o(s.sortBy,g.DEFAULT_SORT);return h(e,n[0],n[1])}if("function"==typeof s.sortBy)return function(e,t){return t.sort(e)}(s.sortBy,e);throw new Error("options.sortBy is optional but if defined it must be either an array of string (predicates) or a sorting function")}),r,n)}},g.prototype.getFacetStats=function(e){return this._state.isConjunctiveFacet(e)?F(this.facets,e):this._state.isDisjunctiveFacet(e)?F(this.disjunctiveFacets,e):void 0},g.prototype.getRefinements=function(){var e=this._state,t=this,r=[];return Object.keys(e.facetsRefinements).forEach((function(n){e.facetsRefinements[n].forEach((function(i){r.push(b(e,"facet",n,i,t.facets))}))})),Object.keys(e.facetsExcludes).forEach((function(n){e.facetsExcludes[n].forEach((function(i){r.push(b(e,"exclude",n,i,t.facets))}))})),Object.keys(e.disjunctiveFacetsRefinements).forEach((function(n){e.disjunctiveFacetsRefinements[n].forEach((function(i){r.push(b(e,"disjunctive",n,i,t.disjunctiveFacets))}))})),Object.keys(e.hierarchicalFacetsRefinements).forEach((function(n){e.hierarchicalFacetsRefinements[n].forEach((function(i){r.push(function(e,t,r,n){var i=e.getHierarchicalFacetByName(t),s=e._getHierarchicalFacetSeparator(i),c=r.split(s),o=a(n,(function(e){return e.name===t})),u=c.reduce((function(e,t){var r=e&&a(e.data,(function(e){return e.name===t}));return void 0!==r?r:e}),o),h=u&&u.count||0,f=u&&u.exhaustive||!1,l=u&&u.path||"";return{type:"hierarchical",attributeName:t,name:l,count:h,exhaustive:f}}(e,n,i,t.hierarchicalFacets))}))})),Object.keys(e.numericRefinements).forEach((function(t){var n=e.numericRefinements[t];Object.keys(n).forEach((function(e){n[e].forEach((function(n){r.push({type:"numeric",attributeName:t,name:n,numericValue:n,operator:e})}))}))})),e.tagRefinements.forEach((function(e){r.push({type:"tag",attributeName:"_tags",name:e})})),r},e.exports=g},3237:(e,t,r)=>{"use strict";var n=r(8181),i=r(6178),s=r(4739).escapeFacetValue,a=r(3292),c=r(2446),o=r(2655),u=r(4517),h=r(4341),f=r(281),l=r(7442),m=r(9121),d=r(8861),p=r(1195),g=r(4968);function v(e,t,r,n){"function"==typeof e.addAlgoliaAgent&&e.addAlgoliaAgent("JS Helper ("+g+")"),this.setClient(e);var i=r||{};i.index=t,this.state=m.make(i),this.recommendState=new h({params:i.recommendState}),this.lastResults=null,this.lastRecommendResults=null,this._queryId=0,this._recommendQueryId=0,this._lastQueryIdReceived=-1,this._lastRecommendQueryIdReceived=-1,this.derivedHelpers=[],this._currentNbQueries=0,this._currentNbRecommendQueries=0,this._searchResultsOptions=n,this._recommendCache={}}function y(e){if(e<0)throw new Error("Page requested below 0.");return this._change({state:this.state.setPage(e),isPageReset:!1}),this}function R(){return this.state.page}a(v,n),v.prototype.search=function(){return this._search({onlyWithDerivedHelpers:!1}),this},v.prototype.searchOnlyWithDerivedHelpers=function(){return this._search({onlyWithDerivedHelpers:!0}),this},v.prototype.recommend=function(){return this._recommend(),this},v.prototype.getQuery=function(){var e=this.state;return l._getHitsSearchParams(e)},v.prototype.searchOnce=function(e,t){var r=e?this.state.setQueryParameters(e):this.state,n=l._getQueries(r.index,r),i=this;if(this._currentNbQueries++,this.emit("searchOnce",{state:r}),!t)return this.client.search(n).then((function(e){return i._currentNbQueries--,0===i._currentNbQueries&&i.emit("searchQueueEmpty"),{content:new d(r,e.results),state:r,_originalResponse:e}}),(function(e){throw i._currentNbQueries--,0===i._currentNbQueries&&i.emit("searchQueueEmpty"),e}));this.client.search(n).then((function(e){i._currentNbQueries--,0===i._currentNbQueries&&i.emit("searchQueueEmpty"),t(null,new d(r,e.results),r)})).catch((function(e){i._currentNbQueries--,0===i._currentNbQueries&&i.emit("searchQueueEmpty"),t(e,null,r)}))},v.prototype.findAnswers=function(e){console.warn("[algoliasearch-helper] answers is no longer supported");var t=this.state,r=this.derivedHelpers[0];if(!r)return Promise.resolve([]);var n=r.getModifiedState(t),i=c({attributesForPrediction:e.attributesForPrediction,nbHits:e.nbHits},{params:u(l._getHitsSearchParams(n),["attributesToSnippet","hitsPerPage","restrictSearchableAttributes","snippetEllipsisText"])}),s="search for answers was called, but this client does not have a function client.initIndex(index).findAnswers";if("function"!=typeof this.client.initIndex)throw new Error(s);var a=this.client.initIndex(n.index);if("function"!=typeof a.findAnswers)throw new Error(s);return a.findAnswers(n.query,e.queryLanguages,i)},v.prototype.searchForFacetValues=function(e,t,r,n){var i="function"==typeof this.client.searchForFacetValues,a="function"==typeof this.client.initIndex;if(!i&&!a&&"function"!=typeof this.client.search)throw new Error("search for facet values (searchable) was called, but this client does not have a function client.searchForFacetValues or client.initIndex(index).searchForFacetValues");var c=this.state.setQueryParameters(n||{}),o=c.isDisjunctiveFacet(e),u=l.getSearchForFacetQuery(e,t,r,c);this._currentNbQueries++;var h,f=this;return i?h=this.client.searchForFacetValues([{indexName:c.index,params:u}]):a?h=this.client.initIndex(c.index).searchForFacetValues(u):(delete u.facetName,h=this.client.search([{type:"facet",facet:e,indexName:c.index,params:u}]).then((function(e){return e.results[0]}))),this.emit("searchForFacetValues",{state:c,facet:e,query:t}),h.then((function(t){return f._currentNbQueries--,0===f._currentNbQueries&&f.emit("searchQueueEmpty"),(t=Array.isArray(t)?t[0]:t).facetHits.forEach((function(t){t.escapedValue=s(t.value),t.isRefined=o?c.isDisjunctiveFacetRefined(e,t.escapedValue):c.isFacetRefined(e,t.escapedValue)})),t}),(function(e){throw f._currentNbQueries--,0===f._currentNbQueries&&f.emit("searchQueueEmpty"),e}))},v.prototype.setQuery=function(e){return this._change({state:this.state.resetPage().setQuery(e),isPageReset:!0}),this},v.prototype.clearRefinements=function(e){return this._change({state:this.state.resetPage().clearRefinements(e),isPageReset:!0}),this},v.prototype.clearTags=function(){return this._change({state:this.state.resetPage().clearTags(),isPageReset:!0}),this},v.prototype.addDisjunctiveFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().addDisjunctiveFacetRefinement(e,t),isPageReset:!0}),this},v.prototype.addDisjunctiveRefine=function(){return this.addDisjunctiveFacetRefinement.apply(this,arguments)},v.prototype.addHierarchicalFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().addHierarchicalFacetRefinement(e,t),isPageReset:!0}),this},v.prototype.addNumericRefinement=function(e,t,r){return this._change({state:this.state.resetPage().addNumericRefinement(e,t,r),isPageReset:!0}),this},v.prototype.addFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().addFacetRefinement(e,t),isPageReset:!0}),this},v.prototype.addRefine=function(){return this.addFacetRefinement.apply(this,arguments)},v.prototype.addFacetExclusion=function(e,t){return this._change({state:this.state.resetPage().addExcludeRefinement(e,t),isPageReset:!0}),this},v.prototype.addExclude=function(){return this.addFacetExclusion.apply(this,arguments)},v.prototype.addTag=function(e){return this._change({state:this.state.resetPage().addTagRefinement(e),isPageReset:!0}),this},v.prototype.addFrequentlyBoughtTogether=function(e){return this._recommendChange({state:this.recommendState.addFrequentlyBoughtTogether(e)}),this},v.prototype.addRelatedProducts=function(e){return this._recommendChange({state:this.recommendState.addRelatedProducts(e)}),this},v.prototype.addTrendingItems=function(e){return this._recommendChange({state:this.recommendState.addTrendingItems(e)}),this},v.prototype.addTrendingFacets=function(e){return this._recommendChange({state:this.recommendState.addTrendingFacets(e)}),this},v.prototype.addLookingSimilar=function(e){return this._recommendChange({state:this.recommendState.addLookingSimilar(e)}),this},v.prototype.removeNumericRefinement=function(e,t,r){return this._change({state:this.state.resetPage().removeNumericRefinement(e,t,r),isPageReset:!0}),this},v.prototype.removeDisjunctiveFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().removeDisjunctiveFacetRefinement(e,t),isPageReset:!0}),this},v.prototype.removeDisjunctiveRefine=function(){return this.removeDisjunctiveFacetRefinement.apply(this,arguments)},v.prototype.removeHierarchicalFacetRefinement=function(e){return this._change({state:this.state.resetPage().removeHierarchicalFacetRefinement(e),isPageReset:!0}),this},v.prototype.removeFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().removeFacetRefinement(e,t),isPageReset:!0}),this},v.prototype.removeRefine=function(){return this.removeFacetRefinement.apply(this,arguments)},v.prototype.removeFacetExclusion=function(e,t){return this._change({state:this.state.resetPage().removeExcludeRefinement(e,t),isPageReset:!0}),this},v.prototype.removeExclude=function(){return this.removeFacetExclusion.apply(this,arguments)},v.prototype.removeTag=function(e){return this._change({state:this.state.resetPage().removeTagRefinement(e),isPageReset:!0}),this},v.prototype.removeFrequentlyBoughtTogether=function(e){return this._recommendChange({state:this.recommendState.removeParams(e)}),this},v.prototype.removeRelatedProducts=function(e){return this._recommendChange({state:this.recommendState.removeParams(e)}),this},v.prototype.removeTrendingItems=function(e){return this._recommendChange({state:this.recommendState.removeParams(e)}),this},v.prototype.removeTrendingFacets=function(e){return this._recommendChange({state:this.recommendState.removeParams(e)}),this},v.prototype.removeLookingSimilar=function(e){return this._recommendChange({state:this.recommendState.removeParams(e)}),this},v.prototype.toggleFacetExclusion=function(e,t){return this._change({state:this.state.resetPage().toggleExcludeFacetRefinement(e,t),isPageReset:!0}),this},v.prototype.toggleExclude=function(){return this.toggleFacetExclusion.apply(this,arguments)},v.prototype.toggleRefinement=function(e,t){return this.toggleFacetRefinement(e,t)},v.prototype.toggleFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().toggleFacetRefinement(e,t),isPageReset:!0}),this},v.prototype.toggleRefine=function(){return this.toggleFacetRefinement.apply(this,arguments)},v.prototype.toggleTag=function(e){return this._change({state:this.state.resetPage().toggleTagRefinement(e),isPageReset:!0}),this},v.prototype.nextPage=function(){var e=this.state.page||0;return this.setPage(e+1)},v.prototype.previousPage=function(){var e=this.state.page||0;return this.setPage(e-1)},v.prototype.setCurrentPage=y,v.prototype.setPage=y,v.prototype.setIndex=function(e){return this._change({state:this.state.resetPage().setIndex(e),isPageReset:!0}),this},v.prototype.setQueryParameter=function(e,t){return this._change({state:this.state.resetPage().setQueryParameter(e,t),isPageReset:!0}),this},v.prototype.setState=function(e){return this._change({state:m.make(e),isPageReset:!1}),this},v.prototype.overrideStateWithoutTriggeringChangeEvent=function(e){return this.state=new m(e),this},v.prototype.hasRefinements=function(e){return!!o(this.state.getNumericRefinements(e))||(this.state.isConjunctiveFacet(e)?this.state.isFacetRefined(e):this.state.isDisjunctiveFacet(e)?this.state.isDisjunctiveFacetRefined(e):!!this.state.isHierarchicalFacet(e)&&this.state.isHierarchicalFacetRefined(e))},v.prototype.isExcluded=function(e,t){return this.state.isExcludeRefined(e,t)},v.prototype.isDisjunctiveRefined=function(e,t){return this.state.isDisjunctiveFacetRefined(e,t)},v.prototype.hasTag=function(e){return this.state.isTagRefined(e)},v.prototype.isTagRefined=function(){return this.hasTagRefinements.apply(this,arguments)},v.prototype.getIndex=function(){return this.state.index},v.prototype.getCurrentPage=R,v.prototype.getPage=R,v.prototype.getTags=function(){return this.state.tagRefinements},v.prototype.getRefinements=function(e){var t=[];if(this.state.isConjunctiveFacet(e))this.state.getConjunctiveRefinements(e).forEach((function(e){t.push({value:e,type:"conjunctive"})})),this.state.getExcludeRefinements(e).forEach((function(e){t.push({value:e,type:"exclude"})}));else if(this.state.isDisjunctiveFacet(e)){this.state.getDisjunctiveRefinements(e).forEach((function(e){t.push({value:e,type:"disjunctive"})}))}var r=this.state.getNumericRefinements(e);return Object.keys(r).forEach((function(e){var n=r[e];t.push({value:n,operator:e,type:"numeric"})})),t},v.prototype.getNumericRefinement=function(e,t){return this.state.getNumericRefinement(e,t)},v.prototype.getHierarchicalFacetBreadcrumb=function(e){return this.state.getHierarchicalFacetBreadcrumb(e)},v.prototype._search=function(e){var t=this.state,r=[],n=[];e.onlyWithDerivedHelpers||(n=l._getQueries(t.index,t),r.push({state:t,queriesCount:n.length,helper:this}),this.emit("search",{state:t,results:this.lastResults}));var i=this.derivedHelpers.map((function(e){var n=e.getModifiedState(t),i=n.index?l._getQueries(n.index,n):[];return r.push({state:n,queriesCount:i.length,helper:e}),e.emit("search",{state:n,results:e.lastResults}),i})),s=Array.prototype.concat.apply(n,i),a=this._queryId++;if(this._currentNbQueries++,!s.length)return Promise.resolve({results:[]}).then(this._dispatchAlgoliaResponse.bind(this,r,a));try{this.client.search(s).then(this._dispatchAlgoliaResponse.bind(this,r,a)).catch(this._dispatchAlgoliaError.bind(this,a))}catch(c){this.emit("error",{error:c})}},v.prototype._recommend=function(){var e=this.state,t=this.recommendState,r=this.getIndex(),n=[{state:t,index:r,helper:this}],i=t.params.map((function(e){return e.$$id}));this.emit("fetch",{recommend:{state:t,results:this.lastRecommendResults}});var s=this._recommendCache,a=this.derivedHelpers.map((function(t){var r=t.getModifiedState(e).index;if(!r)return[];var a=t.getModifiedRecommendState(new h);return n.push({state:a,index:r,helper:t}),i=Array.prototype.concat.apply(i,a.params.map((function(e){return e.$$id}))),t.emit("fetch",{recommend:{state:a,results:t.lastRecommendResults}}),a._buildQueries(r,s)})),c=Array.prototype.concat.apply(this.recommendState._buildQueries(r,s),a);if(0!==c.length)if(c.length>0&&void 0===this.client.getRecommendations)console.warn("Please update algoliasearch/lite to the latest version in order to use recommend widgets.");else{var o=this._recommendQueryId++;this._currentNbRecommendQueries++;try{this.client.getRecommendations(c).then(this._dispatchRecommendResponse.bind(this,o,n,i)).catch(this._dispatchRecommendError.bind(this,o))}catch(u){this.emit("error",{error:u})}}},v.prototype._dispatchAlgoliaResponse=function(e,t,r){var n=this;if(!(t0},v.prototype._change=function(e){var t=e.state,r=e.isPageReset;t!==this.state&&(this.state=t,this.emit("change",{state:this.state,results:this.lastResults,isPageReset:r}))},v.prototype._recommendChange=function(e){var t=e.state;t!==this.recommendState&&(this.recommendState=t,this.emit("recommend:change",{search:{results:this.lastResults,state:this.state},recommend:{results:this.lastRecommendResults,state:this.recommendState}}))},v.prototype.clearCache=function(){return this.client.clearCache&&this.client.clearCache(),this},v.prototype.setClient=function(e){return this.client===e||("function"==typeof e.addAlgoliaAgent&&e.addAlgoliaAgent("JS Helper ("+g+")"),this.client=e),this},v.prototype.getClient=function(){return this.client},v.prototype.derive=function(e,t){var r=new i(this,e,t);return this.derivedHelpers.push(r),r},v.prototype.detachDerivedHelper=function(e){var t=this.derivedHelpers.indexOf(e);if(-1===t)throw new Error("Derived helper already detached");this.derivedHelpers.splice(t,1)},v.prototype.hasPendingRequests=function(){return this._currentNbQueries>0},e.exports=v},6999:e=>{"use strict";e.exports=function(e){return Array.isArray(e)?e.filter(Boolean):[]}},3020:e=>{"use strict";e.exports=function(){return Array.prototype.slice.call(arguments).reduceRight((function(e,t){return Object.keys(Object(t)).forEach((function(r){void 0!==t[r]&&(void 0!==e[r]&&delete e[r],e[r]=t[r])})),e}),{})}},4739:e=>{"use strict";e.exports={escapeFacetValue:function(e){return"string"!=typeof e?e:String(e).replace(/^-/,"\\-")},unescapeFacetValue:function(e){return"string"!=typeof e?e:e.replace(/^\\-/,"-")}}},6627:e=>{"use strict";e.exports=function(e,t){if(Array.isArray(e))for(var r=0;r{"use strict";e.exports=function(e,t){if(!Array.isArray(e))return-1;for(var r=0;r{e.exports=function(e){return e.reduce((function(e,t){return e.concat(t)}),[])}},699:(e,t,r)=>{"use strict";var n=r(6627);e.exports=function(e,t){var r=(t||[]).map((function(e){return e.split(":")}));return e.reduce((function(e,t){var i=t.split(":"),s=n(r,(function(e){return e[0]===i[0]}));return i.length>1||!s?(e[0].push(i[0]),e[1].push(i[1]),e):(e[0].push(s[0]),e[1].push(s[1]),e)}),[[],[]])}},3292:e=>{"use strict";e.exports=function(e,t){e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})}},6013:e=>{"use strict";e.exports=function(e,t){return e.filter((function(r,n){return t.indexOf(r)>-1&&e.indexOf(r)===n}))}},2446:e=>{"use strict";function t(e){return"function"==typeof e||Array.isArray(e)||"[object Object]"===Object.prototype.toString.call(e)}function r(e,n){if(e===n)return e;for(var i in n)if(Object.prototype.hasOwnProperty.call(n,i)&&"__proto__"!==i&&"constructor"!==i){var s=n[i],a=e[i];void 0!==a&&void 0===s||(t(a)&&t(s)?e[i]=r(a,s):e[i]="object"==typeof(c=s)&&null!==c?r(Array.isArray(c)?[]:{},c):c)}var c;return e}e.exports=function(e){t(e)||(e={});for(var n=1,i=arguments.length;n{"use strict";e.exports=function(e){return e&&Object.keys(e).length>0}},4517:e=>{"use strict";e.exports=function(e,t){if(null===e)return{};var r,n,i={},s=Object.keys(e);for(n=0;n=0||(i[r]=e[r]);return i}},4191:e=>{"use strict";function t(e,t){if(e!==t){var r=void 0!==e,n=null===e,i=void 0!==t,s=null===t;if(!s&&e>t||n&&i||!r)return 1;if(!n&&e=n.length?s:"desc"===n[i]?-s:s}return e.index-r.index})),i.map((function(e){return e.value}))}},3653:e=>{"use strict";e.exports=function e(t){if("number"==typeof t)return t;if("string"==typeof t)return parseFloat(t);if(Array.isArray(t))return t.map(e);throw new Error("The value should be a number, a parsable string or an array of those.")}},7442:(e,t,r)=>{"use strict";var n=r(2446);function i(e){return Object.keys(e).sort().reduce((function(t,r){return t[r]=e[r],t}),{})}var s={_getQueries:function(e,t){var r=[];return r.push({indexName:e,params:s._getHitsSearchParams(t)}),t.getRefinedDisjunctiveFacets().forEach((function(n){r.push({indexName:e,params:s._getDisjunctiveFacetSearchParams(t,n)})})),t.getRefinedHierarchicalFacets().forEach((function(n){var i=t.getHierarchicalFacetByName(n),a=t.getHierarchicalRefinement(n),c=t._getHierarchicalFacetSeparator(i);if(a.length>0&&a[0].split(c).length>1){var o=a[0].split(c).slice(0,-1).reduce((function(e,t,r){return e.concat({attribute:i.attributes[r],value:0===r?t:[e[e.length-1].value,t].join(c)})}),[]);o.forEach((function(n,a){var c=s._getDisjunctiveFacetSearchParams(t,n.attribute,0===a);function u(e){return i.attributes.some((function(t){return t===e.split(":")[0]}))}var h=(c.facetFilters||[]).reduce((function(e,t){if(Array.isArray(t)){var r=t.filter((function(e){return!u(e)}));r.length>0&&e.push(r)}return"string"!=typeof t||u(t)||e.push(t),e}),[]),f=o[a-1];c.facetFilters=a>0?h.concat(f.attribute+":"+f.value):h.length>0?h:void 0,r.push({indexName:e,params:c})}))}})),r},_getHitsSearchParams:function(e){var t=e.facets.concat(e.disjunctiveFacets).concat(s._getHitsHierarchicalFacetsAttributes(e)).sort(),r=s._getFacetFilters(e),a=s._getNumericFilters(e),c=s._getTagFilters(e),o={facets:t.indexOf("*")>-1?["*"]:t,tagFilters:c};return r.length>0&&(o.facetFilters=r),a.length>0&&(o.numericFilters=a),i(n({},e.getQueryParams(),o))},_getDisjunctiveFacetSearchParams:function(e,t,r){var a=s._getFacetFilters(e,t,r),c=s._getNumericFilters(e,t),o=s._getTagFilters(e),u={hitsPerPage:0,page:0,analytics:!1,clickAnalytics:!1};o.length>0&&(u.tagFilters=o);var h=e.getHierarchicalFacetByName(t);return u.facets=h?s._getDisjunctiveHierarchicalFacetAttribute(e,h,r):t,c.length>0&&(u.numericFilters=c),a.length>0&&(u.facetFilters=a),i(n({},e.getQueryParams(),u))},_getNumericFilters:function(e,t){if(e.numericFilters)return e.numericFilters;var r=[];return Object.keys(e.numericRefinements).forEach((function(n){var i=e.numericRefinements[n]||{};Object.keys(i).forEach((function(e){var s=i[e]||[];t!==n&&s.forEach((function(t){if(Array.isArray(t)){var i=t.map((function(t){return n+e+t}));r.push(i)}else r.push(n+e+t)}))}))})),r},_getTagFilters:function(e){return e.tagFilters?e.tagFilters:e.tagRefinements.join(",")},_getFacetFilters:function(e,t,r){var n=[],i=e.facetsRefinements||{};Object.keys(i).sort().forEach((function(e){(i[e]||[]).slice().sort().forEach((function(t){n.push(e+":"+t)}))}));var s=e.facetsExcludes||{};Object.keys(s).sort().forEach((function(e){(s[e]||[]).sort().forEach((function(t){n.push(e+":-"+t)}))}));var a=e.disjunctiveFacetsRefinements||{};Object.keys(a).sort().forEach((function(e){var r=a[e]||[];if(e!==t&&r&&0!==r.length){var i=[];r.slice().sort().forEach((function(t){i.push(e+":"+t)})),n.push(i)}}));var c=e.hierarchicalFacetsRefinements||{};return Object.keys(c).sort().forEach((function(i){var s=(c[i]||[])[0];if(void 0!==s){var a,o,u=e.getHierarchicalFacetByName(i),h=e._getHierarchicalFacetSeparator(u),f=e._getHierarchicalRootPath(u);if(t===i){if(-1===s.indexOf(h)||!f&&!0===r||f&&f.split(h).length===s.split(h).length)return;f?(o=f.split(h).length-1,s=f):(o=s.split(h).length-2,s=s.slice(0,s.lastIndexOf(h))),a=u.attributes[o]}else o=s.split(h).length-1,a=u.attributes[o];a&&n.push([a+":"+s])}})),n},_getHitsHierarchicalFacetsAttributes:function(e){return e.hierarchicalFacets.reduce((function(t,r){var n=e.getHierarchicalRefinement(r.name)[0];if(!n)return t.push(r.attributes[0]),t;var i=e._getHierarchicalFacetSeparator(r),s=n.split(i).length,a=r.attributes.slice(0,s+1);return t.concat(a)}),[])},_getDisjunctiveHierarchicalFacetAttribute:function(e,t,r){var n=e._getHierarchicalFacetSeparator(t);if(!0===r){var i=e._getHierarchicalRootPath(t),s=0;return i&&(s=i.split(n).length),[t.attributes[s]]}var a=(e.getHierarchicalRefinement(t.name)[0]||"").split(n).length-1;return t.attributes.slice(0,a+1)},getSearchForFacetQuery:function(e,t,r,a){var c=a.isDisjunctiveFacet(e)?a.clearRefinements(e):a,o={facetQuery:t,facetName:e};return"number"==typeof r&&(o.maxFacetHits=r),i(n({},s._getHitsSearchParams(c),o))}};e.exports=s},3610:e=>{"use strict";e.exports=function(e){return null!==e&&/^[a-zA-Z0-9_-]{1,64}$/.test(e)}},1195:(e,t,r)=>{"use strict";var n=r(6627),i=r(7359);e.exports=function(e){var t={};return e.forEach((function(e){e.forEach((function(e,r){t[e.objectID]?t[e.objectID]={indexSum:t[e.objectID].indexSum+r,count:t[e.objectID].count+1}:t[e.objectID]={indexSum:r,count:1}}))})),function(e,t){var r=[];return Object.keys(e).forEach((function(n){e[n].count<2&&(e[n].indexSum+=100),r.push({objectID:n,avgOfIndices:e[n].indexSum/t})})),r.sort((function(e,t){return e.avgOfIndices>t.avgOfIndices?1:-1}))}(t,e.length).reduce((function(t,r){var s=n(i(e),(function(e){return e.objectID===r.objectID}));return s?t.concat(s):t}),[])}},4968:e=>{"use strict";e.exports="3.21.0"},370:function(e){e.exports=function(){"use strict";function e(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function t(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function r(r){for(var n=1;n=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}function i(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){if(Symbol.iterator in Object(e)||"[object Arguments]"===Object.prototype.toString.call(e)){var r=[],n=!0,i=!1,s=void 0;try{for(var a,c=e[Symbol.iterator]();!(n=(a=c.next()).done)&&(r.push(a.value),!t||r.length!==t);n=!0);}catch(e){i=!0,s=e}finally{try{n||null==c.return||c.return()}finally{if(i)throw s}}return r}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}()}function s(e){return function(e){if(Array.isArray(e)){for(var t=0,r=new Array(e.length);t2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return Promise.resolve().then((function(){c();var t=JSON.stringify(e);return s()[t]})).then((function(e){return Promise.all([e?e.value:t(),void 0!==e])})).then((function(e){var t=i(e,2),n=t[0],s=t[1];return Promise.all([n,s||r.miss(n)])})).then((function(e){return i(e,1)[0]}))},set:function(e,t){return Promise.resolve().then((function(){var i=s();return i[JSON.stringify(e)]={timestamp:(new Date).getTime(),value:t},n().setItem(r,JSON.stringify(i)),t}))},delete:function(e){return Promise.resolve().then((function(){var t=s();delete t[JSON.stringify(e)],n().setItem(r,JSON.stringify(t))}))},clear:function(){return Promise.resolve().then((function(){n().removeItem(r)}))}}}function c(e){var t=s(e.caches),r=t.shift();return void 0===r?{get:function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return t().then((function(e){return Promise.all([e,r.miss(e)])})).then((function(e){return i(e,1)[0]}))},set:function(e,t){return Promise.resolve(t)},delete:function(e){return Promise.resolve()},clear:function(){return Promise.resolve()}}:{get:function(e,n){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return r.get(e,n,i).catch((function(){return c({caches:t}).get(e,n,i)}))},set:function(e,n){return r.set(e,n).catch((function(){return c({caches:t}).set(e,n)}))},delete:function(e){return r.delete(e).catch((function(){return c({caches:t}).delete(e)}))},clear:function(){return r.clear().catch((function(){return c({caches:t}).clear()}))}}}function o(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{serializable:!0},t={};return{get:function(r,n){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}},s=JSON.stringify(r);if(s in t)return Promise.resolve(e.serializable?JSON.parse(t[s]):t[s]);var a=n(),c=i&&i.miss||function(){return Promise.resolve()};return a.then((function(e){return c(e)})).then((function(){return a}))},set:function(r,n){return t[JSON.stringify(r)]=e.serializable?JSON.stringify(n):n,Promise.resolve(n)},delete:function(e){return delete t[JSON.stringify(e)],Promise.resolve()},clear:function(){return t={},Promise.resolve()}}}function u(e){for(var t=e.length-1;t>0;t--){var r=Math.floor(Math.random()*(t+1)),n=e[t];e[t]=e[r],e[r]=n}return e}function h(e,t){return t?(Object.keys(t).forEach((function(r){e[r]=t[r](e)})),e):e}function f(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),n=1;n0?n:void 0,timeout:r.timeout||t,headers:r.headers||{},queryParameters:r.queryParameters||{},cacheable:r.cacheable}}var d={Read:1,Write:2,Any:3},p=1,g=2,v=3;function y(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:p;return r(r({},e),{},{status:t,lastUpdate:Date.now()})}function R(e){return"string"==typeof e?{protocol:"https",url:e,accept:d.Any}:{protocol:e.protocol||"https",url:e.url,accept:e.accept||d.Any}}var F="GET",b="POST";function j(e,t){return Promise.all(t.map((function(t){return e.get(t,(function(){return Promise.resolve(y(t))}))}))).then((function(e){var r=e.filter((function(e){return function(e){return e.status===p||Date.now()-e.lastUpdate>12e4}(e)})),n=e.filter((function(e){return function(e){return e.status===v&&Date.now()-e.lastUpdate<=12e4}(e)})),i=[].concat(s(r),s(n));return{getTimeout:function(e,t){return(0===n.length&&0===e?1:n.length+3+e)*t},statelessHosts:i.length>0?i.map((function(e){return R(e)})):t}}))}function _(e,t,n,i){var a=[],c=function(e,t){if(e.method!==F&&(void 0!==e.data||void 0!==t.data)){var n=Array.isArray(e.data)?e.data:r(r({},e.data),t.data);return JSON.stringify(n)}}(n,i),o=function(e,t){var n=r(r({},e.headers),t.headers),i={};return Object.keys(n).forEach((function(e){var t=n[e];i[e.toLowerCase()]=t})),i}(e,i),u=n.method,h=n.method!==F?{}:r(r({},n.data),i.data),f=r(r(r({"x-algolia-agent":e.userAgent.value},e.queryParameters),h),i.queryParameters),l=0,m=function t(r,s){var h=r.pop();if(void 0===h)throw{name:"RetryError",message:"Unreachable hosts - your application id may be incorrect. If the error persists, contact support@algolia.com.",transporterStackTrace:O(a)};var m={data:c,headers:o,method:u,url:x(h,n.path,f),connectTimeout:s(l,e.timeouts.connect),responseTimeout:s(l,i.timeout)},d=function(e){var t={request:m,response:e,host:h,triesLeft:r.length};return a.push(t),t},p={onSuccess:function(e){return function(e){try{return JSON.parse(e.content)}catch(t){throw function(e,t){return{name:"DeserializationError",message:e,response:t}}(t.message,e)}}(e)},onRetry:function(n){var i=d(n);return n.isTimedOut&&l++,Promise.all([e.logger.info("Retryable failure",w(i)),e.hostsCache.set(h,y(h,n.isTimedOut?v:g))]).then((function(){return t(r,s)}))},onFail:function(e){throw d(e),function(e,t){var r=e.content,n=e.status,i=r;try{i=JSON.parse(r).message}catch(e){}return function(e,t,r){return{name:"ApiError",message:e,status:t,transporterStackTrace:r}}(i,n,t)}(e,O(a))}};return e.requester.send(m).then((function(e){return function(e,t){return function(e){var t=e.status;return e.isTimedOut||function(e){var t=e.isTimedOut,r=e.status;return!t&&!~~r}(e)||2!=~~(t/100)&&4!=~~(t/100)}(e)?t.onRetry(e):2==~~(e.status/100)?t.onSuccess(e):t.onFail(e)}(e,p)}))};return j(e.hostsCache,t).then((function(e){return m(s(e.statelessHosts).reverse(),e.getTimeout)}))}function P(e){var t={value:"Algolia for JavaScript (".concat(e,")"),add:function(e){var r="; ".concat(e.segment).concat(void 0!==e.version?" (".concat(e.version,")"):"");return-1===t.value.indexOf(r)&&(t.value="".concat(t.value).concat(r)),t}};return t}function x(e,t,r){var n=E(r),i="".concat(e.protocol,"://").concat(e.url,"/").concat("/"===t.charAt(0)?t.substr(1):t);return n.length&&(i+="?".concat(n)),i}function E(e){return Object.keys(e).map((function(t){return f("%s=%s",t,(r=e[t],"[object Object]"===Object.prototype.toString.call(r)||"[object Array]"===Object.prototype.toString.call(r)?JSON.stringify(e[t]):e[t]));var r})).join("&")}function O(e){return e.map((function(e){return w(e)}))}function w(e){var t=e.request.headers["x-algolia-api-key"]?{"x-algolia-api-key":"*****"}:{};return r(r({},e),{},{request:r(r({},e.request),{},{headers:r(r({},e.request.headers),t)})})}var S=function(e){var t=e.appId,n=function(e,t,r){var n={"x-algolia-api-key":r,"x-algolia-application-id":t};return{headers:function(){return e===l.WithinHeaders?n:{}},queryParameters:function(){return e===l.WithinQueryParameters?n:{}}}}(void 0!==e.authMode?e.authMode:l.WithinHeaders,t,e.apiKey),s=function(e){var t=e.hostsCache,r=e.logger,n=e.requester,s=e.requestsCache,a=e.responsesCache,c=e.timeouts,o=e.userAgent,u=e.hosts,h=e.queryParameters,f={hostsCache:t,logger:r,requester:n,requestsCache:s,responsesCache:a,timeouts:c,userAgent:o,headers:e.headers,queryParameters:h,hosts:u.map((function(e){return R(e)})),read:function(e,t){var r=m(t,f.timeouts.read),n=function(){return _(f,f.hosts.filter((function(e){return!!(e.accept&d.Read)})),e,r)};if(!0!==(void 0!==r.cacheable?r.cacheable:e.cacheable))return n();var s={request:e,mappedRequestOptions:r,transporter:{queryParameters:f.queryParameters,headers:f.headers}};return f.responsesCache.get(s,(function(){return f.requestsCache.get(s,(function(){return f.requestsCache.set(s,n()).then((function(e){return Promise.all([f.requestsCache.delete(s),e])}),(function(e){return Promise.all([f.requestsCache.delete(s),Promise.reject(e)])})).then((function(e){var t=i(e,2);return t[0],t[1]}))}))}),{miss:function(e){return f.responsesCache.set(s,e)}})},write:function(e,t){return _(f,f.hosts.filter((function(e){return!!(e.accept&d.Write)})),e,m(t,f.timeouts.write))}};return f}(r(r({hosts:[{url:"".concat(t,"-dsn.algolia.net"),accept:d.Read},{url:"".concat(t,".algolia.net"),accept:d.Write}].concat(u([{url:"".concat(t,"-1.algolianet.com")},{url:"".concat(t,"-2.algolianet.com")},{url:"".concat(t,"-3.algolianet.com")}]))},e),{},{headers:r(r(r({},n.headers()),{"content-type":"application/x-www-form-urlencoded"}),e.headers),queryParameters:r(r({},n.queryParameters()),e.queryParameters)}));return h({transporter:s,appId:t,addAlgoliaAgent:function(e,t){s.userAgent.add({segment:e,version:t})},clearCache:function(){return Promise.all([s.requestsCache.clear(),s.responsesCache.clear()]).then((function(){}))}},e.methods)},A=function(e){return function(t,r){return t.method===F?e.transporter.read(t,r):e.transporter.write(t,r)}},N=function(e){return function(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return h({transporter:e.transporter,appId:e.appId,indexName:t},r.methods)}},T=function(e){return function(t,n){var i=t.map((function(e){return r(r({},e),{},{params:E(e.params||{})})}));return e.transporter.read({method:b,path:"1/indexes/*/queries",data:{requests:i},cacheable:!0},n)}},Q=function(e){return function(t,i){return Promise.all(t.map((function(t){var s=t.params,a=s.facetName,c=s.facetQuery,o=n(s,["facetName","facetQuery"]);return N(e)(t.indexName,{methods:{searchForFacetValues:I}}).searchForFacetValues(a,c,r(r({},i),o))})))}},H=function(e){return function(t,r,n){return e.transporter.read({method:b,path:f("1/answers/%s/prediction",e.indexName),data:{query:t,queryLanguages:r},cacheable:!0},n)}},C=function(e){return function(t,r){return e.transporter.read({method:b,path:f("1/indexes/%s/query",e.indexName),data:{query:t},cacheable:!0},r)}},I=function(e){return function(t,r,n){return e.transporter.read({method:b,path:f("1/indexes/%s/facets/%s/query",e.indexName,t),data:{facetQuery:r},cacheable:!0},n)}},D=1,k=2,q=3,L=function(e){return function(t,n){var i=t.map((function(e){return r(r({},e),{},{threshold:e.threshold||0})}));return e.transporter.read({method:b,path:"1/indexes/*/recommendations",data:{requests:i},cacheable:!0},n)}};function V(e,t,n){var i,s={appId:e,apiKey:t,timeouts:{connect:1,read:2,write:30},requester:{send:function(e){return new Promise((function(t){var r=new XMLHttpRequest;r.open(e.method,e.url,!0),Object.keys(e.headers).forEach((function(t){return r.setRequestHeader(t,e.headers[t])}));var n,i=function(e,n){return setTimeout((function(){r.abort(),t({status:0,content:n,isTimedOut:!0})}),1e3*e)},s=i(e.connectTimeout,"Connection timeout");r.onreadystatechange=function(){r.readyState>r.OPENED&&void 0===n&&(clearTimeout(s),n=i(e.responseTimeout,"Socket timeout"))},r.onerror=function(){0===r.status&&(clearTimeout(s),clearTimeout(n),t({content:r.responseText||"Network request failed",status:r.status,isTimedOut:!1}))},r.onload=function(){clearTimeout(s),clearTimeout(n),t({content:r.responseText,status:r.status,isTimedOut:!1})},r.send(e.data)}))}},logger:(i=q,{debug:function(e,t){return D>=i&&console.debug(e,t),Promise.resolve()},info:function(e,t){return k>=i&&console.info(e,t),Promise.resolve()},error:function(e,t){return console.error(e,t),Promise.resolve()}}),responsesCache:o(),requestsCache:o({serializable:!1}),hostsCache:c({caches:[a({key:"".concat("4.23.3","-").concat(e)}),o()]}),userAgent:P("4.23.3").add({segment:"Browser",version:"lite"}),authMode:l.WithinQueryParameters};return S(r(r(r({},s),n),{},{methods:{search:T,searchForFacetValues:Q,multipleQueries:T,multipleSearchForFacetValues:Q,customRequest:A,initIndex:function(e){return function(t){return N(e)(t,{methods:{search:C,searchForFacetValues:I,findAnswers:H}})}},getRecommendations:L}}))}return V.version="4.23.3",V}()},7920:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>T});var n=r(758),i=r(3526),s=r(3629),a=r.n(s),c=r(370),o=r.n(c),u=r(9902),h=r(5463),f=r(8257),l=r(2907),m=r(8765);const d=["zero","one","two","few","many","other"];function p(e){return d.filter((t=>e.includes(t)))}const g={locale:"en",pluralForms:p(["one","other"]),select:e=>1===e?"one":"other"};function v(){const{i18n:{currentLocale:e}}=(0,m.A)();return(0,n.useMemo)((()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:p(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),g}}),[e])}function y(){const e=v();return{selectMessage:(t,r)=>function(e,t,r){const n=e.split("|");if(1===n.length)return n[0];n.length>r.pluralForms.length&&console.error(`For locale=${r.locale}, a maximum of ${r.pluralForms.length} plural forms are expected (${r.pluralForms.join(",")}), but the message contains ${n.length}: ${e}`);const i=r.select(t),s=r.pluralForms.indexOf(i);return n[Math.min(s,n.length-1)]}(r,t,e)}}var R=r(2062),F=r(1495),b=r(2667),j=r(4574),_=r(7706),P=r(8923),x=r(9447),E=r(8013),O=r(9663);const w={searchQueryInput:"searchQueryInput_B20W",searchVersionInput:"searchVersionInput_XKiE",searchResultsColumn:"searchResultsColumn_uKu3",algoliaLogo:"algoliaLogo_uTtI",algoliaLogoPathFill:"algoliaLogoPathFill_XheT",searchResultItem:"searchResultItem_BQ4N",searchResultItemHeading:"searchResultItemHeading_Ix7K",searchResultItemPath:"searchResultItemPath_4_jz",searchResultItemSummary:"searchResultItemSummary_qv9c",searchQueryColumn:"searchQueryColumn_N3Rm",searchVersionColumn:"searchVersionColumn_SjMe",searchLogoColumn:"searchLogoColumn_QOW7",loadingSpinner:"loadingSpinner_qN0K","loading-spin":"loading-spin_Pikw",loader:"loader_JTMt"};var S=r(6070);function A(e){let{docsSearchVersionsHelpers:t}=e;const r=Object.entries(t.allDocsData).filter((e=>{let[,t]=e;return t.versions.length>1}));return(0,S.jsx)("div",{className:(0,i.A)("col","col--3","padding-left--none",w.searchVersionColumn),children:r.map((e=>{let[n,i]=e;const s=r.length>1?`${n}: `:"";return(0,S.jsx)("select",{onChange:e=>t.setSearchVersion(n,e.target.value),defaultValue:t.searchVersions[n],className:w.searchVersionInput,children:i.versions.map(((e,t)=>(0,S.jsx)("option",{label:`${s}${e.label}`,value:e.name},t)))},n)}))})}function N(){const{i18n:{currentLocale:e}}=(0,m.A)(),{algolia:{appId:t,apiKey:r,indexName:s,contextualSearch:c}}=(0,P.c)(),d=(0,x.C)(),p=function(){const{selectMessage:e}=y();return t=>e(t,(0,_.T)({id:"theme.SearchPage.documentsFound.plurals",description:'Pluralized label for "{count} documents found". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One document found|{count} documents found"},{count:t}))}(),g=function(){const e=(0,l.Gy)(),[t,r]=(0,n.useState)((()=>Object.entries(e).reduce(((e,t)=>{let[r,n]=t;return{...e,[r]:n.versions[0].name}}),{}))),i=Object.values(e).some((e=>e.versions.length>1));return{allDocsData:e,versioningEnabled:i,searchVersions:t,setSearchVersion:(e,t)=>r((r=>({...r,[e]:t})))}}(),[v,b]=(0,R.b)(),N={items:[],query:null,totalResults:null,totalPages:null,lastPage:null,hasMore:null,loading:null},[T,Q]=(0,n.useReducer)(((e,t)=>{switch(t.type){case"reset":return N;case"loading":return{...e,loading:!0};case"update":return v!==t.value.query?e:{...t.value,items:0===t.value.lastPage?t.value.items:e.items.concat(t.value.items)};case"advance":{const t=e.totalPages>e.lastPage+1;return{...e,lastPage:t?e.lastPage+1:e.lastPage,hasMore:t}}default:return e}}),N),H=c?["language","docusaurus_tag"]:[],C=o()(t,r),I=a()(C,s,{hitsPerPage:15,advancedSyntax:!0,disjunctiveFacets:H});I.on("result",(e=>{let{results:{query:t,hits:r,page:n,nbHits:i,nbPages:s}}=e;if(""===t||!Array.isArray(r))return void Q({type:"reset"});const a=e=>e.replace(/algolia-docsearch-suggestion--highlight/g,"search-result-match"),c=r.map((e=>{let{url:t,_highlightResult:{hierarchy:r},_snippetResult:n={}}=e;const i=Object.keys(r).map((e=>a(r[e].value)));return{title:i.pop(),url:d(t),summary:n.content?`${a(n.content.value)}...`:"",breadcrumbs:i}}));Q({type:"update",value:{items:c,query:t,totalResults:i,totalPages:s,lastPage:n,hasMore:s>n+1,loading:!1}})}));const[D,k]=(0,n.useState)(null),q=(0,n.useRef)(0),L=(0,n.useRef)(u.A.canUseIntersectionObserver&&new IntersectionObserver((e=>{const{isIntersecting:t,boundingClientRect:{y:r}}=e[0];t&&q.current>r&&Q({type:"advance"}),q.current=r}),{threshold:1})),V=()=>v?(0,_.T)({id:"theme.SearchPage.existingResultsTitle",message:'Search results for "{query}"',description:"The search page title for non-empty query"},{query:v}):(0,_.T)({id:"theme.SearchPage.emptyResultsTitle",message:"Search the documentation",description:"The search page title for empty query"}),B=(0,F._q)((function(t){void 0===t&&(t=0),c&&(I.addDisjunctiveFacetRefinement("docusaurus_tag","default"),I.addDisjunctiveFacetRefinement("language",e),Object.entries(g.searchVersions).forEach((e=>{let[t,r]=e;I.addDisjunctiveFacetRefinement("docusaurus_tag",`docs-${t}-${r}`)}))),I.setQuery(v).setPage(t).search()}));return(0,n.useEffect)((()=>{if(!D)return;const e=L.current;return e?(e.observe(D),()=>e.unobserve(D)):()=>!0}),[D]),(0,n.useEffect)((()=>{Q({type:"reset"}),v&&(Q({type:"loading"}),setTimeout((()=>{B()}),300))}),[v,g.searchVersions,B]),(0,n.useEffect)((()=>{T.lastPage&&0!==T.lastPage&&B(T.lastPage)}),[B,T.lastPage]),(0,S.jsxs)(E.A,{children:[(0,S.jsxs)(h.A,{children:[(0,S.jsx)("title",{children:(0,j.s)(V())}),(0,S.jsx)("meta",{property:"robots",content:"noindex, follow"})]}),(0,S.jsxs)("div",{className:"container margin-vert--lg",children:[(0,S.jsx)(O.A,{as:"h1",children:V()}),(0,S.jsxs)("form",{className:"row",onSubmit:e=>e.preventDefault(),children:[(0,S.jsx)("div",{className:(0,i.A)("col",w.searchQueryColumn,{"col--9":g.versioningEnabled,"col--12":!g.versioningEnabled}),children:(0,S.jsx)("input",{type:"search",name:"q",className:w.searchQueryInput,placeholder:(0,_.T)({id:"theme.SearchPage.inputPlaceholder",message:"Type your search here",description:"The placeholder for search page input"}),"aria-label":(0,_.T)({id:"theme.SearchPage.inputLabel",message:"Search",description:"The ARIA label for search page input"}),onChange:e=>b(e.target.value),value:v,autoComplete:"off",autoFocus:!0})}),c&&g.versioningEnabled&&(0,S.jsx)(A,{docsSearchVersionsHelpers:g})]}),(0,S.jsxs)("div",{className:"row",children:[(0,S.jsx)("div",{className:(0,i.A)("col","col--8",w.searchResultsColumn),children:!!T.totalResults&&p(T.totalResults)}),(0,S.jsx)("div",{className:(0,i.A)("col","col--4","text--right",w.searchLogoColumn),children:(0,S.jsx)(f.A,{to:"https://www.algolia.com/","aria-label":(0,_.T)({id:"theme.SearchPage.algoliaLabel",message:"Search by Algolia",description:"The ARIA label for Algolia mention"}),children:(0,S.jsx)("svg",{viewBox:"0 0 168 24",className:w.algoliaLogo,children:(0,S.jsxs)("g",{fill:"none",children:[(0,S.jsx)("path",{className:w.algoliaLogoPathFill,d:"M120.925 18.804c-4.386.02-4.386-3.54-4.386-4.106l-.007-13.336 2.675-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-10.846-2.18c.821 0 1.43-.047 1.855-.129v-2.719a6.334 6.334 0 0 0-1.574-.199 5.7 5.7 0 0 0-.897.069 2.699 2.699 0 0 0-.814.24c-.24.116-.439.28-.582.491-.15.212-.219.335-.219.656 0 .628.219.991.616 1.23s.938.362 1.615.362zm-.233-9.7c.883 0 1.629.109 2.231.328.602.218 1.088.525 1.444.915.363.396.609.922.76 1.483.157.56.232 1.175.232 1.85v6.874a32.5 32.5 0 0 1-1.868.314c-.834.123-1.772.185-2.813.185-.69 0-1.327-.069-1.895-.198a4.001 4.001 0 0 1-1.471-.636 3.085 3.085 0 0 1-.951-1.134c-.226-.465-.343-1.12-.343-1.803 0-.656.13-1.073.384-1.525a3.24 3.24 0 0 1 1.047-1.106c.445-.287.95-.492 1.532-.615a8.8 8.8 0 0 1 1.82-.185 8.404 8.404 0 0 1 1.972.24v-.438c0-.307-.035-.6-.11-.874a1.88 1.88 0 0 0-.384-.73 1.784 1.784 0 0 0-.724-.493 3.164 3.164 0 0 0-1.143-.205c-.616 0-1.177.075-1.69.164a7.735 7.735 0 0 0-1.26.307l-.321-2.192c.335-.117.834-.233 1.478-.349a10.98 10.98 0 0 1 2.073-.178zm52.842 9.626c.822 0 1.43-.048 1.854-.13V13.7a6.347 6.347 0 0 0-1.574-.199c-.294 0-.595.021-.896.069a2.7 2.7 0 0 0-.814.24 1.46 1.46 0 0 0-.582.491c-.15.212-.218.335-.218.656 0 .628.218.991.615 1.23.404.245.938.362 1.615.362zm-.226-9.694c.883 0 1.629.108 2.231.327.602.219 1.088.526 1.444.915.355.39.609.923.759 1.483a6.8 6.8 0 0 1 .233 1.852v6.873c-.41.088-1.034.19-1.868.314-.834.123-1.772.184-2.813.184-.69 0-1.327-.068-1.895-.198a4.001 4.001 0 0 1-1.471-.635 3.085 3.085 0 0 1-.951-1.134c-.226-.465-.343-1.12-.343-1.804 0-.656.13-1.073.384-1.524.26-.45.608-.82 1.047-1.107.445-.286.95-.491 1.532-.614a8.803 8.803 0 0 1 2.751-.13c.329.034.671.096 1.04.185v-.437a3.3 3.3 0 0 0-.109-.875 1.873 1.873 0 0 0-.384-.731 1.784 1.784 0 0 0-.724-.492 3.165 3.165 0 0 0-1.143-.205c-.616 0-1.177.075-1.69.164a7.75 7.75 0 0 0-1.26.307l-.321-2.193c.335-.116.834-.232 1.478-.348a11.633 11.633 0 0 1 2.073-.177zm-8.034-1.271a1.626 1.626 0 0 1-1.628-1.62c0-.895.725-1.62 1.628-1.62.904 0 1.63.725 1.63 1.62 0 .895-.733 1.62-1.63 1.62zm1.348 13.22h-2.689V7.27l2.69-.423v11.956zm-4.714 0c-4.386.02-4.386-3.54-4.386-4.107l-.008-13.336 2.676-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-8.698-5.903c0-1.156-.253-2.119-.746-2.788-.493-.677-1.183-1.01-2.067-1.01-.882 0-1.574.333-2.065 1.01-.493.676-.733 1.632-.733 2.788 0 1.168.246 1.953.74 2.63.492.683 1.183 1.018 2.066 1.018.882 0 1.574-.342 2.067-1.019.492-.683.738-1.46.738-2.63zm2.737-.007c0 .902-.13 1.584-.397 2.33a5.52 5.52 0 0 1-1.128 1.906 4.986 4.986 0 0 1-1.752 1.223c-.685.286-1.739.45-2.265.45-.528-.006-1.574-.157-2.252-.45a5.096 5.096 0 0 1-1.744-1.223c-.487-.527-.863-1.162-1.137-1.906a6.345 6.345 0 0 1-.41-2.33c0-.902.123-1.77.397-2.508a5.554 5.554 0 0 1 1.15-1.892 5.133 5.133 0 0 1 1.75-1.216c.679-.287 1.425-.423 2.232-.423.808 0 1.553.142 2.237.423a4.88 4.88 0 0 1 1.753 1.216 5.644 5.644 0 0 1 1.135 1.892c.287.738.431 1.606.431 2.508zm-20.138 0c0 1.12.246 2.363.738 2.882.493.52 1.13.78 1.91.78.424 0 .828-.062 1.204-.178.377-.116.677-.253.917-.417V9.33a10.476 10.476 0 0 0-1.766-.226c-.971-.028-1.71.37-2.23 1.004-.513.636-.773 1.75-.773 2.788zm7.438 5.274c0 1.824-.466 3.156-1.404 4.004-.936.846-2.367 1.27-4.296 1.27-.705 0-2.17-.137-3.34-.396l.431-2.118c.98.205 2.272.26 2.95.26 1.074 0 1.84-.219 2.299-.656.459-.437.684-1.086.684-1.948v-.437a8.07 8.07 0 0 1-1.047.397c-.43.13-.93.198-1.492.198-.739 0-1.41-.116-2.018-.349a4.206 4.206 0 0 1-1.567-1.025c-.431-.45-.774-1.017-1.013-1.694-.24-.677-.363-1.885-.363-2.773 0-.834.13-1.88.384-2.577.26-.696.629-1.298 1.129-1.796.493-.498 1.095-.881 1.8-1.162a6.605 6.605 0 0 1 2.428-.457c.87 0 1.67.109 2.45.24.78.129 1.444.265 1.985.415V18.17zM6.972 6.677v1.627c-.712-.446-1.52-.67-2.425-.67-.585 0-1.045.13-1.38.391a1.24 1.24 0 0 0-.502 1.03c0 .425.164.765.494 1.02.33.256.835.532 1.516.83.447.192.795.356 1.045.495.25.138.537.332.862.582.324.25.563.548.718.894.154.345.23.741.23 1.188 0 .947-.334 1.691-1.004 2.234-.67.542-1.537.814-2.601.814-1.18 0-2.16-.229-2.936-.686v-1.708c.84.628 1.814.942 2.92.942.585 0 1.048-.136 1.388-.407.34-.271.51-.646.51-1.125 0-.287-.1-.55-.302-.79-.203-.24-.42-.42-.655-.542-.234-.123-.585-.29-1.053-.503a61.27 61.27 0 0 1-.582-.271 13.67 13.67 0 0 1-.55-.287 4.275 4.275 0 0 1-.567-.351 6.92 6.92 0 0 1-.455-.4c-.18-.17-.31-.34-.39-.51-.08-.17-.155-.37-.224-.598a2.553 2.553 0 0 1-.104-.742c0-.915.333-1.638.998-2.17.664-.532 1.523-.798 2.576-.798.968 0 1.793.17 2.473.51zm7.468 5.696v-.287c-.022-.607-.187-1.088-.495-1.444-.309-.357-.75-.535-1.324-.535-.532 0-.99.194-1.373.583-.382.388-.622.949-.717 1.683h3.909zm1.005 2.792v1.404c-.596.34-1.383.51-2.362.51-1.255 0-2.255-.377-3-1.132-.744-.755-1.116-1.744-1.116-2.968 0-1.297.34-2.316 1.021-3.055.68-.74 1.548-1.11 2.6-1.11 1.033 0 1.852.323 2.458.966.606.644.91 1.572.91 2.784 0 .33-.033.676-.096 1.038h-5.314c.107.702.405 1.239.894 1.611.49.372 1.106.558 1.85.558.862 0 1.58-.202 2.155-.606zm6.605-1.77h-1.212c-.596 0-1.045.116-1.349.35-.303.234-.454.532-.454.894 0 .372.117.664.35.877.235.213.575.32 1.022.32.51 0 .912-.142 1.204-.424.293-.281.44-.651.44-1.108v-.91zm-4.068-2.554V9.325c.627-.361 1.457-.542 2.489-.542 2.116 0 3.175 1.026 3.175 3.08V17h-1.548v-.957c-.415.68-1.143 1.02-2.186 1.02-.766 0-1.38-.22-1.843-.661-.462-.442-.694-1.003-.694-1.684 0-.776.293-1.38.878-1.81.585-.431 1.404-.647 2.457-.647h1.34V11.8c0-.554-.133-.971-.399-1.253-.266-.282-.707-.423-1.324-.423a4.07 4.07 0 0 0-2.345.718zm9.333-1.93v1.42c.394-1 1.101-1.5 2.123-1.5.148 0 .313.016.494.048v1.531a1.885 1.885 0 0 0-.75-.143c-.542 0-.989.24-1.34.718-.351.479-.527 1.048-.527 1.707V17h-1.563V8.91h1.563zm5.01 4.084c.022.82.272 1.492.75 2.019.479.526 1.15.79 2.01.79.639 0 1.235-.176 1.788-.527v1.404c-.521.319-1.186.479-1.995.479-1.265 0-2.276-.4-3.031-1.197-.755-.798-1.133-1.792-1.133-2.984 0-1.16.38-2.151 1.14-2.975.761-.825 1.79-1.237 3.088-1.237.702 0 1.346.149 1.93.447v1.436a3.242 3.242 0 0 0-1.77-.495c-.84 0-1.513.266-2.019.798-.505.532-.758 1.213-.758 2.042zM40.24 5.72v4.579c.458-1 1.293-1.5 2.505-1.5.787 0 1.42.245 1.899.734.479.49.718 1.17.718 2.042V17h-1.564v-5.106c0-.553-.14-.98-.422-1.284-.282-.303-.652-.455-1.11-.455-.531 0-1.002.202-1.411.606-.41.405-.615 1.022-.615 1.851V17h-1.563V5.72h1.563zm14.966 10.02c.596 0 1.096-.253 1.5-.758.404-.506.606-1.157.606-1.955 0-.915-.202-1.62-.606-2.114-.404-.495-.92-.742-1.548-.742-.553 0-1.05.224-1.491.67-.442.447-.662 1.133-.662 2.058 0 .958.212 1.67.638 2.138.425.469.946.703 1.563.703zM53.004 5.72v4.42c.574-.894 1.388-1.341 2.44-1.341 1.022 0 1.857.383 2.506 1.149.649.766.973 1.781.973 3.047 0 1.138-.309 2.109-.925 2.912-.617.803-1.463 1.205-2.537 1.205-1.075 0-1.894-.447-2.457-1.34V17h-1.58V5.72h1.58zm9.908 11.104l-3.223-7.913h1.739l1.005 2.632 1.26 3.415c.096-.32.48-1.458 1.15-3.415l.909-2.632h1.66l-2.92 7.866c-.777 2.074-1.963 3.11-3.559 3.11a2.92 2.92 0 0 1-.734-.079v-1.34c.17.042.351.064.543.064 1.032 0 1.755-.57 2.17-1.708z"}),(0,S.jsx)("path",{fill:"#5468FF",d:"M78.988.938h16.594a2.968 2.968 0 0 1 2.966 2.966V20.5a2.967 2.967 0 0 1-2.966 2.964H78.988a2.967 2.967 0 0 1-2.966-2.964V3.897A2.961 2.961 0 0 1 78.988.938z"}),(0,S.jsx)("path",{fill:"white",d:"M89.632 5.967v-.772a.978.978 0 0 0-.978-.977h-2.28a.978.978 0 0 0-.978.977v.793c0 .088.082.15.171.13a7.127 7.127 0 0 1 1.984-.28c.65 0 1.295.088 1.917.259.082.02.164-.04.164-.13m-6.248 1.01l-.39-.389a.977.977 0 0 0-1.382 0l-.465.465a.973.973 0 0 0 0 1.38l.383.383c.062.061.15.047.205-.014.226-.307.472-.601.746-.874.281-.28.568-.526.883-.751.068-.042.075-.137.02-.2m4.16 2.453v3.341c0 .096.104.165.192.117l2.97-1.537c.068-.034.089-.117.055-.184a3.695 3.695 0 0 0-3.08-1.866c-.068 0-.136.054-.136.13m0 8.048a4.489 4.489 0 0 1-4.49-4.482 4.488 4.488 0 0 1 4.49-4.482 4.488 4.488 0 0 1 4.489 4.482 4.484 4.484 0 0 1-4.49 4.482m0-10.85a6.363 6.363 0 1 0 0 12.729 6.37 6.37 0 0 0 6.372-6.368 6.358 6.358 0 0 0-6.371-6.36"})]})})})})]}),T.items.length>0?(0,S.jsx)("main",{children:T.items.map(((e,t)=>{let{title:r,url:n,summary:s,breadcrumbs:a}=e;return(0,S.jsxs)("article",{className:w.searchResultItem,children:[(0,S.jsx)(O.A,{as:"h2",className:w.searchResultItemHeading,children:(0,S.jsx)(f.A,{to:n,dangerouslySetInnerHTML:{__html:r}})}),a.length>0&&(0,S.jsx)("nav",{"aria-label":"breadcrumbs",children:(0,S.jsx)("ul",{className:(0,i.A)("breadcrumbs",w.searchResultItemPath),children:a.map(((e,t)=>(0,S.jsx)("li",{className:"breadcrumbs__item",dangerouslySetInnerHTML:{__html:e}},t)))})}),s&&(0,S.jsx)("p",{className:w.searchResultItemSummary,dangerouslySetInnerHTML:{__html:s}})]},t)}))}):[v&&!T.loading&&(0,S.jsx)("p",{children:(0,S.jsx)(_.A,{id:"theme.SearchPage.noResultsText",description:"The paragraph for empty search result",children:"No results were found"})},"no-results"),!!T.loading&&(0,S.jsx)("div",{className:w.loadingSpinner},"spinner")],T.hasMore&&(0,S.jsx)("div",{className:w.loader,ref:k,children:(0,S.jsx)(_.A,{id:"theme.SearchPage.fetchingNewResults",description:"The paragraph for fetching new search results",children:"Fetching new results..."})})]})]})}function T(){return(0,S.jsx)(b.e3,{className:"search-page-wrapper",children:(0,S.jsx)(N,{})})}}}]); \ No newline at end of file diff --git a/assets/js/22e91f41.c7724825.js b/assets/js/22e91f41.0428db43.js similarity index 97% rename from assets/js/22e91f41.c7724825.js rename to assets/js/22e91f41.0428db43.js index 4f585a87..82f27718 100644 --- a/assets/js/22e91f41.c7724825.js +++ b/assets/js/22e91f41.0428db43.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[317],{8799:(e,o,r)=>{r.r(o),r.d(o,{assets:()=>a,contentTitle:()=>n,default:()=>u,frontMatter:()=>i,metadata:()=>c,toc:()=>p});var s=r(6070),t=r(5710);const i={id:"rock-paper-scissors",title:"Rock Paper Scissors"},n=void 0,c={id:"explore/awesome-projects/rock-paper-scissors",title:"Rock Paper Scissors",description:"A popular game we all know and love, but this time played online and enforcing complete security using the commit - reveal scheme. After you pick your choice of either rock, paper or scissors, you encrypt your choice with a password. This ensures the other player can\u2019t see your choice. After your opponent has also decided, it is time to reveal your password and determine the winner. You cannot change your mind between choosing and revealing because your choice is locked with the special password. This prevents any bad actors from changing their minds in the middle of the game.Have fun with a classic game that is completely fair and private! Explore the source code on GitHub repository",source:"@site/docs/01-explore/06-awesome-projects/02-rock-paper-scissors.mdx",sourceDirName:"01-explore/06-awesome-projects",slug:"/explore/awesome-projects/rock-paper-scissors",permalink:"/explore/awesome-projects/rock-paper-scissors",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718634626e3,sidebarPosition:2,frontMatter:{id:"rock-paper-scissors",title:"Rock Paper Scissors"},sidebar:"tutorialSidebar",previous:{title:"Only Peers",permalink:"/explore/awesome-projects/only-peers"},next:{title:"Terminology",permalink:"/learn/terminology"}},a={},p=[];function l(e){const o={a:"a",p:"p",...(0,t.R)(),...e.components};return(0,s.jsxs)(o.p,{children:["A popular game we all know and love, but this time played online and enforcing complete security using the commit - reveal scheme. After you pick your choice of either rock, paper or scissors, you encrypt your choice with a password. This ensures the other player can\u2019t see your choice. After your opponent has also decided, it is time to reveal your password and determine the winner. You cannot change your mind between choosing and revealing because your choice is locked with the special password. This prevents any bad actors from changing their minds in the middle of the game.Have fun with a classic game that is completely fair and private! Explore the source code on ",(0,s.jsx)(o.a,{href:"https://github.com/calimero-network/rock-paper-scissors-ui",children:"GitHub repository"})]})}function u(e={}){const{wrapper:o}={...(0,t.R)(),...e.components};return o?(0,s.jsx)(o,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},5710:(e,o,r)=>{r.d(o,{R:()=>n,x:()=>c});var s=r(758);const t={},i=s.createContext(t);function n(e){const o=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function c(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:n(e.components),s.createElement(i.Provider,{value:o},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[317],{8799:(e,o,r)=>{r.r(o),r.d(o,{assets:()=>a,contentTitle:()=>n,default:()=>u,frontMatter:()=>i,metadata:()=>c,toc:()=>p});var s=r(6070),t=r(5710);const i={id:"rock-paper-scissors",title:"Rock Paper Scissors"},n=void 0,c={id:"explore/awesome-projects/rock-paper-scissors",title:"Rock Paper Scissors",description:"A popular game we all know and love, but this time played online and enforcing complete security using the commit - reveal scheme. After you pick your choice of either rock, paper or scissors, you encrypt your choice with a password. This ensures the other player can\u2019t see your choice. After your opponent has also decided, it is time to reveal your password and determine the winner. You cannot change your mind between choosing and revealing because your choice is locked with the special password. This prevents any bad actors from changing their minds in the middle of the game.Have fun with a classic game that is completely fair and private! Explore the source code on GitHub repository",source:"@site/docs/01-explore/06-awesome-projects/02-rock-paper-scissors.mdx",sourceDirName:"01-explore/06-awesome-projects",slug:"/explore/awesome-projects/rock-paper-scissors",permalink:"/explore/awesome-projects/rock-paper-scissors",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718723446e3,sidebarPosition:2,frontMatter:{id:"rock-paper-scissors",title:"Rock Paper Scissors"},sidebar:"tutorialSidebar",previous:{title:"Only Peers",permalink:"/explore/awesome-projects/only-peers"},next:{title:"Terminology",permalink:"/learn/terminology"}},a={},p=[];function l(e){const o={a:"a",p:"p",...(0,t.R)(),...e.components};return(0,s.jsxs)(o.p,{children:["A popular game we all know and love, but this time played online and enforcing complete security using the commit - reveal scheme. After you pick your choice of either rock, paper or scissors, you encrypt your choice with a password. This ensures the other player can\u2019t see your choice. After your opponent has also decided, it is time to reveal your password and determine the winner. You cannot change your mind between choosing and revealing because your choice is locked with the special password. This prevents any bad actors from changing their minds in the middle of the game.Have fun with a classic game that is completely fair and private! Explore the source code on ",(0,s.jsx)(o.a,{href:"https://github.com/calimero-network/rock-paper-scissors-ui",children:"GitHub repository"})]})}function u(e={}){const{wrapper:o}={...(0,t.R)(),...e.components};return o?(0,s.jsx)(o,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},5710:(e,o,r)=>{r.d(o,{R:()=>n,x:()=>c});var s=r(758);const t={},i=s.createContext(t);function n(e){const o=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function c(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:n(e.components),s.createElement(i.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/2b77e7d3.c520d366.js b/assets/js/2b77e7d3.0579b1f4.js similarity index 99% rename from assets/js/2b77e7d3.c520d366.js rename to assets/js/2b77e7d3.0579b1f4.js index d0922a85..e88f15be 100644 --- a/assets/js/2b77e7d3.c520d366.js +++ b/assets/js/2b77e7d3.0579b1f4.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2802],{8522:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>s,metadata:()=>a,toc:()=>c});var i=t(6070),r=t(5710);const s={id:"protocol-rs-sdk",title:"Rust Protocol SDK"},o=void 0,a={id:"build/protocol-sdks/protocol-rs-sdk",title:"Rust Protocol SDK",description:"Getting Started with Calimero SDK for Rust",source:"@site/docs/03-build/01-protocol-sdks/02-protocol-rs-sdk.mdx",sourceDirName:"03-build/01-protocol-sdks",slug:"/build/protocol-sdks/protocol-rs-sdk",permalink:"/build/protocol-sdks/protocol-rs-sdk",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718634626e3,sidebarPosition:2,frontMatter:{id:"protocol-rs-sdk",title:"Rust Protocol SDK"},sidebar:"tutorialSidebar",previous:{title:"Protocol SDK",permalink:"/build/protocol-sdks/protocol-sdk"},next:{title:"TypeScript Client SDK",permalink:"/build/client-sdks/client-ts-sdk"}},l={},c=[{value:"Getting Started with Calimero SDK for Rust",id:"getting-started-with-calimero-sdk-for-rust",level:2},{value:"Prerequisites",id:"prerequisites",level:3},{value:"Setting Up Your Project",id:"setting-up-your-project",level:3},{value:"Writing Your Application",id:"writing-your-application",level:3},{value:"Building Your Application",id:"building-your-application",level:3},{value:"Deploying Your Application",id:"deploying-your-application",level:3},{value:"Writing Efficient Code with Calimero SDK",id:"writing-efficient-code-with-calimero-sdk",level:3},{value:"Handling Errors with Calimero SDK",id:"handling-errors-with-calimero-sdk",level:3},{value:"Emitting Events with Calimero SDK",id:"emitting-events-with-calimero-sdk",level:3},{value:"Ensuring Atomicity and Event Reliability in Calimero Applications",id:"ensuring-atomicity-and-event-reliability-in-calimero-applications",level:3},{value:"Atomic State Changes",id:"atomic-state-changes",level:4},{value:"Reliable Event Emission",id:"reliable-event-emission",level:4},{value:"Local-First Efficiency: No Network Overhead for Read-Only Calls",id:"local-first-efficiency-no-network-overhead-for-read-only-calls",level:3},{value:"Conclusion",id:"conclusion",level:3}];function d(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",h4:"h4",p:"p",pre:"pre",...(0,r.R)(),...e.components},{Details:t}=n;return t||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h2,{id:"getting-started-with-calimero-sdk-for-rust",children:"Getting Started with Calimero SDK for Rust"}),"\n",(0,i.jsx)(n.p,{children:"The Calimero SDK for Rust empowers developers to build applications that compile to WebAssembly (Wasm) and run securely within the Calimero virtual machine (VM). This guide will walk you through setting up a Rust project using the Calimero SDK, writing an application, and preparing it for deployment."}),"\n",(0,i.jsx)(n.h3,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,i.jsxs)(n.p,{children:["Before you begin, ensure you have Rust installed on your system. If not, follow the official Rust installation guide for your platform: ",(0,i.jsx)(n.a,{href:"https://www.rust-lang.org/tools/install",children:"Rust Installation Guide"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["You should ensure you have the ",(0,i.jsx)(n.code,{children:"wasm32-unknown-unknown"})," target installed. Run the following command in your terminal to install the target:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:'title="Terminal"',children:"rustup target add wasm32-unknown-unknown\n"})}),"\n",(0,i.jsx)(n.h3,{id:"setting-up-your-project",children:"Setting Up Your Project"}),"\n",(0,i.jsx)(n.p,{children:"To create a new project, initialize a Rust library project using Cargo. Run the following command in your terminal:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:'title="Terminal"',children:"cargo new --lib kv-store\n"})}),"\n",(0,i.jsx)(n.p,{children:"You should have a tree that looks like this:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:'title="Terminal"',children:"$ tree kv-store\nkv-store\n\u251c\u2500\u2500 Cargo.toml\n\u2514\u2500\u2500 src\n \u2514\u2500\u2500 lib.rs\n\n2 directories, 2 files\n"})}),"\n",(0,i.jsxs)(n.p,{children:["At this point, we can ",(0,i.jsx)(n.code,{children:"cd"})," into the ",(0,i.jsx)(n.code,{children:"kv-store"})," directory:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:'title="Terminal"',children:"cd kv-store\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Next, you need to specify the crate-type as ",(0,i.jsx)(n.code,{children:"cdylib"})," in your ",(0,i.jsx)(n.code,{children:"Cargo.toml"})," file to generate a dynamic library that can be compiled to Wasm:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-toml",metastring:'title="File: Cargo.toml"',children:'[lib]\ncrate-type = ["cdylib"]\n'})}),"\n",(0,i.jsxs)(n.p,{children:["You can now configure your project to use the Calimero SDK by adding it as a dependency in your ",(0,i.jsx)(n.code,{children:"Cargo.toml"})," file:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-toml",metastring:'title="File: Cargo.toml"',children:'[dependencies]\ncalimero-sdk = { git = "https://github.com/calimero-network/core" }\n'})}),"\n",(0,i.jsx)(n.p,{children:"Then, we need to specify a custom build profile for the most compact Wasm output:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-toml",metastring:'title="File: Cargo.toml"',children:'[profile.app-release]\ninherits = "release"\ncodegen-units = 1\nopt-level = "z"\nlto = true\ndebug = false\npanic = "abort"\noverflow-checks = true\n'})}),"\n",(0,i.jsxs)(t,{children:[(0,i.jsxs)("summary",{children:[" Your ",(0,i.jsx)(n.code,{children:"Cargo.toml"})," file should now look like this "]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-toml",metastring:'title="File: Cargo.toml" showLineNumbers',children:'[package]\nname = "kv-store"\nversion = "0.1.0"\nedition = "2021"\n\n# highlight-start\n[lib]\ncrate-type = ["cdylib"]\n# highlight-end\n\n# highlight-start\n[dependencies]\ncalimero-sdk = { git = "https://github.com/calimero-network/core" }\n# highlight-end\n\n# highlight-start\n[profile.app-release]\ninherits = "release"\ncodegen-units = 1\nopt-level = "z"\nlto = true\ndebug = false\npanic = "abort"\noverflow-checks = true\n# highlight-end\n'})})]}),"\n",(0,i.jsxs)(n.p,{children:["And finally, create a ",(0,i.jsx)(n.code,{children:"build.sh"})," script to compile your application into Wasm format, for example:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:'title="File: build.sh" showLineNumbers',children:'#!/bin/bash\nset -e\n\ncd "$(dirname $0)"\n\nTARGET="${CARGO_TARGET_DIR:-../../target}"\n\nrustup target add wasm32-unknown-unknown\n\ncargo build --target wasm32-unknown-unknown --profile app-release\n\nmkdir -p res\n\ncp $TARGET/wasm32-unknown-unknown/app-release/kv_store.wasm ./res/\n'})}),"\n",(0,i.jsxs)(n.p,{children:["You can optionally choose to install and use ",(0,i.jsx)(n.a,{href:"https://github.com/WebAssembly/binaryen",children:(0,i.jsx)(n.code,{children:"wasm-opt"})}),", for an additional optimization step in the build script. This step is not required but can help reduce the size of the generated Wasm file:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:'title="File: build.sh"',children:"if command -v wasm-opt > /dev/null; then\n wasm-opt -Oz ./res/kv_store.wasm -o ./res/kv_store.wasm\nfi\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Don't forget to make the ",(0,i.jsx)(n.code,{children:"build.sh"})," script executable:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:'title="Terminal"',children:"chmod +x build.sh\n"})}),"\n",(0,i.jsx)(n.p,{children:"At this point, your project structure should look like this:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:'title="Terminal"',children:"$ tree\n.\n\u251c\u2500\u2500 Cargo.toml\n\u251c\u2500\u2500 build.sh\n\u2514\u2500\u2500 src\n \u2514\u2500\u2500 lib.rs\n\n2 directories, 3 files\n"})}),"\n",(0,i.jsx)(n.h3,{id:"writing-your-application",children:"Writing Your Application"}),"\n",(0,i.jsxs)(n.p,{children:["Now, let's create a simple key-value store application using the Calimero SDK. Start by defining your application logic in ",(0,i.jsx)(n.code,{children:"lib.rs"}),":"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",metastring:'title="File: src/lib.rs" showLineNumbers',children:'use calimero_sdk::borsh::{BorshDeserialize, BorshSerialize};\nuse calimero_sdk::app;\n\n#[app::state]\n#[derive(Default, BorshSerialize, BorshDeserialize)]\n#[borsh(crate = "calimero_sdk::borsh")]\nstruct KvStore {}\n\n#[app::logic]\nimpl KvStore {}\n'})}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"KvStore"})," struct represents the state of your application, which will be borsh-encoded in the app-scoped state partition on the node's storage. The ",(0,i.jsx)(n.code,{children:"#[app::state]"})," attribute macro marks the struct as the application state, permitting its use by Calimero SDK."]}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"#[app::logic]"})," attribute macro marks the implementation block as the application logic, allowing you to define the methods that interact with the application state."]}),"\n",(0,i.jsxs)(n.p,{children:["Consider a method like ",(0,i.jsx)(n.code,{children:"get"})," that retrieves a value from the key-value store:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"pub fn get(&self, key: &str) -> Option<&str> {\n // Snip...\n}\n"})}),"\n",(0,i.jsxs)(n.p,{children:["The inputs must be deserializable from the transaction data, and the output must be serializable to the response data. The ",(0,i.jsx)(n.code,{children:"Option"})," type is used to represent the possibility of the key not being present in the store."]}),"\n",(0,i.jsx)(n.p,{children:"And now, here's a complete example of a key-value store application:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",metastring:'title="File: src/lib.rs" showLineNumbers',children:'use std::collections::HashMap;\n\nuse calimero_sdk::borsh::{BorshDeserialize, BorshSerialize};\nuse calimero_sdk::{app, env};\n\n#[app::state]\n#[derive(Default, BorshSerialize, BorshDeserialize)]\nstruct KvStore {\n entries: HashMap,\n}\n\n#[app::logic]\nimpl KvStore {\n // highlight-start\n pub fn set(&mut self, key: String, value: String) {\n env::log(&format!("Setting key: {:?} to value: {:?}", key, value));\n\n self.entries.insert(key, value);\n }\n // highlight-end\n\n // highlight-start\n pub fn entries(&self) -> &HashMap {\n env::log("Getting all entries");\n\n &self.entries\n }\n // highlight-end\n\n // highlight-start\n pub fn get(&self, key: &str) -> Option<&str> {\n env::log(&format!("Getting key: {:?}", key));\n\n self.entries.get(key).map(|v| v.as_str())\n }\n // highlight-end\n\n // highlight-start\n pub fn remove(&mut self, key: &str) -> Option {\n env::log(&format!("Removing key: {:?}", key));\n\n self.entries.remove(key)\n }\n // highlight-end\n}\n'})}),"\n",(0,i.jsx)(n.h3,{id:"building-your-application",children:"Building Your Application"}),"\n",(0,i.jsxs)(n.p,{children:["Once your application logic is defined, run the ",(0,i.jsx)(n.code,{children:"./build.sh"})," script to compile your application into Wasm format. This script will generate ",(0,i.jsx)(n.code,{children:"kv_store.wasm"})," in the ",(0,i.jsx)(n.code,{children:"res"})," folder of your application."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:'title="Terminal"',children:"$ ./build.sh\ninfo: component 'rust-std' for target 'wasm32-unknown-unknown' is up to date\n # Snip...\n Compiling calimero-sdk v0.1.0\n Compiling kv-store v0.1.0 (/apps/kv-store)\n Finished `app-release` profile [optimized] target(s) in 1.20s\n\n$ tree\n.\n\u251c\u2500\u2500 Cargo.toml\n\u251c\u2500\u2500 build.sh\n\u251c\u2500\u2500 res\n\u2502\xa0\xa0 \u2514\u2500\u2500 kv_store.wasm\n\u2514\u2500\u2500 src\n \u2514\u2500\u2500 lib.rs\n\n3 directories, 4 files\n"})}),"\n",(0,i.jsx)(n.h3,{id:"deploying-your-application",children:"Deploying Your Application"}),"\n",(0,i.jsxs)(n.p,{children:["After successfully building your application, you can upload the compiled ",(0,i.jsx)(n.code,{children:"kv_store.wasm"})," to the registry for use by a live Calimero node."]}),"\n",(0,i.jsx)(n.h3,{id:"writing-efficient-code-with-calimero-sdk",children:"Writing Efficient Code with Calimero SDK"}),"\n",(0,i.jsx)(n.p,{children:"In the following code snippet:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",metastring:'title="File: src/lib.rs"',children:"pub fn get(&self, key: &str) -> Option<&str> {\n // Snip...\n}\n"})}),"\n",(0,i.jsx)(n.p,{children:"you'll notice that we prioritize using references instead of owned values. This approach optimizes performance and memory usage by minimizing unnecessary data copying."}),"\n",(0,i.jsxs)(n.p,{children:["For input parameters, such as ",(0,i.jsx)(n.code,{children:"&str"})," and ",(0,i.jsx)(n.code,{children:"&[u8]"}),", utilizing references allows you to avoid unnecessary copying of data. Similarly, for output values, you can return references to data that live as long as ",(0,i.jsx)(n.code,{children:"&self"})," or any of the input parameters. By doing so, you reduce memory overhead and improve the overall efficiency of your application."]}),"\n",(0,i.jsx)(n.p,{children:"By returning a reference to the value associated with the provided key instead of cloning the entire value, you ensure efficient memory usage and enhance the performance of your application."}),"\n",(0,i.jsx)(n.h3,{id:"handling-errors-with-calimero-sdk",children:"Handling Errors with Calimero SDK"}),"\n",(0,i.jsxs)(n.p,{children:["When designing methods that may potentially fail, it's recommended to return a ",(0,i.jsx)(n.code,{children:"Result"})," type with an error variant representing the possible failure cases. This enables you to handle errors more effectively and communicate error conditions to users of your application. As opposed to panicking which would only return a string message, using ",(0,i.jsx)(n.code,{children:"Result"})," allows you to provide a structured error type with additional context."]}),"\n",(0,i.jsxs)(n.p,{children:["First, let's define an error type ",(0,i.jsx)(n.code,{children:"Error<'a>"})," with a lifetime tied to the key ",(0,i.jsx)(n.code,{children:"&'a str"}),":"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",metastring:'title="File: src/lib.rs"',children:"use calimero_sdk::serde::Serialize;\n\n#[derive(Debug, Serialize)]\npub enum Error<'a> {\n NotFound(&'a str),\n // Add more error variants as needed\n}\n"})}),"\n",(0,i.jsxs)(n.p,{children:["In the above definition, ",(0,i.jsx)(n.code,{children:"Error"})," represents the possible error variants that may occur during the execution of your method. Each variant can carry additional data to provide context about the error condition."]}),"\n",(0,i.jsxs)(n.p,{children:["Next, let's modify the ",(0,i.jsx)(n.code,{children:"get"})," method to return a ",(0,i.jsx)(n.code,{children:"Result"})," with ",(0,i.jsx)(n.code,{children:"Error"})," as the error type:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",metastring:'title="File: src/lib.rs"',children:"pub fn get<'a>(&self, key: &'a str) -> Result<&'a str, Error<'a>> {\n match self.entries.get(key) {\n Some(value) => Ok(value),\n None => Err(Error::NotFound(key)),\n }\n}\n"})}),"\n",(0,i.jsxs)(n.p,{children:["In the ",(0,i.jsx)(n.code,{children:"get"})," method, we return ",(0,i.jsx)(n.code,{children:"Ok(value)"})," if the key exists in the key-value store, and ",(0,i.jsx)(n.code,{children:"Err(Error::NotFound(key))"})," if the key is not found. This allows callers of the method to handle the possibility of the key not being present in the store."]}),"\n",(0,i.jsxs)(n.p,{children:["Additionally, ensure that the ",(0,i.jsx)(n.code,{children:"Error"})," type is serializable by implementing (or deriving) the ",(0,i.jsx)(n.code,{children:"Serialize"})," trait, as shown in the definition above. This enables errors to be encoded in a structured format when returned as part of a call error."]}),"\n",(0,i.jsx)(n.p,{children:"By following this approach, you can handle errors more gracefully and provide meaningful feedback to users of your Calimero application."}),"\n",(0,i.jsx)(n.h3,{id:"emitting-events-with-calimero-sdk",children:"Emitting Events with Calimero SDK"}),"\n",(0,i.jsxs)(n.p,{children:["To facilitate real-time monitoring of state transitions within your Calimero application, you can emit events using the ",(0,i.jsx)(n.code,{children:"app::emit!"})," macro provided by the Calimero SDK. Event emission is particularly useful for handling live state transitions triggered by other actors, allowing subscribed clients to receive immediate updates about relevant actions."]}),"\n",(0,i.jsxs)(n.p,{children:["Let's focus on emitting events for mutating calls, specifically ",(0,i.jsx)(n.code,{children:"set"})," and ",(0,i.jsx)(n.code,{children:"remove"})," methods:"]}),"\n",(0,i.jsxs)(n.p,{children:["First, define your custom events using the ",(0,i.jsx)(n.code,{children:"#[app::event]"})," proc macro. In this example, we'll define events for setting a new key-value pair (",(0,i.jsx)(n.code,{children:"Inserted"}),"), updating an existing value (",(0,i.jsx)(n.code,{children:"Updated"}),"), and removing a key-value pair (",(0,i.jsx)(n.code,{children:"Removed"}),"):"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",metastring:'title="File: src/lib.rs"',children:"use calimero_sdk::app;\n\n#[app::event]\npub enum Event<'a> {\n Inserted { key: &'a str, value: &'a str },\n Updated { key: &'a str, value: &'a str },\n Removed { key: &'a str },\n}\n"})}),"\n",(0,i.jsx)(n.p,{children:"Each event variant can carry additional data to provide context about the event."}),"\n",(0,i.jsx)(n.p,{children:"Now, you need to associate the event with the application logic by annotating the application state."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",metastring:'title="File: src/lib.rs"',children:"#[app::state(emits = for<'a> Event<'a>)]\n#[derive(Default, BorshSerialize, BorshDeserialize)]\nstruct KvStore {\n // Snip...\n}\n"})}),"\n",(0,i.jsxs)(n.p,{children:["And finally, within your application logic methods, emit events using the ",(0,i.jsx)(n.code,{children:"app::emit!"})," macro:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",metastring:'title="File: src/lib.rs"',children:"use std::collections::hash_map::Entry;\n\npub fn set(&mut self, key: String, value: String) {\n match self.items.entry(key) {\n Entry::Occupied(mut entry) => {\n app::emit!(Event::Updated {\n key: entry.key(),\n value: &value,\n });\n entry.insert(value);\n }\n Entry::Vacant(entry) => {\n app::emit!(Event::Inserted {\n key: entry.key(),\n value: &value,\n });\n entry.insert(value);\n }\n }\n}\n\npub fn remove(&mut self, key: &str) -> Result {\n app::emit!(Event::Removed { key });\n\n self.entries.remove(key).ok_or_else(|| Error::NotFound(key))\n}\n"})}),"\n",(0,i.jsx)(n.p,{children:"In each method, we emit the corresponding event with relevant data. This allows external observers to react to these events and take appropriate actions."}),"\n",(0,i.jsx)(n.p,{children:"By emitting events, you can ensure connected clients receive real-time updates about state transitions within your Calimero application, enabling them to respond to changes as they occur."}),"\n",(0,i.jsx)(n.h3,{id:"ensuring-atomicity-and-event-reliability-in-calimero-applications",children:"Ensuring Atomicity and Event Reliability in Calimero Applications"}),"\n",(0,i.jsx)(n.p,{children:"In Calimero applications, ensuring atomicity of state changes and reliability of event emission is crucial for maintaining data consistency and facilitating reliable communication between actors. Here's how atomicity and event reliability are enforced:"}),"\n",(0,i.jsx)(n.h4,{id:"atomic-state-changes",children:"Atomic State Changes"}),"\n",(0,i.jsxs)(n.p,{children:["When a method call fails, whether due to panics or returning an ",(0,i.jsx)(n.code,{children:"Err"}),", all state changes made up to that point are discarded. This ensures that if an operation cannot be completed successfully, the application's state remains consistent and unaffected by partial updates. By enforcing atomicity, Calimero promotes data integrity and prevents inconsistencies that may arise from incomplete transactions."]}),"\n",(0,i.jsx)(n.h4,{id:"reliable-event-emission",children:"Reliable Event Emission"}),"\n",(0,i.jsx)(n.p,{children:"Similarly, event emission in Calimero applications is tied to the successful execution of transactions. Events are only relayed when a transaction has been successfully executed, ensuring that external observers receive updates about state changes reliably. By linking event emission to transaction execution, Calimero guarantees that event notifications accurately reflect the application's current state, enhancing the reliability and consistency of communication between actors."}),"\n",(0,i.jsx)(n.p,{children:"This also means it doesn't matter if the event emission is done before or after the state change, as the event will only be emitted if the state change is successful."}),"\n",(0,i.jsx)(n.p,{children:"By adhering to these principles of atomicity and event reliability, Calimero applications maintain data integrity and enable robust interaction between different components, facilitating the development of secure and dependable decentralized systems."}),"\n",(0,i.jsx)(n.h3,{id:"local-first-efficiency-no-network-overhead-for-read-only-calls",children:"Local-First Efficiency: No Network Overhead for Read-Only Calls"}),"\n",(0,i.jsx)(n.p,{children:"In Calimero, adherence to the local-first principle eliminates the need for network communication in read-only calls. Since read-only operations don't modify the state, there's no associated network overhead. This local-first approach streamlines data access, promoting efficient and responsive application performance without unnecessary network activity."}),"\n",(0,i.jsx)(n.h3,{id:"conclusion",children:"Conclusion"}),"\n",(0,i.jsx)(n.p,{children:"You've now learned how to set up a Rust project using the Calimero SDK, write a simple application, build it into Wasm, and prepare it for deployment. Experiment with different features and functionalities to create powerful and secure applications with Calimero."}),"\n",(0,i.jsx)(n.p,{children:"Happy coding! \ud83d\ude80"})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},5710:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>a});var i=t(758);const r={},s=i.createContext(r);function o(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2802],{8522:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>s,metadata:()=>a,toc:()=>c});var i=t(6070),r=t(5710);const s={id:"protocol-rs-sdk",title:"Rust Protocol SDK"},o=void 0,a={id:"build/protocol-sdks/protocol-rs-sdk",title:"Rust Protocol SDK",description:"Getting Started with Calimero SDK for Rust",source:"@site/docs/03-build/01-protocol-sdks/02-protocol-rs-sdk.mdx",sourceDirName:"03-build/01-protocol-sdks",slug:"/build/protocol-sdks/protocol-rs-sdk",permalink:"/build/protocol-sdks/protocol-rs-sdk",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718723446e3,sidebarPosition:2,frontMatter:{id:"protocol-rs-sdk",title:"Rust Protocol SDK"},sidebar:"tutorialSidebar",previous:{title:"Protocol SDK",permalink:"/build/protocol-sdks/protocol-sdk"},next:{title:"TypeScript Client SDK",permalink:"/build/client-sdks/client-ts-sdk"}},l={},c=[{value:"Getting Started with Calimero SDK for Rust",id:"getting-started-with-calimero-sdk-for-rust",level:2},{value:"Prerequisites",id:"prerequisites",level:3},{value:"Setting Up Your Project",id:"setting-up-your-project",level:3},{value:"Writing Your Application",id:"writing-your-application",level:3},{value:"Building Your Application",id:"building-your-application",level:3},{value:"Deploying Your Application",id:"deploying-your-application",level:3},{value:"Writing Efficient Code with Calimero SDK",id:"writing-efficient-code-with-calimero-sdk",level:3},{value:"Handling Errors with Calimero SDK",id:"handling-errors-with-calimero-sdk",level:3},{value:"Emitting Events with Calimero SDK",id:"emitting-events-with-calimero-sdk",level:3},{value:"Ensuring Atomicity and Event Reliability in Calimero Applications",id:"ensuring-atomicity-and-event-reliability-in-calimero-applications",level:3},{value:"Atomic State Changes",id:"atomic-state-changes",level:4},{value:"Reliable Event Emission",id:"reliable-event-emission",level:4},{value:"Local-First Efficiency: No Network Overhead for Read-Only Calls",id:"local-first-efficiency-no-network-overhead-for-read-only-calls",level:3},{value:"Conclusion",id:"conclusion",level:3}];function d(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",h4:"h4",p:"p",pre:"pre",...(0,r.R)(),...e.components},{Details:t}=n;return t||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h2,{id:"getting-started-with-calimero-sdk-for-rust",children:"Getting Started with Calimero SDK for Rust"}),"\n",(0,i.jsx)(n.p,{children:"The Calimero SDK for Rust empowers developers to build applications that compile to WebAssembly (Wasm) and run securely within the Calimero virtual machine (VM). This guide will walk you through setting up a Rust project using the Calimero SDK, writing an application, and preparing it for deployment."}),"\n",(0,i.jsx)(n.h3,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,i.jsxs)(n.p,{children:["Before you begin, ensure you have Rust installed on your system. If not, follow the official Rust installation guide for your platform: ",(0,i.jsx)(n.a,{href:"https://www.rust-lang.org/tools/install",children:"Rust Installation Guide"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["You should ensure you have the ",(0,i.jsx)(n.code,{children:"wasm32-unknown-unknown"})," target installed. Run the following command in your terminal to install the target:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:'title="Terminal"',children:"rustup target add wasm32-unknown-unknown\n"})}),"\n",(0,i.jsx)(n.h3,{id:"setting-up-your-project",children:"Setting Up Your Project"}),"\n",(0,i.jsx)(n.p,{children:"To create a new project, initialize a Rust library project using Cargo. Run the following command in your terminal:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:'title="Terminal"',children:"cargo new --lib kv-store\n"})}),"\n",(0,i.jsx)(n.p,{children:"You should have a tree that looks like this:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:'title="Terminal"',children:"$ tree kv-store\nkv-store\n\u251c\u2500\u2500 Cargo.toml\n\u2514\u2500\u2500 src\n \u2514\u2500\u2500 lib.rs\n\n2 directories, 2 files\n"})}),"\n",(0,i.jsxs)(n.p,{children:["At this point, we can ",(0,i.jsx)(n.code,{children:"cd"})," into the ",(0,i.jsx)(n.code,{children:"kv-store"})," directory:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:'title="Terminal"',children:"cd kv-store\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Next, you need to specify the crate-type as ",(0,i.jsx)(n.code,{children:"cdylib"})," in your ",(0,i.jsx)(n.code,{children:"Cargo.toml"})," file to generate a dynamic library that can be compiled to Wasm:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-toml",metastring:'title="File: Cargo.toml"',children:'[lib]\ncrate-type = ["cdylib"]\n'})}),"\n",(0,i.jsxs)(n.p,{children:["You can now configure your project to use the Calimero SDK by adding it as a dependency in your ",(0,i.jsx)(n.code,{children:"Cargo.toml"})," file:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-toml",metastring:'title="File: Cargo.toml"',children:'[dependencies]\ncalimero-sdk = { git = "https://github.com/calimero-network/core" }\n'})}),"\n",(0,i.jsx)(n.p,{children:"Then, we need to specify a custom build profile for the most compact Wasm output:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-toml",metastring:'title="File: Cargo.toml"',children:'[profile.app-release]\ninherits = "release"\ncodegen-units = 1\nopt-level = "z"\nlto = true\ndebug = false\npanic = "abort"\noverflow-checks = true\n'})}),"\n",(0,i.jsxs)(t,{children:[(0,i.jsxs)("summary",{children:[" Your ",(0,i.jsx)(n.code,{children:"Cargo.toml"})," file should now look like this "]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-toml",metastring:'title="File: Cargo.toml" showLineNumbers',children:'[package]\nname = "kv-store"\nversion = "0.1.0"\nedition = "2021"\n\n# highlight-start\n[lib]\ncrate-type = ["cdylib"]\n# highlight-end\n\n# highlight-start\n[dependencies]\ncalimero-sdk = { git = "https://github.com/calimero-network/core" }\n# highlight-end\n\n# highlight-start\n[profile.app-release]\ninherits = "release"\ncodegen-units = 1\nopt-level = "z"\nlto = true\ndebug = false\npanic = "abort"\noverflow-checks = true\n# highlight-end\n'})})]}),"\n",(0,i.jsxs)(n.p,{children:["And finally, create a ",(0,i.jsx)(n.code,{children:"build.sh"})," script to compile your application into Wasm format, for example:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:'title="File: build.sh" showLineNumbers',children:'#!/bin/bash\nset -e\n\ncd "$(dirname $0)"\n\nTARGET="${CARGO_TARGET_DIR:-../../target}"\n\nrustup target add wasm32-unknown-unknown\n\ncargo build --target wasm32-unknown-unknown --profile app-release\n\nmkdir -p res\n\ncp $TARGET/wasm32-unknown-unknown/app-release/kv_store.wasm ./res/\n'})}),"\n",(0,i.jsxs)(n.p,{children:["You can optionally choose to install and use ",(0,i.jsx)(n.a,{href:"https://github.com/WebAssembly/binaryen",children:(0,i.jsx)(n.code,{children:"wasm-opt"})}),", for an additional optimization step in the build script. This step is not required but can help reduce the size of the generated Wasm file:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:'title="File: build.sh"',children:"if command -v wasm-opt > /dev/null; then\n wasm-opt -Oz ./res/kv_store.wasm -o ./res/kv_store.wasm\nfi\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Don't forget to make the ",(0,i.jsx)(n.code,{children:"build.sh"})," script executable:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:'title="Terminal"',children:"chmod +x build.sh\n"})}),"\n",(0,i.jsx)(n.p,{children:"At this point, your project structure should look like this:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:'title="Terminal"',children:"$ tree\n.\n\u251c\u2500\u2500 Cargo.toml\n\u251c\u2500\u2500 build.sh\n\u2514\u2500\u2500 src\n \u2514\u2500\u2500 lib.rs\n\n2 directories, 3 files\n"})}),"\n",(0,i.jsx)(n.h3,{id:"writing-your-application",children:"Writing Your Application"}),"\n",(0,i.jsxs)(n.p,{children:["Now, let's create a simple key-value store application using the Calimero SDK. Start by defining your application logic in ",(0,i.jsx)(n.code,{children:"lib.rs"}),":"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",metastring:'title="File: src/lib.rs" showLineNumbers',children:'use calimero_sdk::borsh::{BorshDeserialize, BorshSerialize};\nuse calimero_sdk::app;\n\n#[app::state]\n#[derive(Default, BorshSerialize, BorshDeserialize)]\n#[borsh(crate = "calimero_sdk::borsh")]\nstruct KvStore {}\n\n#[app::logic]\nimpl KvStore {}\n'})}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"KvStore"})," struct represents the state of your application, which will be borsh-encoded in the app-scoped state partition on the node's storage. The ",(0,i.jsx)(n.code,{children:"#[app::state]"})," attribute macro marks the struct as the application state, permitting its use by Calimero SDK."]}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"#[app::logic]"})," attribute macro marks the implementation block as the application logic, allowing you to define the methods that interact with the application state."]}),"\n",(0,i.jsxs)(n.p,{children:["Consider a method like ",(0,i.jsx)(n.code,{children:"get"})," that retrieves a value from the key-value store:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",children:"pub fn get(&self, key: &str) -> Option<&str> {\n // Snip...\n}\n"})}),"\n",(0,i.jsxs)(n.p,{children:["The inputs must be deserializable from the transaction data, and the output must be serializable to the response data. The ",(0,i.jsx)(n.code,{children:"Option"})," type is used to represent the possibility of the key not being present in the store."]}),"\n",(0,i.jsx)(n.p,{children:"And now, here's a complete example of a key-value store application:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",metastring:'title="File: src/lib.rs" showLineNumbers',children:'use std::collections::HashMap;\n\nuse calimero_sdk::borsh::{BorshDeserialize, BorshSerialize};\nuse calimero_sdk::{app, env};\n\n#[app::state]\n#[derive(Default, BorshSerialize, BorshDeserialize)]\nstruct KvStore {\n entries: HashMap,\n}\n\n#[app::logic]\nimpl KvStore {\n // highlight-start\n pub fn set(&mut self, key: String, value: String) {\n env::log(&format!("Setting key: {:?} to value: {:?}", key, value));\n\n self.entries.insert(key, value);\n }\n // highlight-end\n\n // highlight-start\n pub fn entries(&self) -> &HashMap {\n env::log("Getting all entries");\n\n &self.entries\n }\n // highlight-end\n\n // highlight-start\n pub fn get(&self, key: &str) -> Option<&str> {\n env::log(&format!("Getting key: {:?}", key));\n\n self.entries.get(key).map(|v| v.as_str())\n }\n // highlight-end\n\n // highlight-start\n pub fn remove(&mut self, key: &str) -> Option {\n env::log(&format!("Removing key: {:?}", key));\n\n self.entries.remove(key)\n }\n // highlight-end\n}\n'})}),"\n",(0,i.jsx)(n.h3,{id:"building-your-application",children:"Building Your Application"}),"\n",(0,i.jsxs)(n.p,{children:["Once your application logic is defined, run the ",(0,i.jsx)(n.code,{children:"./build.sh"})," script to compile your application into Wasm format. This script will generate ",(0,i.jsx)(n.code,{children:"kv_store.wasm"})," in the ",(0,i.jsx)(n.code,{children:"res"})," folder of your application."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:'title="Terminal"',children:"$ ./build.sh\ninfo: component 'rust-std' for target 'wasm32-unknown-unknown' is up to date\n # Snip...\n Compiling calimero-sdk v0.1.0\n Compiling kv-store v0.1.0 (/apps/kv-store)\n Finished `app-release` profile [optimized] target(s) in 1.20s\n\n$ tree\n.\n\u251c\u2500\u2500 Cargo.toml\n\u251c\u2500\u2500 build.sh\n\u251c\u2500\u2500 res\n\u2502\xa0\xa0 \u2514\u2500\u2500 kv_store.wasm\n\u2514\u2500\u2500 src\n \u2514\u2500\u2500 lib.rs\n\n3 directories, 4 files\n"})}),"\n",(0,i.jsx)(n.h3,{id:"deploying-your-application",children:"Deploying Your Application"}),"\n",(0,i.jsxs)(n.p,{children:["After successfully building your application, you can upload the compiled ",(0,i.jsx)(n.code,{children:"kv_store.wasm"})," to the registry for use by a live Calimero node."]}),"\n",(0,i.jsx)(n.h3,{id:"writing-efficient-code-with-calimero-sdk",children:"Writing Efficient Code with Calimero SDK"}),"\n",(0,i.jsx)(n.p,{children:"In the following code snippet:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",metastring:'title="File: src/lib.rs"',children:"pub fn get(&self, key: &str) -> Option<&str> {\n // Snip...\n}\n"})}),"\n",(0,i.jsx)(n.p,{children:"you'll notice that we prioritize using references instead of owned values. This approach optimizes performance and memory usage by minimizing unnecessary data copying."}),"\n",(0,i.jsxs)(n.p,{children:["For input parameters, such as ",(0,i.jsx)(n.code,{children:"&str"})," and ",(0,i.jsx)(n.code,{children:"&[u8]"}),", utilizing references allows you to avoid unnecessary copying of data. Similarly, for output values, you can return references to data that live as long as ",(0,i.jsx)(n.code,{children:"&self"})," or any of the input parameters. By doing so, you reduce memory overhead and improve the overall efficiency of your application."]}),"\n",(0,i.jsx)(n.p,{children:"By returning a reference to the value associated with the provided key instead of cloning the entire value, you ensure efficient memory usage and enhance the performance of your application."}),"\n",(0,i.jsx)(n.h3,{id:"handling-errors-with-calimero-sdk",children:"Handling Errors with Calimero SDK"}),"\n",(0,i.jsxs)(n.p,{children:["When designing methods that may potentially fail, it's recommended to return a ",(0,i.jsx)(n.code,{children:"Result"})," type with an error variant representing the possible failure cases. This enables you to handle errors more effectively and communicate error conditions to users of your application. As opposed to panicking which would only return a string message, using ",(0,i.jsx)(n.code,{children:"Result"})," allows you to provide a structured error type with additional context."]}),"\n",(0,i.jsxs)(n.p,{children:["First, let's define an error type ",(0,i.jsx)(n.code,{children:"Error<'a>"})," with a lifetime tied to the key ",(0,i.jsx)(n.code,{children:"&'a str"}),":"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",metastring:'title="File: src/lib.rs"',children:"use calimero_sdk::serde::Serialize;\n\n#[derive(Debug, Serialize)]\npub enum Error<'a> {\n NotFound(&'a str),\n // Add more error variants as needed\n}\n"})}),"\n",(0,i.jsxs)(n.p,{children:["In the above definition, ",(0,i.jsx)(n.code,{children:"Error"})," represents the possible error variants that may occur during the execution of your method. Each variant can carry additional data to provide context about the error condition."]}),"\n",(0,i.jsxs)(n.p,{children:["Next, let's modify the ",(0,i.jsx)(n.code,{children:"get"})," method to return a ",(0,i.jsx)(n.code,{children:"Result"})," with ",(0,i.jsx)(n.code,{children:"Error"})," as the error type:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",metastring:'title="File: src/lib.rs"',children:"pub fn get<'a>(&self, key: &'a str) -> Result<&'a str, Error<'a>> {\n match self.entries.get(key) {\n Some(value) => Ok(value),\n None => Err(Error::NotFound(key)),\n }\n}\n"})}),"\n",(0,i.jsxs)(n.p,{children:["In the ",(0,i.jsx)(n.code,{children:"get"})," method, we return ",(0,i.jsx)(n.code,{children:"Ok(value)"})," if the key exists in the key-value store, and ",(0,i.jsx)(n.code,{children:"Err(Error::NotFound(key))"})," if the key is not found. This allows callers of the method to handle the possibility of the key not being present in the store."]}),"\n",(0,i.jsxs)(n.p,{children:["Additionally, ensure that the ",(0,i.jsx)(n.code,{children:"Error"})," type is serializable by implementing (or deriving) the ",(0,i.jsx)(n.code,{children:"Serialize"})," trait, as shown in the definition above. This enables errors to be encoded in a structured format when returned as part of a call error."]}),"\n",(0,i.jsx)(n.p,{children:"By following this approach, you can handle errors more gracefully and provide meaningful feedback to users of your Calimero application."}),"\n",(0,i.jsx)(n.h3,{id:"emitting-events-with-calimero-sdk",children:"Emitting Events with Calimero SDK"}),"\n",(0,i.jsxs)(n.p,{children:["To facilitate real-time monitoring of state transitions within your Calimero application, you can emit events using the ",(0,i.jsx)(n.code,{children:"app::emit!"})," macro provided by the Calimero SDK. Event emission is particularly useful for handling live state transitions triggered by other actors, allowing subscribed clients to receive immediate updates about relevant actions."]}),"\n",(0,i.jsxs)(n.p,{children:["Let's focus on emitting events for mutating calls, specifically ",(0,i.jsx)(n.code,{children:"set"})," and ",(0,i.jsx)(n.code,{children:"remove"})," methods:"]}),"\n",(0,i.jsxs)(n.p,{children:["First, define your custom events using the ",(0,i.jsx)(n.code,{children:"#[app::event]"})," proc macro. In this example, we'll define events for setting a new key-value pair (",(0,i.jsx)(n.code,{children:"Inserted"}),"), updating an existing value (",(0,i.jsx)(n.code,{children:"Updated"}),"), and removing a key-value pair (",(0,i.jsx)(n.code,{children:"Removed"}),"):"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",metastring:'title="File: src/lib.rs"',children:"use calimero_sdk::app;\n\n#[app::event]\npub enum Event<'a> {\n Inserted { key: &'a str, value: &'a str },\n Updated { key: &'a str, value: &'a str },\n Removed { key: &'a str },\n}\n"})}),"\n",(0,i.jsx)(n.p,{children:"Each event variant can carry additional data to provide context about the event."}),"\n",(0,i.jsx)(n.p,{children:"Now, you need to associate the event with the application logic by annotating the application state."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",metastring:'title="File: src/lib.rs"',children:"#[app::state(emits = for<'a> Event<'a>)]\n#[derive(Default, BorshSerialize, BorshDeserialize)]\nstruct KvStore {\n // Snip...\n}\n"})}),"\n",(0,i.jsxs)(n.p,{children:["And finally, within your application logic methods, emit events using the ",(0,i.jsx)(n.code,{children:"app::emit!"})," macro:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-rust",metastring:'title="File: src/lib.rs"',children:"use std::collections::hash_map::Entry;\n\npub fn set(&mut self, key: String, value: String) {\n match self.items.entry(key) {\n Entry::Occupied(mut entry) => {\n app::emit!(Event::Updated {\n key: entry.key(),\n value: &value,\n });\n entry.insert(value);\n }\n Entry::Vacant(entry) => {\n app::emit!(Event::Inserted {\n key: entry.key(),\n value: &value,\n });\n entry.insert(value);\n }\n }\n}\n\npub fn remove(&mut self, key: &str) -> Result {\n app::emit!(Event::Removed { key });\n\n self.entries.remove(key).ok_or_else(|| Error::NotFound(key))\n}\n"})}),"\n",(0,i.jsx)(n.p,{children:"In each method, we emit the corresponding event with relevant data. This allows external observers to react to these events and take appropriate actions."}),"\n",(0,i.jsx)(n.p,{children:"By emitting events, you can ensure connected clients receive real-time updates about state transitions within your Calimero application, enabling them to respond to changes as they occur."}),"\n",(0,i.jsx)(n.h3,{id:"ensuring-atomicity-and-event-reliability-in-calimero-applications",children:"Ensuring Atomicity and Event Reliability in Calimero Applications"}),"\n",(0,i.jsx)(n.p,{children:"In Calimero applications, ensuring atomicity of state changes and reliability of event emission is crucial for maintaining data consistency and facilitating reliable communication between actors. Here's how atomicity and event reliability are enforced:"}),"\n",(0,i.jsx)(n.h4,{id:"atomic-state-changes",children:"Atomic State Changes"}),"\n",(0,i.jsxs)(n.p,{children:["When a method call fails, whether due to panics or returning an ",(0,i.jsx)(n.code,{children:"Err"}),", all state changes made up to that point are discarded. This ensures that if an operation cannot be completed successfully, the application's state remains consistent and unaffected by partial updates. By enforcing atomicity, Calimero promotes data integrity and prevents inconsistencies that may arise from incomplete transactions."]}),"\n",(0,i.jsx)(n.h4,{id:"reliable-event-emission",children:"Reliable Event Emission"}),"\n",(0,i.jsx)(n.p,{children:"Similarly, event emission in Calimero applications is tied to the successful execution of transactions. Events are only relayed when a transaction has been successfully executed, ensuring that external observers receive updates about state changes reliably. By linking event emission to transaction execution, Calimero guarantees that event notifications accurately reflect the application's current state, enhancing the reliability and consistency of communication between actors."}),"\n",(0,i.jsx)(n.p,{children:"This also means it doesn't matter if the event emission is done before or after the state change, as the event will only be emitted if the state change is successful."}),"\n",(0,i.jsx)(n.p,{children:"By adhering to these principles of atomicity and event reliability, Calimero applications maintain data integrity and enable robust interaction between different components, facilitating the development of secure and dependable decentralized systems."}),"\n",(0,i.jsx)(n.h3,{id:"local-first-efficiency-no-network-overhead-for-read-only-calls",children:"Local-First Efficiency: No Network Overhead for Read-Only Calls"}),"\n",(0,i.jsx)(n.p,{children:"In Calimero, adherence to the local-first principle eliminates the need for network communication in read-only calls. Since read-only operations don't modify the state, there's no associated network overhead. This local-first approach streamlines data access, promoting efficient and responsive application performance without unnecessary network activity."}),"\n",(0,i.jsx)(n.h3,{id:"conclusion",children:"Conclusion"}),"\n",(0,i.jsx)(n.p,{children:"You've now learned how to set up a Rust project using the Calimero SDK, write a simple application, build it into Wasm, and prepare it for deployment. Experiment with different features and functionalities to create powerful and secure applications with Calimero."}),"\n",(0,i.jsx)(n.p,{children:"Happy coding! \ud83d\ude80"})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},5710:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>a});var i=t(758);const r={},s=i.createContext(r);function o(e){const n=i.useContext(s);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),i.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/2ccf3cc5.6d3599d6.js b/assets/js/2ccf3cc5.6d3599d6.js deleted file mode 100644 index 0b3101ec..00000000 --- a/assets/js/2ccf3cc5.6d3599d6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[9951],{7145:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>u,frontMatter:()=>i,metadata:()=>d,toc:()=>l});var n=r(6070),o=r(5710);const i={id:"getting-started",title:"Getting started"},a=void 0,d={id:"explore/developers-quickstart/getting-started",title:"Getting started",description:"Before you start, make sure you are familiar with Calimero Terminology.",source:"@site/docs/01-explore/02-developers-quickstart/01-getting-started.mdx",sourceDirName:"01-explore/02-developers-quickstart",slug:"/explore/developers-quickstart/getting-started",permalink:"/explore/developers-quickstart/getting-started",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718634626e3,sidebarPosition:1,frontMatter:{id:"getting-started",title:"Getting started"},sidebar:"tutorialSidebar",previous:{title:"Introduction",permalink:"/explore/intro"},next:{title:"Admin Dashboard",permalink:"/explore/developers-quickstart/admin-dashboard"}},s={},l=[{value:"Setup your local node",id:"setup-your-local-node",level:2},{value:"Prerequisites",id:"prerequisites",level:3},{value:"Setup",id:"setup",level:3},{value:"Initialize and start coordinator node (separate terminal)",id:"initialize-and-start-coordinator-node-separate-terminal",level:4},{value:"Initialize and start your node (separate terminal)",id:"initialize-and-start-your-node-separate-terminal",level:4},{value:"Congratulations on setting up your node!",id:"congratulations-on-setting-up-your-node",level:3}];function c(e){const t={a:"a",code:"code",h2:"h2",h3:"h3",h4:"h4",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(t.p,{children:["Before you start, make sure you are familiar with ",(0,n.jsx)(t.a,{href:"/learn/terminology",children:"Calimero Terminology"}),"."]}),"\n",(0,n.jsx)(t.h2,{id:"setup-your-local-node",children:"Setup your local node"}),"\n",(0,n.jsx)(t.h3,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,n.jsx)(t.p,{children:"Position in the root of the project and create a data folder for all configuration files."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-console",children:"$ mkdir data\n"})}),"\n",(0,n.jsx)(t.h3,{id:"setup",children:"Setup"}),"\n",(0,n.jsx)(t.p,{children:"Setup coordinator node used for managing the network transactions and peer nodes representing the network participants."}),"\n",(0,n.jsx)(t.h4,{id:"initialize-and-start-coordinator-node-separate-terminal",children:"Initialize and start coordinator node (separate terminal)"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{children:"$ cargo run -p calimero-node -- --home data/coordinator init --server-port 2427 --swarm-port 2527\n$ cargo run -p calimero-node -- --home data/coordinator run --node-type coordinator\n"})}),"\n",(0,n.jsx)(t.h4,{id:"initialize-and-start-your-node-separate-terminal",children:"Initialize and start your node (separate terminal)"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{children:"$ cargo run -p calimero-node -- --home data/node1 init --server-port 2428 --swarm-port 2528\n$ cargo run -p calimero-node -- --home data/node1 run\n"})}),"\n",(0,n.jsx)(t.p,{children:"Node is now initialized and ready for use."}),"\n",(0,n.jsx)(t.h3,{id:"congratulations-on-setting-up-your-node",children:"Congratulations on setting up your node!"}),"\n",(0,n.jsx)(t.p,{children:"Your next step is to add an authentication mechanism to your node by adding a decentralized identity."})]})}function u(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},5710:(e,t,r)=>{r.d(t,{R:()=>a,x:()=>d});var n=r(758);const o={},i=n.createContext(o);function a(e){const t=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),n.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/2ccf3cc5.74e32571.js b/assets/js/2ccf3cc5.74e32571.js new file mode 100644 index 00000000..cb244c3b --- /dev/null +++ b/assets/js/2ccf3cc5.74e32571.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[9951],{7145:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>d,contentTitle:()=>a,default:()=>u,frontMatter:()=>i,metadata:()=>s,toc:()=>l});var n=r(6070),o=r(5710);const i={id:"getting-started",title:"Getting started"},a=void 0,s={id:"explore/developers-quickstart/getting-started",title:"Getting started",description:"Before you start, make sure you are familiar with Calimero Terminology.",source:"@site/docs/01-explore/02-developers-quickstart/01-getting-started.mdx",sourceDirName:"01-explore/02-developers-quickstart",slug:"/explore/developers-quickstart/getting-started",permalink:"/explore/developers-quickstart/getting-started",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718723446e3,sidebarPosition:1,frontMatter:{id:"getting-started",title:"Getting started"},sidebar:"tutorialSidebar",previous:{title:"Introduction",permalink:"/explore/intro"},next:{title:"Admin Dashboard",permalink:"/explore/developers-quickstart/admin-dashboard"}},d={},l=[{value:"Setup your local node",id:"setup-your-local-node",level:2},{value:"Prerequisites",id:"prerequisites",level:3},{value:"Setup",id:"setup",level:3},{value:"Initialize and start coordinator node (separate terminal)",id:"initialize-and-start-coordinator-node-separate-terminal",level:4},{value:"Initialize and start your node (separate terminal)",id:"initialize-and-start-your-node-separate-terminal",level:4},{value:"Congratulations on setting up your node!",id:"congratulations-on-setting-up-your-node",level:3}];function c(e){const t={a:"a",code:"code",h2:"h2",h3:"h3",h4:"h4",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(t.p,{children:["Before you start, make sure you are familiar with ",(0,n.jsx)(t.a,{href:"/learn/terminology",children:"Calimero Terminology"}),"."]}),"\n",(0,n.jsx)(t.h2,{id:"setup-your-local-node",children:"Setup your local node"}),"\n",(0,n.jsx)(t.h3,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,n.jsx)(t.p,{children:"Clone repository from GitHub."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-terminal",children:"git clone git@github.com:calimero-network/core.git\n"})}),"\n",(0,n.jsx)(t.p,{children:"Position in the root of the project and create a data folder for all configuration files."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-console",children:"$ mkdir data\n"})}),"\n",(0,n.jsx)(t.h3,{id:"setup",children:"Setup"}),"\n",(0,n.jsx)(t.p,{children:"Setup coordinator node used for managing the network transactions and peer nodes representing the network participants."}),"\n",(0,n.jsx)(t.h4,{id:"initialize-and-start-coordinator-node-separate-terminal",children:"Initialize and start coordinator node (separate terminal)"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{children:"$ cargo run -p calimero-node -- --home data/coordinator init --server-port 2427 --swarm-port 2527\n$ cargo run -p calimero-node -- --home data/coordinator run --node-type coordinator\n"})}),"\n",(0,n.jsx)(t.h4,{id:"initialize-and-start-your-node-separate-terminal",children:"Initialize and start your node (separate terminal)"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{children:"$ cargo run -p calimero-node -- --home data/node1 init --server-port 2428 --swarm-port 2528\n$ cargo run -p calimero-node -- --home data/node1 run\n"})}),"\n",(0,n.jsx)(t.p,{children:"Node is now initialized and ready for use."}),"\n",(0,n.jsx)(t.h3,{id:"congratulations-on-setting-up-your-node",children:"Congratulations on setting up your node!"}),"\n",(0,n.jsx)(t.p,{children:"Your next step is to add an authentication mechanism to your node by adding a decentralized identity."})]})}function u(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},5710:(e,t,r)=>{r.d(t,{R:()=>a,x:()=>s});var n=r(758);const o={},i=n.createContext(o);function a(e){const t=n.useContext(i);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),n.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/37e9fbd6.8ee333c6.js b/assets/js/37e9fbd6.30dd7be5.js similarity index 97% rename from assets/js/37e9fbd6.8ee333c6.js rename to assets/js/37e9fbd6.30dd7be5.js index 4bb911dd..f800c24a 100644 --- a/assets/js/37e9fbd6.8ee333c6.js +++ b/assets/js/37e9fbd6.30dd7be5.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2193],{3591:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>s,metadata:()=>a,toc:()=>c});var t=r(6070),o=r(5710);const s={id:"learning",title:"Learning"},i="Learning",a={id:"resources/learning",title:"Learning",description:"Expand your knowledge and stay informed by exploring the following resources:",source:"@site/docs/05-resources/02-learning.mdx",sourceDirName:"05-resources",slug:"/resources/learning",permalink:"/resources/learning",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718634626e3,sidebarPosition:2,frontMatter:{id:"learning",title:"Learning"},sidebar:"tutorialSidebar",previous:{title:"Community and Support",permalink:"/resources/community-and-support"}},l={},c=[{value:"Learn More",id:"learn-more",level:2}];function u(e){const n={a:"a",h1:"h1",h2:"h2",li:"li",p:"p",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"learning",children:"Learning"}),"\n",(0,t.jsx)(n.p,{children:"Expand your knowledge and stay informed by exploring the following resources:"}),"\n",(0,t.jsx)(n.h2,{id:"learn-more",children:"Learn More"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Website:"})," Visit our ",(0,t.jsx)(n.a,{href:"https://www.calimero.network/",children:"website"})," for comprehensive information about the project, including features and documentation."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Blog:"})," Check out our ",(0,t.jsx)(n.a,{href:"https://www.calimero.network/blogs",children:"blog"})," for insightful articles, tutorials, and the latest news about our project."]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"We provide a variety of resources to help you learn more about our project and stay up-to-date with the latest developments. Dive into our documentation, read our blog, and explore our website to get the most out of our project."})]})}function d(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(u,{...e})}):u(e)}},5710:(e,n,r)=>{r.d(n,{R:()=>i,x:()=>a});var t=r(758);const o={},s=t.createContext(o);function i(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2193],{3591:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>s,metadata:()=>a,toc:()=>c});var t=r(6070),o=r(5710);const s={id:"learning",title:"Learning"},i="Learning",a={id:"resources/learning",title:"Learning",description:"Expand your knowledge and stay informed by exploring the following resources:",source:"@site/docs/05-resources/02-learning.mdx",sourceDirName:"05-resources",slug:"/resources/learning",permalink:"/resources/learning",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718723446e3,sidebarPosition:2,frontMatter:{id:"learning",title:"Learning"},sidebar:"tutorialSidebar",previous:{title:"Community and Support",permalink:"/resources/community-and-support"}},l={},c=[{value:"Learn More",id:"learn-more",level:2}];function u(e){const n={a:"a",h1:"h1",h2:"h2",li:"li",p:"p",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"learning",children:"Learning"}),"\n",(0,t.jsx)(n.p,{children:"Expand your knowledge and stay informed by exploring the following resources:"}),"\n",(0,t.jsx)(n.h2,{id:"learn-more",children:"Learn More"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Website:"})," Visit our ",(0,t.jsx)(n.a,{href:"https://www.calimero.network/",children:"website"})," for comprehensive information about the project, including features and documentation."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Blog:"})," Check out our ",(0,t.jsx)(n.a,{href:"https://www.calimero.network/blogs",children:"blog"})," for insightful articles, tutorials, and the latest news about our project."]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"We provide a variety of resources to help you learn more about our project and stay up-to-date with the latest developments. Dive into our documentation, read our blog, and explore our website to get the most out of our project."})]})}function d(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(u,{...e})}):u(e)}},5710:(e,n,r)=>{r.d(n,{R:()=>i,x:()=>a});var t=r(758);const o={},s=t.createContext(o);function i(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3e1f1522.b0b4183d.js b/assets/js/3e1f1522.2cbde125.js similarity index 98% rename from assets/js/3e1f1522.b0b4183d.js rename to assets/js/3e1f1522.2cbde125.js index 47d59abf..8af78c97 100644 --- a/assets/js/3e1f1522.b0b4183d.js +++ b/assets/js/3e1f1522.2cbde125.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8044],{7828:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>r,contentTitle:()=>o,default:()=>h,frontMatter:()=>a,metadata:()=>d,toc:()=>c});var n=i(6070),s=i(5710);const a={id:"admin-dashboard",title:"Admin Dashboard"},o=void 0,d={id:"explore/developers-quickstart/admin-dashboard",title:"Admin Dashboard",description:"Node is gated with authentication. In order to interact with the node from any app, you need to register a decentralized identity.",source:"@site/docs/01-explore/02-developers-quickstart/02-admin-dashboard.mdx",sourceDirName:"01-explore/02-developers-quickstart",slug:"/explore/developers-quickstart/admin-dashboard",permalink:"/explore/developers-quickstart/admin-dashboard",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718634626e3,sidebarPosition:2,frontMatter:{id:"admin-dashboard",title:"Admin Dashboard"},sidebar:"tutorialSidebar",previous:{title:"Getting started",permalink:"/explore/developers-quickstart/getting-started"},next:{title:"Example Application",permalink:"/explore/developers-quickstart/example-app"}},r={},c=[{value:"Access Admin Dashboard",id:"access-admin-dashboard",level:3},{value:"Admin Dashboard functionalities:",id:"admin-dashboard-functionalities",level:3},{value:"Identity",id:"identity",level:4},{value:"Contexts",id:"contexts",level:4},{value:"Applications",id:"applications",level:4},{value:"Export",id:"export",level:4}];function l(e){const t={a:"a",blockquote:"blockquote",code:"code",em:"em",h3:"h3",h4:"h4",img:"img",p:"p",strong:"strong",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.p,{children:"Node is gated with authentication. In order to interact with the node from any app, you need to register a decentralized identity.\nWe have build an Admin Dashboard which is a web application designed to streamline the management of node states within your system. Seamlessly connected with the API provided by the Admin Client API, this user interface offers a user-friendly platform for overseeing and controlling various aspects of your node infrastructure."}),"\n",(0,n.jsx)(t.h3,{id:"access-admin-dashboard",children:"Access Admin Dashboard"}),"\n",(0,n.jsxs)(t.p,{children:["Admin Dashboard is published to GitHub pages so you can access it directly from the browser. Available at ",(0,n.jsx)(t.a,{href:"https://calimero-network.github.io/admin-dashboard/",children:"https://calimero-network.github.io/admin-dashboard/"}),"."]}),"\n",(0,n.jsxs)(t.blockquote,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.strong,{children:(0,n.jsx)(t.em,{children:"NOTE:"})}),"\nUpdate ",(0,n.jsx)(t.code,{children:"NODE_PORT"})," with the ",(0,n.jsx)(t.code,{children:"--server-port"})," value defined during node setup in ",(0,n.jsx)(t.a,{href:"/explore/developers-quickstart/getting-started",children:"Getting-started"})]}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"You will see login page. On the first login, your selected wallet will be used as a root key to use further functionalities."}),"\n",(0,n.jsx)(t.h3,{id:"admin-dashboard-functionalities",children:"Admin Dashboard functionalities:"}),"\n",(0,n.jsx)(t.h4,{id:"identity",children:"Identity"}),"\n",(0,n.jsx)(t.p,{children:"Preview added root keys or add new root key."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Identity",src:i(8262).A+"",width:"3014",height:"1554"})}),"\n",(0,n.jsx)(t.h4,{id:"contexts",children:"Contexts"}),"\n",(0,n.jsx)(t.p,{children:"Preview context which you have already joined or invited. You can also create a new context."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Contexts",src:i(1600).A+"",width:"3010",height:"1558"})}),"\n",(0,n.jsx)(t.h4,{id:"applications",children:"Applications"}),"\n",(0,n.jsx)(t.p,{children:"Preview available applications from other developers or applications you published. You can also publish new application"}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Applications",src:i(449).A+"",width:"3016",height:"1558"})}),"\n",(0,n.jsx)(t.h4,{id:"export",children:"Export"}),"\n",(0,n.jsx)(t.p,{children:"Allows you to export you identity on current device and import it on new device so you have seamless experience while onboarding to another device."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Export",src:i(8183).A+"",width:"3018",height:"1560"})})]})}function h(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},449:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/applications-65c777f084225d92fc42a490b4a1b3e1.png"},1600:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/contexts-6319c93e803b1ca884e210104b4e654c.png"},8183:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/export-identity-4108c244241ad8b32d09d98e3ec3bd29.png"},8262:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/identity-4bfbe6d0828c9b408f0c8a6506a92327.png"},5710:(e,t,i)=>{i.d(t,{R:()=>o,x:()=>d});var n=i(758);const s={},a=n.createContext(s);function o(e){const t=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),n.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8044],{7828:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>r,contentTitle:()=>o,default:()=>h,frontMatter:()=>a,metadata:()=>d,toc:()=>c});var n=i(6070),s=i(5710);const a={id:"admin-dashboard",title:"Admin Dashboard"},o=void 0,d={id:"explore/developers-quickstart/admin-dashboard",title:"Admin Dashboard",description:"Node is gated with authentication. In order to interact with the node from any app, you need to register a decentralized identity.",source:"@site/docs/01-explore/02-developers-quickstart/02-admin-dashboard.mdx",sourceDirName:"01-explore/02-developers-quickstart",slug:"/explore/developers-quickstart/admin-dashboard",permalink:"/explore/developers-quickstart/admin-dashboard",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718723446e3,sidebarPosition:2,frontMatter:{id:"admin-dashboard",title:"Admin Dashboard"},sidebar:"tutorialSidebar",previous:{title:"Getting started",permalink:"/explore/developers-quickstart/getting-started"},next:{title:"Example Application",permalink:"/explore/developers-quickstart/example-app"}},r={},c=[{value:"Access Admin Dashboard",id:"access-admin-dashboard",level:3},{value:"Admin Dashboard functionalities:",id:"admin-dashboard-functionalities",level:3},{value:"Identity",id:"identity",level:4},{value:"Contexts",id:"contexts",level:4},{value:"Applications",id:"applications",level:4},{value:"Export",id:"export",level:4}];function l(e){const t={a:"a",blockquote:"blockquote",code:"code",em:"em",h3:"h3",h4:"h4",img:"img",p:"p",strong:"strong",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.p,{children:"Node is gated with authentication. In order to interact with the node from any app, you need to register a decentralized identity.\nWe have build an Admin Dashboard which is a web application designed to streamline the management of node states within your system. Seamlessly connected with the API provided by the Admin Client API, this user interface offers a user-friendly platform for overseeing and controlling various aspects of your node infrastructure."}),"\n",(0,n.jsx)(t.h3,{id:"access-admin-dashboard",children:"Access Admin Dashboard"}),"\n",(0,n.jsxs)(t.p,{children:["Admin Dashboard is published to GitHub pages so you can access it directly from the browser. Available at ",(0,n.jsx)(t.a,{href:"https://calimero-network.github.io/admin-dashboard/",children:"https://calimero-network.github.io/admin-dashboard/"}),"."]}),"\n",(0,n.jsxs)(t.blockquote,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.strong,{children:(0,n.jsx)(t.em,{children:"NOTE:"})}),"\nUpdate ",(0,n.jsx)(t.code,{children:"NODE_PORT"})," with the ",(0,n.jsx)(t.code,{children:"--server-port"})," value defined during node setup in ",(0,n.jsx)(t.a,{href:"/explore/developers-quickstart/getting-started",children:"Getting-started"})]}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"You will see login page. On the first login, your selected wallet will be used as a root key to use further functionalities."}),"\n",(0,n.jsx)(t.h3,{id:"admin-dashboard-functionalities",children:"Admin Dashboard functionalities:"}),"\n",(0,n.jsx)(t.h4,{id:"identity",children:"Identity"}),"\n",(0,n.jsx)(t.p,{children:"Preview added root keys or add new root key."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Identity",src:i(8262).A+"",width:"3014",height:"1554"})}),"\n",(0,n.jsx)(t.h4,{id:"contexts",children:"Contexts"}),"\n",(0,n.jsx)(t.p,{children:"Preview context which you have already joined or invited. You can also create a new context."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Contexts",src:i(1600).A+"",width:"3010",height:"1558"})}),"\n",(0,n.jsx)(t.h4,{id:"applications",children:"Applications"}),"\n",(0,n.jsx)(t.p,{children:"Preview available applications from other developers or applications you published. You can also publish new application"}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Applications",src:i(449).A+"",width:"3016",height:"1558"})}),"\n",(0,n.jsx)(t.h4,{id:"export",children:"Export"}),"\n",(0,n.jsx)(t.p,{children:"Allows you to export you identity on current device and import it on new device so you have seamless experience while onboarding to another device."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Export",src:i(8183).A+"",width:"3018",height:"1560"})})]})}function h(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},449:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/applications-65c777f084225d92fc42a490b4a1b3e1.png"},1600:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/contexts-6319c93e803b1ca884e210104b4e654c.png"},8183:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/export-identity-4108c244241ad8b32d09d98e3ec3bd29.png"},8262:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/identity-4bfbe6d0828c9b408f0c8a6506a92327.png"},5710:(e,t,i)=>{i.d(t,{R:()=>o,x:()=>d});var n=i(758);const s={},a=n.createContext(s);function o(e){const t=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),n.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/42b3b6e0.6f738bd5.js b/assets/js/42b3b6e0.1f3d109a.js similarity index 98% rename from assets/js/42b3b6e0.6f738bd5.js rename to assets/js/42b3b6e0.1f3d109a.js index 0226dbad..d823f8da 100644 --- a/assets/js/42b3b6e0.6f738bd5.js +++ b/assets/js/42b3b6e0.1f3d109a.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[6391],{9442:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>u,frontMatter:()=>r,metadata:()=>a,toc:()=>d});var n=o(6070),i=o(5710);const r={id:"intro",title:"Introduction"},s=void 0,a={id:"explore/intro",title:"Introduction",description:"Welcome to Our Project Documentation",source:"@site/docs/01-explore/01-intro.mdx",sourceDirName:"01-explore",slug:"/explore/intro",permalink:"/explore/intro",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718634626e3,sidebarPosition:1,frontMatter:{id:"intro",title:"Introduction"},sidebar:"tutorialSidebar",next:{title:"Getting started",permalink:"/explore/developers-quickstart/getting-started"}},c={},d=[{value:"Welcome to Our Project Documentation",id:"welcome-to-our-project-documentation",level:2},{value:"Explore",id:"explore",level:3},{value:"Learn",id:"learn",level:3},{value:"Build",id:"build",level:3},{value:"Contribute",id:"contribute",level:3},{value:"Resources",id:"resources",level:3},{value:"Next steps",id:"next-steps",level:3}];function l(e){const t={h2:"h2",h3:"h3",p:"p",...(0,i.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h2,{id:"welcome-to-our-project-documentation",children:"Welcome to Our Project Documentation"}),"\n",(0,n.jsx)(t.p,{children:"Welcome to our comprehensive documentation.\nHere, you'll find all the resources and guidance needed to understand and engage with our technology. Whether you are new to privacy technology or looking to deepen your existing knowledge, this documentation is structured to assist you every step of the way."}),"\n",(0,n.jsx)(t.p,{children:"Our documentation is divided into several key sections, each designed to provide you with detailed insights and practical tools:"}),"\n",(0,n.jsx)(t.h3,{id:"explore",children:"Explore"}),"\n",(0,n.jsx)(t.p,{children:"Explore is your starting point for smoothly moving between our documentation sections. Here, you'll get a quick overview of what each part covers. Dive into our Manifesto to understand our key beliefs. Then, jump into the Developers Quickstart for simple steps to get hands-on with our product if you prefer to dive into example first."}),"\n",(0,n.jsx)(t.h3,{id:"learn",children:"Learn"}),"\n",(0,n.jsx)(t.p,{children:"This section is your gateway to understanding our technology and foundational privacy principles. It provides a structured approach to learning, from system architecture and essential terminology to in-depth exploration of both basic and complex privacy concepts. It also addresses the limitations of our technology, ensuring you have a comprehensive understanding."}),"\n",(0,n.jsx)(t.h3,{id:"build",children:"Build"}),"\n",(0,n.jsx)(t.p,{children:'The "Build" section equips you with the necessary tools and documentation to start creating applications using our technology. It features a quickstart guide for immediate setup, detailed descriptions of our SDKs for Rust and TypeScript, and insights into our protocol, catering to developers at all skill levels.'}),"\n",(0,n.jsx)(t.h3,{id:"contribute",children:"Contribute"}),"\n",(0,n.jsx)(t.p,{children:'In the "Contribute" section, we invite you to actively participate in the development and improvement of our project. It provides detailed instructions on how to use GitHub for contributions, including environment setup, submission of changes, and community guidelines. Information on hackathons and available bounties is also included to engage with our community further.'}),"\n",(0,n.jsx)(t.h3,{id:"resources",children:"Resources"}),"\n",(0,n.jsx)(t.p,{children:'Our "Resources" section serves as a comprehensive directory of additional materials, including detailed documentation, community forums, and external readings. It is designed to support your ongoing learning and application of our technology.'}),"\n",(0,n.jsx)(t.h3,{id:"next-steps",children:"Next steps"}),"\n",(0,n.jsx)(t.p,{children:"Ready to embark on this journey? Welcome to Calimero Network!"})]})}function u(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},5710:(e,t,o)=>{o.d(t,{R:()=>s,x:()=>a});var n=o(758);const i={},r=n.createContext(i);function s(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[6391],{9442:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>u,frontMatter:()=>r,metadata:()=>a,toc:()=>d});var n=o(6070),i=o(5710);const r={id:"intro",title:"Introduction"},s=void 0,a={id:"explore/intro",title:"Introduction",description:"Welcome to Our Project Documentation",source:"@site/docs/01-explore/01-intro.mdx",sourceDirName:"01-explore",slug:"/explore/intro",permalink:"/explore/intro",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718723446e3,sidebarPosition:1,frontMatter:{id:"intro",title:"Introduction"},sidebar:"tutorialSidebar",next:{title:"Getting started",permalink:"/explore/developers-quickstart/getting-started"}},c={},d=[{value:"Welcome to Our Project Documentation",id:"welcome-to-our-project-documentation",level:2},{value:"Explore",id:"explore",level:3},{value:"Learn",id:"learn",level:3},{value:"Build",id:"build",level:3},{value:"Contribute",id:"contribute",level:3},{value:"Resources",id:"resources",level:3},{value:"Next steps",id:"next-steps",level:3}];function l(e){const t={h2:"h2",h3:"h3",p:"p",...(0,i.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.h2,{id:"welcome-to-our-project-documentation",children:"Welcome to Our Project Documentation"}),"\n",(0,n.jsx)(t.p,{children:"Welcome to our comprehensive documentation.\nHere, you'll find all the resources and guidance needed to understand and engage with our technology. Whether you are new to privacy technology or looking to deepen your existing knowledge, this documentation is structured to assist you every step of the way."}),"\n",(0,n.jsx)(t.p,{children:"Our documentation is divided into several key sections, each designed to provide you with detailed insights and practical tools:"}),"\n",(0,n.jsx)(t.h3,{id:"explore",children:"Explore"}),"\n",(0,n.jsx)(t.p,{children:"Explore is your starting point for smoothly moving between our documentation sections. Here, you'll get a quick overview of what each part covers. Dive into our Manifesto to understand our key beliefs. Then, jump into the Developers Quickstart for simple steps to get hands-on with our product if you prefer to dive into example first."}),"\n",(0,n.jsx)(t.h3,{id:"learn",children:"Learn"}),"\n",(0,n.jsx)(t.p,{children:"This section is your gateway to understanding our technology and foundational privacy principles. It provides a structured approach to learning, from system architecture and essential terminology to in-depth exploration of both basic and complex privacy concepts. It also addresses the limitations of our technology, ensuring you have a comprehensive understanding."}),"\n",(0,n.jsx)(t.h3,{id:"build",children:"Build"}),"\n",(0,n.jsx)(t.p,{children:'The "Build" section equips you with the necessary tools and documentation to start creating applications using our technology. It features a quickstart guide for immediate setup, detailed descriptions of our SDKs for Rust and TypeScript, and insights into our protocol, catering to developers at all skill levels.'}),"\n",(0,n.jsx)(t.h3,{id:"contribute",children:"Contribute"}),"\n",(0,n.jsx)(t.p,{children:'In the "Contribute" section, we invite you to actively participate in the development and improvement of our project. It provides detailed instructions on how to use GitHub for contributions, including environment setup, submission of changes, and community guidelines. Information on hackathons and available bounties is also included to engage with our community further.'}),"\n",(0,n.jsx)(t.h3,{id:"resources",children:"Resources"}),"\n",(0,n.jsx)(t.p,{children:'Our "Resources" section serves as a comprehensive directory of additional materials, including detailed documentation, community forums, and external readings. It is designed to support your ongoing learning and application of our technology.'}),"\n",(0,n.jsx)(t.h3,{id:"next-steps",children:"Next steps"}),"\n",(0,n.jsx)(t.p,{children:"Ready to embark on this journey? Welcome to Calimero Network!"})]})}function u(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(l,{...e})}):l(e)}},5710:(e,t,o)=>{o.d(t,{R:()=>s,x:()=>a});var n=o(758);const i={},r=n.createContext(i);function s(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/47adee10.b1191a4d.js b/assets/js/47adee10.7ab784fa.js similarity index 98% rename from assets/js/47adee10.b1191a4d.js rename to assets/js/47adee10.7ab784fa.js index 6631be3d..69e8cd68 100644 --- a/assets/js/47adee10.b1191a4d.js +++ b/assets/js/47adee10.7ab784fa.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2806],{3015:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>l,frontMatter:()=>r,metadata:()=>a,toc:()=>c});var o=n(6070),s=n(5710);const r={id:"community-and-support",title:"Community and Support"},i="Community and Support",a={id:"resources/community-and-support",title:"Community and Support",description:"We value our community and are here to support you. Here are the best ways to get in touch and find help:",source:"@site/docs/05-resources/01-community-and-support.mdx",sourceDirName:"05-resources",slug:"/resources/community-and-support",permalink:"/resources/community-and-support",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718634626e3,sidebarPosition:1,frontMatter:{id:"community-and-support",title:"Community and Support"},sidebar:"tutorialSidebar",previous:{title:"Bounty Program",permalink:"/contribute/bounty-program"},next:{title:"Learning",permalink:"/resources/learning"}},u={},c=[{value:"GitHub",id:"github",level:2},{value:"Discord",id:"discord",level:2},{value:"Social Media",id:"social-media",level:2}];function d(e){const t={a:"a",h1:"h1",h2:"h2",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"community-and-support",children:"Community and Support"}),"\n",(0,o.jsx)(t.p,{children:"We value our community and are here to support you. Here are the best ways to get in touch and find help:"}),"\n",(0,o.jsx)(t.h2,{id:"github",children:"GitHub"}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"Issues:"})," For development-related queries, bug reports, and feature requests, please use our ",(0,o.jsx)(t.a,{href:"https://github.com/calimero-network/core/issues",children:"GitHub Issues"}),"."]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"Discussions:"})," For more extensive discussions on various topics, join our ",(0,o.jsx)(t.a,{href:"https://github.com/orgs/calimero-network/discussions",children:"GitHub Discussions"}),"."]}),"\n"]}),"\n",(0,o.jsx)(t.h2,{id:"discord",children:"Discord"}),"\n",(0,o.jsxs)(t.p,{children:["For news, casual conversations, and random questions, join our ",(0,o.jsx)(t.a,{href:"https://discord.gg/jxAeJd2E",children:"Discord Server"}),". It\u2019s a great place to connect with other contributors, share ideas, and stay informed about the latest updates."]}),"\n",(0,o.jsx)(t.h2,{id:"social-media",children:"Social Media"}),"\n",(0,o.jsx)(t.p,{children:"Stay connected and get the latest news and updates by following us on social media:"}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"LinkedIn:"})," Follow us on ",(0,o.jsx)(t.a,{href:"https://www.linkedin.com/company/calimero-network/",children:"LinkedIn"})," for professional updates and networking opportunities."]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"Twitter:"})," Stay up-to-date with our latest tweets by following us on ",(0,o.jsx)(t.a,{href:"https://twitter.com/CalimeroNetwork",children:"Twitter"}),"."]}),"\n"]}),"\n",(0,o.jsx)(t.p,{children:"Thank you for being a part of the Calimero community. Your contributions and engagement help us grow and improve!"})]})}function l(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},5710:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>a});var o=n(758);const s={},r=o.createContext(s);function i(e){const t=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),o.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2806],{3015:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>u,contentTitle:()=>i,default:()=>l,frontMatter:()=>r,metadata:()=>a,toc:()=>c});var o=n(6070),s=n(5710);const r={id:"community-and-support",title:"Community and Support"},i="Community and Support",a={id:"resources/community-and-support",title:"Community and Support",description:"We value our community and are here to support you. Here are the best ways to get in touch and find help:",source:"@site/docs/05-resources/01-community-and-support.mdx",sourceDirName:"05-resources",slug:"/resources/community-and-support",permalink:"/resources/community-and-support",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718723446e3,sidebarPosition:1,frontMatter:{id:"community-and-support",title:"Community and Support"},sidebar:"tutorialSidebar",previous:{title:"Bounty Program",permalink:"/contribute/bounty-program"},next:{title:"Learning",permalink:"/resources/learning"}},u={},c=[{value:"GitHub",id:"github",level:2},{value:"Discord",id:"discord",level:2},{value:"Social Media",id:"social-media",level:2}];function d(e){const t={a:"a",h1:"h1",h2:"h2",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"community-and-support",children:"Community and Support"}),"\n",(0,o.jsx)(t.p,{children:"We value our community and are here to support you. Here are the best ways to get in touch and find help:"}),"\n",(0,o.jsx)(t.h2,{id:"github",children:"GitHub"}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"Issues:"})," For development-related queries, bug reports, and feature requests, please use our ",(0,o.jsx)(t.a,{href:"https://github.com/calimero-network/core/issues",children:"GitHub Issues"}),"."]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"Discussions:"})," For more extensive discussions on various topics, join our ",(0,o.jsx)(t.a,{href:"https://github.com/orgs/calimero-network/discussions",children:"GitHub Discussions"}),"."]}),"\n"]}),"\n",(0,o.jsx)(t.h2,{id:"discord",children:"Discord"}),"\n",(0,o.jsxs)(t.p,{children:["For news, casual conversations, and random questions, join our ",(0,o.jsx)(t.a,{href:"https://discord.gg/jxAeJd2E",children:"Discord Server"}),". It\u2019s a great place to connect with other contributors, share ideas, and stay informed about the latest updates."]}),"\n",(0,o.jsx)(t.h2,{id:"social-media",children:"Social Media"}),"\n",(0,o.jsx)(t.p,{children:"Stay connected and get the latest news and updates by following us on social media:"}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"LinkedIn:"})," Follow us on ",(0,o.jsx)(t.a,{href:"https://www.linkedin.com/company/calimero-network/",children:"LinkedIn"})," for professional updates and networking opportunities."]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"Twitter:"})," Stay up-to-date with our latest tweets by following us on ",(0,o.jsx)(t.a,{href:"https://twitter.com/CalimeroNetwork",children:"Twitter"}),"."]}),"\n"]}),"\n",(0,o.jsx)(t.p,{children:"Thank you for being a part of the Calimero community. Your contributions and engagement help us grow and improve!"})]})}function l(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},5710:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>a});var o=n(758);const s={},r=o.createContext(s);function i(e){const t=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),o.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/514a65da.5f8fb65e.js b/assets/js/514a65da.edaa5b78.js similarity index 97% rename from assets/js/514a65da.5f8fb65e.js rename to assets/js/514a65da.edaa5b78.js index 4d32da8a..6a0ea901 100644 --- a/assets/js/514a65da.5f8fb65e.js +++ b/assets/js/514a65da.edaa5b78.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[3182],{9830:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>r,default:()=>p,frontMatter:()=>i,metadata:()=>o,toc:()=>l});var s=n(6070),a=n(5710);const i={id:"storage",title:"Storage"},r=void 0,o={id:"learn/core-concepts/node/storage",title:"Storage",description:"The storage component in the Calimero Network is essential for managing and maintaining the data generated and utilized by decentralized applications (DApps). It ensures data integrity, security, and efficient access, enabling seamless operation of applications within the network.",source:"@site/docs/02-learn/03-core-concepts/02-node/04-storage.mdx",sourceDirName:"02-learn/03-core-concepts/02-node",slug:"/learn/core-concepts/node/storage",permalink:"/learn/core-concepts/node/storage",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718634626e3,sidebarPosition:4,frontMatter:{id:"storage",title:"Storage"},sidebar:"tutorialSidebar",previous:{title:"Server",permalink:"/learn/core-concepts/node/server"},next:{title:"Network",permalink:"/learn/core-concepts/node/network"}},c={},l=[{value:"Core Capabilities",id:"core-capabilities",level:3}];function d(e){const t={h3:"h3",li:"li",p:"p",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.p,{children:"The storage component in the Calimero Network is essential for managing and maintaining the data generated and utilized by decentralized applications (DApps). It ensures data integrity, security, and efficient access, enabling seamless operation of applications within the network."}),"\n",(0,s.jsx)(t.h3,{id:"core-capabilities",children:"Core Capabilities"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Generic Storage Interface"}),": Calimero provides a flexible storage interface that allows app developers to choose their preferred database. By default, Calimero uses RocksDB, but it can also support LevelDB, Sled, TigerBeetle, SQLite, or even cloud storage solutions like S3."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Context State Storage"}),": The context state is backed by a Patricia-Trie structure flattened into the key-value map of the datastore. This structure ensures efficient state management and retrieval."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Data Blobs"}),": The storage system handles non-state-transitional, encrypted blobs of data, similar to BitTorrent or IPFS. Nodes can lazily share these data blobs without needing centralized storage, ensuring efficient and secure data distribution across the network. By default, the blobstore is the local filesystem, but it can be configured to use any cloud storage option or content-addressed storage like IPFS."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Data Encryption"}),": All data stored within the network is encrypted at rest, ensuring that sensitive information remains protected. This includes both state-transitional data and non-state-transitional data like attached files in DMs or collaborative document assets."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Efficient Data Operations"}),": The storage component is optimized for quick data operations, ensuring that applications can access, retrieve, and update the data they need promptly. Caching mechanisms are employed to further improve data access speeds."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Garbage Collection"}),": The system includes mechanisms for garbage collection using reference counting for trie data, allowing for the cleanup of obsolete or redundant data. This helps in maintaining optimal storage performance and resource utilization."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Metrics and Monitoring"}),": The storage component provides detailed metrics on storage usage, including total usage and breakdowns by context. This allows for effective monitoring and management of storage resources."]}),"\n"]}),"\n"]})]})}function p(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},5710:(e,t,n)=>{n.d(t,{R:()=>r,x:()=>o});var s=n(758);const a={},i=s.createContext(a);function r(e){const t=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:r(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[3182],{9830:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>r,default:()=>p,frontMatter:()=>i,metadata:()=>o,toc:()=>l});var s=n(6070),a=n(5710);const i={id:"storage",title:"Storage"},r=void 0,o={id:"learn/core-concepts/node/storage",title:"Storage",description:"The storage component in the Calimero Network is essential for managing and maintaining the data generated and utilized by decentralized applications (DApps). It ensures data integrity, security, and efficient access, enabling seamless operation of applications within the network.",source:"@site/docs/02-learn/03-core-concepts/02-node/04-storage.mdx",sourceDirName:"02-learn/03-core-concepts/02-node",slug:"/learn/core-concepts/node/storage",permalink:"/learn/core-concepts/node/storage",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718723446e3,sidebarPosition:4,frontMatter:{id:"storage",title:"Storage"},sidebar:"tutorialSidebar",previous:{title:"Server",permalink:"/learn/core-concepts/node/server"},next:{title:"Network",permalink:"/learn/core-concepts/node/network"}},c={},l=[{value:"Core Capabilities",id:"core-capabilities",level:3}];function d(e){const t={h3:"h3",li:"li",p:"p",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.p,{children:"The storage component in the Calimero Network is essential for managing and maintaining the data generated and utilized by decentralized applications (DApps). It ensures data integrity, security, and efficient access, enabling seamless operation of applications within the network."}),"\n",(0,s.jsx)(t.h3,{id:"core-capabilities",children:"Core Capabilities"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Generic Storage Interface"}),": Calimero provides a flexible storage interface that allows app developers to choose their preferred database. By default, Calimero uses RocksDB, but it can also support LevelDB, Sled, TigerBeetle, SQLite, or even cloud storage solutions like S3."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Context State Storage"}),": The context state is backed by a Patricia-Trie structure flattened into the key-value map of the datastore. This structure ensures efficient state management and retrieval."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Data Blobs"}),": The storage system handles non-state-transitional, encrypted blobs of data, similar to BitTorrent or IPFS. Nodes can lazily share these data blobs without needing centralized storage, ensuring efficient and secure data distribution across the network. By default, the blobstore is the local filesystem, but it can be configured to use any cloud storage option or content-addressed storage like IPFS."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Data Encryption"}),": All data stored within the network is encrypted at rest, ensuring that sensitive information remains protected. This includes both state-transitional data and non-state-transitional data like attached files in DMs or collaborative document assets."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Efficient Data Operations"}),": The storage component is optimized for quick data operations, ensuring that applications can access, retrieve, and update the data they need promptly. Caching mechanisms are employed to further improve data access speeds."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Garbage Collection"}),": The system includes mechanisms for garbage collection using reference counting for trie data, allowing for the cleanup of obsolete or redundant data. This helps in maintaining optimal storage performance and resource utilization."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Metrics and Monitoring"}),": The storage component provides detailed metrics on storage usage, including total usage and breakdowns by context. This allows for effective monitoring and management of storage resources."]}),"\n"]}),"\n"]})]})}function p(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},5710:(e,t,n)=>{n.d(t,{R:()=>r,x:()=>o});var s=n(758);const a={},i=s.createContext(a);function r(e){const t=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:r(e.components),s.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5af830f1.4abe04d8.js b/assets/js/5af830f1.f05de863.js similarity index 96% rename from assets/js/5af830f1.4abe04d8.js rename to assets/js/5af830f1.f05de863.js index cff7fde8..4c0a8455 100644 --- a/assets/js/5af830f1.4abe04d8.js +++ b/assets/js/5af830f1.f05de863.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[1337],{5455:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>d,frontMatter:()=>s,metadata:()=>a,toc:()=>c});var o=n(6070),i=n(5710);const s={id:"ipfs",title:"IPFS"},r=void 0,a={id:"explore/why-not/ipfs",title:"IPFS",description:"Why not IPFS?",source:"@site/docs/01-explore/04-why-not/02-ipfs.mdx",sourceDirName:"01-explore/04-why-not",slug:"/explore/why-not/ipfs",permalink:"/explore/why-not/ipfs",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718634626e3,sidebarPosition:2,frontMatter:{id:"ipfs",title:"IPFS"},sidebar:"tutorialSidebar",previous:{title:"Blockchain",permalink:"/explore/why-not/blockchain"},next:{title:"ZK",permalink:"/explore/why-not/zk"}},l={},c=[{value:"Why not IPFS?",id:"why-not-ipfs",level:2},{value:"Calimero vs IPFS",id:"calimero-vs-ipfs",level:2}];function p(e){const t={h2:"h2",p:"p",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h2,{id:"why-not-ipfs",children:"Why not IPFS?"}),"\n",(0,o.jsx)(t.p,{children:"IPFS is a storage solution, it's not designed for generic compute."}),"\n",(0,o.jsx)(t.h2,{id:"calimero-vs-ipfs",children:"Calimero vs IPFS"}),"\n",(0,o.jsx)(t.p,{children:"Calimero is designed to be a general-purpose compute engine that can be used to build a wide variety of applications. Also worth noting that Calimero does offer a way to store encrypted data, effectively making it a storage solution as well."})]})}function d(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(p,{...e})}):p(e)}},5710:(e,t,n)=>{n.d(t,{R:()=>r,x:()=>a});var o=n(758);const i={},s=o.createContext(i);function r(e){const t=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),o.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[1337],{5455:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>r,default:()=>d,frontMatter:()=>s,metadata:()=>a,toc:()=>c});var o=n(6070),i=n(5710);const s={id:"ipfs",title:"IPFS"},r=void 0,a={id:"explore/why-not/ipfs",title:"IPFS",description:"Why not IPFS?",source:"@site/docs/01-explore/04-why-not/02-ipfs.mdx",sourceDirName:"01-explore/04-why-not",slug:"/explore/why-not/ipfs",permalink:"/explore/why-not/ipfs",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718723446e3,sidebarPosition:2,frontMatter:{id:"ipfs",title:"IPFS"},sidebar:"tutorialSidebar",previous:{title:"Blockchain",permalink:"/explore/why-not/blockchain"},next:{title:"ZK",permalink:"/explore/why-not/zk"}},l={},c=[{value:"Why not IPFS?",id:"why-not-ipfs",level:2},{value:"Calimero vs IPFS",id:"calimero-vs-ipfs",level:2}];function p(e){const t={h2:"h2",p:"p",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h2,{id:"why-not-ipfs",children:"Why not IPFS?"}),"\n",(0,o.jsx)(t.p,{children:"IPFS is a storage solution, it's not designed for generic compute."}),"\n",(0,o.jsx)(t.h2,{id:"calimero-vs-ipfs",children:"Calimero vs IPFS"}),"\n",(0,o.jsx)(t.p,{children:"Calimero is designed to be a general-purpose compute engine that can be used to build a wide variety of applications. Also worth noting that Calimero does offer a way to store encrypted data, effectively making it a storage solution as well."})]})}function d(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(p,{...e})}):p(e)}},5710:(e,t,n)=>{n.d(t,{R:()=>r,x:()=>a});var o=n(758);const i={},s=o.createContext(i);function r(e){const t=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),o.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5b892390.4b0e9fbd.js b/assets/js/5b892390.ab39a94a.js similarity index 98% rename from assets/js/5b892390.4b0e9fbd.js rename to assets/js/5b892390.ab39a94a.js index c18894f4..2c4a34c7 100644 --- a/assets/js/5b892390.4b0e9fbd.js +++ b/assets/js/5b892390.ab39a94a.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8725],{5635:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>p,frontMatter:()=>a,metadata:()=>o,toc:()=>l});var i=t(6070),s=t(5710);const a={id:"runtime",title:"Runtime"},r=void 0,o={id:"learn/core-concepts/node/runtime",title:"Runtime",description:"The runtime environment in the Calimero Network is essential for executing decentralized applications (DApps). It acts as a bridge between the application logic, the network, and storage layers, ensuring seamless operation and integration. The runtime ensures secure, isolated, and efficient execution of applications by managing resources effectively, supporting real-time event handling, enabling scalability, and providing robust storage and transaction management.",source:"@site/docs/02-learn/03-core-concepts/02-node/02-runtime.mdx",sourceDirName:"02-learn/03-core-concepts/02-node",slug:"/learn/core-concepts/node/runtime",permalink:"/learn/core-concepts/node/runtime",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718634626e3,sidebarPosition:2,frontMatter:{id:"runtime",title:"Runtime"},sidebar:"tutorialSidebar",previous:{title:"Client Node",permalink:"/learn/core-concepts/node/client-node"},next:{title:"Server",permalink:"/learn/core-concepts/node/server"}},c={},l=[{value:"Core Capabilities",id:"core-capabilities",level:3}];function d(e){const n={h3:"h3",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.p,{children:"The runtime environment in the Calimero Network is essential for executing decentralized applications (DApps). It acts as a bridge between the application logic, the network, and storage layers, ensuring seamless operation and integration. The runtime ensures secure, isolated, and efficient execution of applications by managing resources effectively, supporting real-time event handling, enabling scalability, and providing robust storage and transaction management."}),"\n",(0,i.jsx)(n.h3,{id:"core-capabilities",children:"Core Capabilities"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Security and Isolation"}),": The runtime provides a secure execution environment for Calimero applications using WebAssembly (WASM). Each application is sandboxed in the WASM VM, ensuring proper isolation and preventing interference between applications. This setup also ensures that applications cannot access unauthorized resources, maintaining a secure environment."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Multi-Application Support"}),": The runtime allows multiple applications to run concurrently on the same node and supports multiple instances (contexts) of the same application, each with its own state. This capability enhances the flexibility and scalability of the network."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Scoped Storage"}),": The runtime manages storage by partitioning it and governing where each context stores its state. These implementation details are abstracted from the app developer, ensuring that storage management is handled seamlessly and securely."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Atomic Transactions"}),": The runtime guarantees atomic transactions, ensuring that if a transaction fails, it is completely rolled back with no state updates or side effects detected. This guarantees consistency and reliability in the application's state and any connected clients."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Log Collection and Relaying Events"}),": The runtime facilitates log collection and relays events emitted by the applications to connected clients, enabling real-time monitoring and interaction."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Resource Management"}),": The runtime defines resource limits for applications to ensure fair usage and prevent malicious behavior. This includes limiting CPU, memory, and network usage to prevent any single application from monopolizing system resources or compromising the host system."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Task Management and Performance"}),": The runtime keeps track of WASM instances up to a defined threshold, effortlessly queueing transactions to reuse live instances and shutting down stale ones to reclaim system resources. These optimizations ensure efficient resource utilization and improved performance."]}),"\n"]}),"\n"]})]})}function p(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},5710:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>o});var i=t(758);const s={},a=i.createContext(s);function r(e){const n=i.useContext(a);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8725],{5635:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>p,frontMatter:()=>a,metadata:()=>o,toc:()=>l});var i=t(6070),s=t(5710);const a={id:"runtime",title:"Runtime"},r=void 0,o={id:"learn/core-concepts/node/runtime",title:"Runtime",description:"The runtime environment in the Calimero Network is essential for executing decentralized applications (DApps). It acts as a bridge between the application logic, the network, and storage layers, ensuring seamless operation and integration. The runtime ensures secure, isolated, and efficient execution of applications by managing resources effectively, supporting real-time event handling, enabling scalability, and providing robust storage and transaction management.",source:"@site/docs/02-learn/03-core-concepts/02-node/02-runtime.mdx",sourceDirName:"02-learn/03-core-concepts/02-node",slug:"/learn/core-concepts/node/runtime",permalink:"/learn/core-concepts/node/runtime",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718723446e3,sidebarPosition:2,frontMatter:{id:"runtime",title:"Runtime"},sidebar:"tutorialSidebar",previous:{title:"Client Node",permalink:"/learn/core-concepts/node/client-node"},next:{title:"Server",permalink:"/learn/core-concepts/node/server"}},c={},l=[{value:"Core Capabilities",id:"core-capabilities",level:3}];function d(e){const n={h3:"h3",li:"li",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.p,{children:"The runtime environment in the Calimero Network is essential for executing decentralized applications (DApps). It acts as a bridge between the application logic, the network, and storage layers, ensuring seamless operation and integration. The runtime ensures secure, isolated, and efficient execution of applications by managing resources effectively, supporting real-time event handling, enabling scalability, and providing robust storage and transaction management."}),"\n",(0,i.jsx)(n.h3,{id:"core-capabilities",children:"Core Capabilities"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Security and Isolation"}),": The runtime provides a secure execution environment for Calimero applications using WebAssembly (WASM). Each application is sandboxed in the WASM VM, ensuring proper isolation and preventing interference between applications. This setup also ensures that applications cannot access unauthorized resources, maintaining a secure environment."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Multi-Application Support"}),": The runtime allows multiple applications to run concurrently on the same node and supports multiple instances (contexts) of the same application, each with its own state. This capability enhances the flexibility and scalability of the network."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Scoped Storage"}),": The runtime manages storage by partitioning it and governing where each context stores its state. These implementation details are abstracted from the app developer, ensuring that storage management is handled seamlessly and securely."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Atomic Transactions"}),": The runtime guarantees atomic transactions, ensuring that if a transaction fails, it is completely rolled back with no state updates or side effects detected. This guarantees consistency and reliability in the application's state and any connected clients."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Log Collection and Relaying Events"}),": The runtime facilitates log collection and relays events emitted by the applications to connected clients, enabling real-time monitoring and interaction."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Resource Management"}),": The runtime defines resource limits for applications to ensure fair usage and prevent malicious behavior. This includes limiting CPU, memory, and network usage to prevent any single application from monopolizing system resources or compromising the host system."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Task Management and Performance"}),": The runtime keeps track of WASM instances up to a defined threshold, effortlessly queueing transactions to reuse live instances and shutting down stale ones to reclaim system resources. These optimizations ensure efficient resource utilization and improved performance."]}),"\n"]}),"\n"]})]})}function p(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},5710:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>o});var i=t(758);const s={},a=i.createContext(s);function r(e){const n=i.useContext(a);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5bb4bac1.dc15264e.js b/assets/js/5bb4bac1.4eb34ae2.js similarity index 98% rename from assets/js/5bb4bac1.dc15264e.js rename to assets/js/5bb4bac1.4eb34ae2.js index 2e40895f..4fbcc1f7 100644 --- a/assets/js/5bb4bac1.dc15264e.js +++ b/assets/js/5bb4bac1.4eb34ae2.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[3331],{2374:(t,e,o)=>{o.r(e),o.d(e,{assets:()=>c,contentTitle:()=>s,default:()=>h,frontMatter:()=>n,metadata:()=>u,toc:()=>l});var i=o(6070),r=o(5710);const n={id:"github",title:"GitHub"},s=void 0,u={id:"contribute/github",title:"GitHub",description:"All work on Calimero happens directly on GitHub. Both core team members and external contributors send pull requests which go through the same review process.",source:"@site/docs/04-contribute/01-github.mdx",sourceDirName:"04-contribute",slug:"/contribute/github",permalink:"/contribute/github",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718634626e3,sidebarPosition:1,frontMatter:{id:"github",title:"GitHub"},sidebar:"tutorialSidebar",previous:{title:"Publish App",permalink:"/build/publish-app"},next:{title:"Hackathons",permalink:"/contribute/hackathons"}},c={},l=[{value:"How to Contribute",id:"how-to-contribute",level:2},{value:"Additional Ways to Contribute",id:"additional-ways-to-contribute",level:2}];function a(t){const e={a:"a",h2:"h2",li:"li",p:"p",strong:"strong",ul:"ul",...(0,r.R)(),...t.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(e.p,{children:"All work on Calimero happens directly on GitHub. Both core team members and external contributors send pull requests which go through the same review process."}),"\n",(0,i.jsx)(e.h2,{id:"how-to-contribute",children:"How to Contribute"}),"\n",(0,i.jsxs)(e.p,{children:["We appreciate your interest in contributing to our project! To get started with contributing, please follow the instructions outlined in our ",(0,i.jsx)(e.a,{href:"https://github.com/calimero-network/core/blob/master/CONTRIBUTING.md",children:"CONTRIBUTING"})," file."]}),"\n",(0,i.jsx)(e.h2,{id:"additional-ways-to-contribute",children:"Additional Ways to Contribute"}),"\n",(0,i.jsxs)(e.ul,{children:["\n",(0,i.jsxs)(e.li,{children:[(0,i.jsx)(e.strong,{children:"Show Your Support:"})," If you find this project helpful, please star it on GitHub. Your stars help the project grow and reach more developers like you."]}),"\n",(0,i.jsxs)(e.li,{children:[(0,i.jsx)(e.strong,{children:"Spread the Word:"})," Share the project with your friends and colleagues who might be interested in contributing or using it."]}),"\n",(0,i.jsxs)(e.li,{children:[(0,i.jsx)(e.strong,{children:"Join Discussions:"})," Participate in discussions on GitHub ",(0,i.jsx)(e.a,{href:"https://github.com/calimero-network/core/issues",children:"Issues"})," or ",(0,i.jsx)(e.a,{href:"https://github.com/orgs/calimero-network/discussions",children:"Discussions"})," to share your ideas and provide feedback."]}),"\n",(0,i.jsxs)(e.li,{children:[(0,i.jsx)(e.strong,{children:"Write Tutorials or Blog Posts:"})," Create tutorials or blog posts about how to use the project or your experience contributing to it."]}),"\n"]})]})}function h(t={}){const{wrapper:e}={...(0,r.R)(),...t.components};return e?(0,i.jsx)(e,{...t,children:(0,i.jsx)(a,{...t})}):a(t)}},5710:(t,e,o)=>{o.d(e,{R:()=>s,x:()=>u});var i=o(758);const r={},n=i.createContext(r);function s(t){const e=i.useContext(n);return i.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function u(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(r):t.components||r:s(t.components),i.createElement(n.Provider,{value:e},t.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[3331],{2374:(t,e,o)=>{o.r(e),o.d(e,{assets:()=>c,contentTitle:()=>s,default:()=>h,frontMatter:()=>n,metadata:()=>u,toc:()=>l});var i=o(6070),r=o(5710);const n={id:"github",title:"GitHub"},s=void 0,u={id:"contribute/github",title:"GitHub",description:"All work on Calimero happens directly on GitHub. Both core team members and external contributors send pull requests which go through the same review process.",source:"@site/docs/04-contribute/01-github.mdx",sourceDirName:"04-contribute",slug:"/contribute/github",permalink:"/contribute/github",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718723446e3,sidebarPosition:1,frontMatter:{id:"github",title:"GitHub"},sidebar:"tutorialSidebar",previous:{title:"Publish App",permalink:"/build/publish-app"},next:{title:"Hackathons",permalink:"/contribute/hackathons"}},c={},l=[{value:"How to Contribute",id:"how-to-contribute",level:2},{value:"Additional Ways to Contribute",id:"additional-ways-to-contribute",level:2}];function a(t){const e={a:"a",h2:"h2",li:"li",p:"p",strong:"strong",ul:"ul",...(0,r.R)(),...t.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(e.p,{children:"All work on Calimero happens directly on GitHub. Both core team members and external contributors send pull requests which go through the same review process."}),"\n",(0,i.jsx)(e.h2,{id:"how-to-contribute",children:"How to Contribute"}),"\n",(0,i.jsxs)(e.p,{children:["We appreciate your interest in contributing to our project! To get started with contributing, please follow the instructions outlined in our ",(0,i.jsx)(e.a,{href:"https://github.com/calimero-network/core/blob/master/CONTRIBUTING.md",children:"CONTRIBUTING"})," file."]}),"\n",(0,i.jsx)(e.h2,{id:"additional-ways-to-contribute",children:"Additional Ways to Contribute"}),"\n",(0,i.jsxs)(e.ul,{children:["\n",(0,i.jsxs)(e.li,{children:[(0,i.jsx)(e.strong,{children:"Show Your Support:"})," If you find this project helpful, please star it on GitHub. Your stars help the project grow and reach more developers like you."]}),"\n",(0,i.jsxs)(e.li,{children:[(0,i.jsx)(e.strong,{children:"Spread the Word:"})," Share the project with your friends and colleagues who might be interested in contributing or using it."]}),"\n",(0,i.jsxs)(e.li,{children:[(0,i.jsx)(e.strong,{children:"Join Discussions:"})," Participate in discussions on GitHub ",(0,i.jsx)(e.a,{href:"https://github.com/calimero-network/core/issues",children:"Issues"})," or ",(0,i.jsx)(e.a,{href:"https://github.com/orgs/calimero-network/discussions",children:"Discussions"})," to share your ideas and provide feedback."]}),"\n",(0,i.jsxs)(e.li,{children:[(0,i.jsx)(e.strong,{children:"Write Tutorials or Blog Posts:"})," Create tutorials or blog posts about how to use the project or your experience contributing to it."]}),"\n"]})]})}function h(t={}){const{wrapper:e}={...(0,r.R)(),...t.components};return e?(0,i.jsx)(e,{...t,children:(0,i.jsx)(a,{...t})}):a(t)}},5710:(t,e,o)=>{o.d(e,{R:()=>s,x:()=>u});var i=o(758);const r={},n=i.createContext(r);function s(t){const e=i.useContext(n);return i.useMemo((function(){return"function"==typeof t?t(e):{...e,...t}}),[e,t])}function u(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(r):t.components||r:s(t.components),i.createElement(n.Provider,{value:e},t.children)}}}]); \ No newline at end of file diff --git a/assets/js/64bee9bd.7d2cf865.js b/assets/js/64bee9bd.72042f37.js similarity index 98% rename from assets/js/64bee9bd.7d2cf865.js rename to assets/js/64bee9bd.72042f37.js index d72348c0..d1fb57f8 100644 --- a/assets/js/64bee9bd.7d2cf865.js +++ b/assets/js/64bee9bd.72042f37.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2074],{9864:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>s,metadata:()=>o,toc:()=>l});var t=i(6070),r=i(5710);const s={id:"encryption",title:"Encryption"},a=void 0,o={id:"learn/advanced-concepts/encryption",title:"Encryption",description:"Encryption in Calimero ensures data security in transit over the network, maintaining confidentiality and integrity.",source:"@site/docs/02-learn/04-advanced-concepts/02-encryption.mdx",sourceDirName:"02-learn/04-advanced-concepts",slug:"/learn/advanced-concepts/encryption",permalink:"/learn/advanced-concepts/encryption",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718634626e3,sidebarPosition:2,frontMatter:{id:"encryption",title:"Encryption"},sidebar:"tutorialSidebar",previous:{title:"Specialized Nodes",permalink:"/learn/advanced-concepts/specialized-nodes"},next:{title:"Quickstart",permalink:"/build/quickstart"}},c={},l=[{value:"Key Principles",id:"key-principles",level:3},{value:"Double Ratchet Algorithm",id:"double-ratchet-algorithm",level:3},{value:"Tree-Based Diffie-Hellman Key Exchange",id:"tree-based-diffie-hellman-key-exchange",level:3}];function d(e){const n={h3:"h3",li:"li",ol:"ol",p:"p",strong:"strong",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:"Encryption in Calimero ensures data security in transit over the network, maintaining confidentiality and integrity."}),"\n",(0,t.jsx)(n.h3,{id:"key-principles",children:"Key Principles"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Forward Secrecy"}),": Ensuring past messages remain secure even if a key is compromised in the future."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Post-Compromise Security"}),": Ensuring future messages remain secure even after any previous message has been compromised."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Zero Trust in Third Parties"}),": No reliance on intermediaries for security."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Verifiable End-to-End Encryption"}),": Confirming that only the intended recipients can read the messages."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Asynchronous Communication"}),": Ability to start communications without recipients being online."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Multi-Device Support"}),": Ensuring seamless use across multiple devices."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Deniability"}),": Providing plausible deniability for message authorship to non-context members."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Non-Interactive Group Management"}),": Adding and removing context members without requiring interaction."]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"double-ratchet-algorithm",children:"Double Ratchet Algorithm"}),"\n",(0,t.jsx)(n.p,{children:"Each network message uses a distinct encryption key derived from the ratchet state, providing forward secrecy by ensuring that the compromise of one key does not affect the security of previous messages."}),"\n",(0,t.jsx)(n.p,{children:"Each context can configure Diffie-Hellman reset parameters. For one-on-one peer interactions, resets can occur instantaneously, while for larger groups, resets can happen at non-deterministic intervals to balance security and performance."}),"\n",(0,t.jsx)(n.h3,{id:"tree-based-diffie-hellman-key-exchange",children:"Tree-Based Diffie-Hellman Key Exchange"}),"\n",(0,t.jsx)(n.p,{children:"All contexts use a tree-based Diffie-Hellman key exchange. This method efficiently manages shared secrets among multiple members, ensuring that keys are updated and propagated correctly. The reset of keys occurs at the leaf nodes of the tree, guaranteeing post-compromise security."}),"\n",(0,t.jsx)(n.p,{children:"Adding a new member involves existing members using their prekeys to complete an X3DH (Triple Diffie-Hellman) exchange, securely adding the new member without requiring direct interaction. Removing a member involves invalidating their keys and updating the shared secrets among remaining members, ensuring efficient and secure updates."}),"\n",(0,t.jsx)(n.p,{children:"By leveraging advanced encryption techniques such as the Double Ratchet Algorithm and tree-based Diffie-Hellman key exchange, Calimero ensures that all data in transit is protected, maintaining the confidentiality and integrity of network messages."})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},5710:(e,n,i)=>{i.d(n,{R:()=>a,x:()=>o});var t=i(758);const r={},s=t.createContext(r);function a(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2074],{9864:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>s,metadata:()=>o,toc:()=>l});var t=i(6070),r=i(5710);const s={id:"encryption",title:"Encryption"},a=void 0,o={id:"learn/advanced-concepts/encryption",title:"Encryption",description:"Encryption in Calimero ensures data security in transit over the network, maintaining confidentiality and integrity.",source:"@site/docs/02-learn/04-advanced-concepts/02-encryption.mdx",sourceDirName:"02-learn/04-advanced-concepts",slug:"/learn/advanced-concepts/encryption",permalink:"/learn/advanced-concepts/encryption",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718723446e3,sidebarPosition:2,frontMatter:{id:"encryption",title:"Encryption"},sidebar:"tutorialSidebar",previous:{title:"Specialized Nodes",permalink:"/learn/advanced-concepts/specialized-nodes"},next:{title:"Quickstart",permalink:"/build/quickstart"}},c={},l=[{value:"Key Principles",id:"key-principles",level:3},{value:"Double Ratchet Algorithm",id:"double-ratchet-algorithm",level:3},{value:"Tree-Based Diffie-Hellman Key Exchange",id:"tree-based-diffie-hellman-key-exchange",level:3}];function d(e){const n={h3:"h3",li:"li",ol:"ol",p:"p",strong:"strong",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:"Encryption in Calimero ensures data security in transit over the network, maintaining confidentiality and integrity."}),"\n",(0,t.jsx)(n.h3,{id:"key-principles",children:"Key Principles"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Forward Secrecy"}),": Ensuring past messages remain secure even if a key is compromised in the future."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Post-Compromise Security"}),": Ensuring future messages remain secure even after any previous message has been compromised."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Zero Trust in Third Parties"}),": No reliance on intermediaries for security."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Verifiable End-to-End Encryption"}),": Confirming that only the intended recipients can read the messages."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Asynchronous Communication"}),": Ability to start communications without recipients being online."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Multi-Device Support"}),": Ensuring seamless use across multiple devices."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Deniability"}),": Providing plausible deniability for message authorship to non-context members."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Non-Interactive Group Management"}),": Adding and removing context members without requiring interaction."]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"double-ratchet-algorithm",children:"Double Ratchet Algorithm"}),"\n",(0,t.jsx)(n.p,{children:"Each network message uses a distinct encryption key derived from the ratchet state, providing forward secrecy by ensuring that the compromise of one key does not affect the security of previous messages."}),"\n",(0,t.jsx)(n.p,{children:"Each context can configure Diffie-Hellman reset parameters. For one-on-one peer interactions, resets can occur instantaneously, while for larger groups, resets can happen at non-deterministic intervals to balance security and performance."}),"\n",(0,t.jsx)(n.h3,{id:"tree-based-diffie-hellman-key-exchange",children:"Tree-Based Diffie-Hellman Key Exchange"}),"\n",(0,t.jsx)(n.p,{children:"All contexts use a tree-based Diffie-Hellman key exchange. This method efficiently manages shared secrets among multiple members, ensuring that keys are updated and propagated correctly. The reset of keys occurs at the leaf nodes of the tree, guaranteeing post-compromise security."}),"\n",(0,t.jsx)(n.p,{children:"Adding a new member involves existing members using their prekeys to complete an X3DH (Triple Diffie-Hellman) exchange, securely adding the new member without requiring direct interaction. Removing a member involves invalidating their keys and updating the shared secrets among remaining members, ensuring efficient and secure updates."}),"\n",(0,t.jsx)(n.p,{children:"By leveraging advanced encryption techniques such as the Double Ratchet Algorithm and tree-based Diffie-Hellman key exchange, Calimero ensures that all data in transit is protected, maintaining the confidentiality and integrity of network messages."})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},5710:(e,n,i)=>{i.d(n,{R:()=>a,x:()=>o});var t=i(758);const r={},s=t.createContext(r);function a(e){const n=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/66902dc0.6085e384.js b/assets/js/66902dc0.ee163aab.js similarity index 98% rename from assets/js/66902dc0.6085e384.js rename to assets/js/66902dc0.ee163aab.js index 64a787b1..884f0026 100644 --- a/assets/js/66902dc0.6085e384.js +++ b/assets/js/66902dc0.ee163aab.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[4811],{3259:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>u,contentTitle:()=>s,default:()=>d,frontMatter:()=>i,metadata:()=>a,toc:()=>l});var o=t(6070),r=t(5710);const i={id:"bounty-program",title:"Bounty Program"},s="Bounty Program",a={id:"contribute/bounty-program",title:"Bounty Program",description:"We're excited to announce that Calimero will soon be launching a bounty program! This program is designed to reward contributors who help us tackle various issues and enhance our project.",source:"@site/docs/04-contribute/03-bounty-program.mdx",sourceDirName:"04-contribute",slug:"/contribute/bounty-program",permalink:"/contribute/bounty-program",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718634626e3,sidebarPosition:3,frontMatter:{id:"bounty-program",title:"Bounty Program"},sidebar:"tutorialSidebar",previous:{title:"Hackathons",permalink:"/contribute/hackathons"},next:{title:"Community and Support",permalink:"/resources/community-and-support"}},u={},l=[{value:"What is a Bounty Program?",id:"what-is-a-bounty-program",level:2},{value:"How it Works",id:"how-it-works",level:2},{value:"Exceptional Contributions",id:"exceptional-contributions",level:3},{value:"Stay Tuned",id:"stay-tuned",level:2}];function c(e){const n={a:"a",h1:"h1",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",strong:"strong",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"bounty-program",children:"Bounty Program"}),"\n",(0,o.jsx)(n.p,{children:"We're excited to announce that Calimero will soon be launching a bounty program! This program is designed to reward contributors who help us tackle various issues and enhance our project."}),"\n",(0,o.jsx)(n.h2,{id:"what-is-a-bounty-program",children:"What is a Bounty Program?"}),"\n",(0,o.jsx)(n.p,{children:"A bounty program is an initiative where contributors can earn rewards for completing specific tasks or resolving issues. These tasks can range from fixing bugs to adding new features, improving documentation, or optimizing performance. The rewards can vary and may include monetary compensation, swag, exclusive access to new features, or public recognition."}),"\n",(0,o.jsx)(n.h2,{id:"how-it-works",children:"How it Works"}),"\n",(0,o.jsx)(n.p,{children:"While we are still in the process of finalizing the details of our bounty program, here\u2019s an overview of how it will function:"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Identify Bounty Issues:"})," We will mark specific ",(0,o.jsx)(n.a,{href:"https://github.com/calimero-network/core/issues",children:"issues"}),' in our repository with a "bounty" label. These issues will be eligible for rewards.']}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Contribute:"})," Choose a bounty-labeled issue that interests you, solve it, and submit a pull request."]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Review:"})," Our team will review your contribution. If your solution meets the requirements and quality standards, it will be merged."]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Reward:"})," Once the issue is resolved and your contribution is accepted, you will receive a reward. The exact nature of the reward will be specified in the issue description."]}),"\n"]}),"\n",(0,o.jsx)(n.h3,{id:"exceptional-contributions",children:"Exceptional Contributions"}),"\n",(0,o.jsx)(n.p,{children:"While not all issues may be marked with a bounty label, we recognize that exceptional solutions deserve recognition. If you provide a particularly outstanding solution to an issue not marked as a bounty, we may still decide to reward your contribution."}),"\n",(0,o.jsx)(n.h2,{id:"stay-tuned",children:"Stay Tuned"}),"\n",(0,o.jsx)(n.p,{children:"We are currently refining the details of our bounty program, including the reward system. Follow us on social media and keep an eye on our announcements to be the first to know when the bounty program goes live."}),"\n",(0,o.jsx)(n.p,{children:"Thank you for your patience and continued support. We look forward to collaborating with you and rewarding your valuable contributions!"})]})}function d(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},5710:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>a});var o=t(758);const r={},i=o.createContext(r);function s(e){const n=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),o.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[4811],{3259:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>u,contentTitle:()=>s,default:()=>d,frontMatter:()=>i,metadata:()=>a,toc:()=>l});var o=t(6070),r=t(5710);const i={id:"bounty-program",title:"Bounty Program"},s="Bounty Program",a={id:"contribute/bounty-program",title:"Bounty Program",description:"We're excited to announce that Calimero will soon be launching a bounty program! This program is designed to reward contributors who help us tackle various issues and enhance our project.",source:"@site/docs/04-contribute/03-bounty-program.mdx",sourceDirName:"04-contribute",slug:"/contribute/bounty-program",permalink:"/contribute/bounty-program",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718723446e3,sidebarPosition:3,frontMatter:{id:"bounty-program",title:"Bounty Program"},sidebar:"tutorialSidebar",previous:{title:"Hackathons",permalink:"/contribute/hackathons"},next:{title:"Community and Support",permalink:"/resources/community-and-support"}},u={},l=[{value:"What is a Bounty Program?",id:"what-is-a-bounty-program",level:2},{value:"How it Works",id:"how-it-works",level:2},{value:"Exceptional Contributions",id:"exceptional-contributions",level:3},{value:"Stay Tuned",id:"stay-tuned",level:2}];function c(e){const n={a:"a",h1:"h1",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",strong:"strong",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h1,{id:"bounty-program",children:"Bounty Program"}),"\n",(0,o.jsx)(n.p,{children:"We're excited to announce that Calimero will soon be launching a bounty program! This program is designed to reward contributors who help us tackle various issues and enhance our project."}),"\n",(0,o.jsx)(n.h2,{id:"what-is-a-bounty-program",children:"What is a Bounty Program?"}),"\n",(0,o.jsx)(n.p,{children:"A bounty program is an initiative where contributors can earn rewards for completing specific tasks or resolving issues. These tasks can range from fixing bugs to adding new features, improving documentation, or optimizing performance. The rewards can vary and may include monetary compensation, swag, exclusive access to new features, or public recognition."}),"\n",(0,o.jsx)(n.h2,{id:"how-it-works",children:"How it Works"}),"\n",(0,o.jsx)(n.p,{children:"While we are still in the process of finalizing the details of our bounty program, here\u2019s an overview of how it will function:"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Identify Bounty Issues:"})," We will mark specific ",(0,o.jsx)(n.a,{href:"https://github.com/calimero-network/core/issues",children:"issues"}),' in our repository with a "bounty" label. These issues will be eligible for rewards.']}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Contribute:"})," Choose a bounty-labeled issue that interests you, solve it, and submit a pull request."]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Review:"})," Our team will review your contribution. If your solution meets the requirements and quality standards, it will be merged."]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Reward:"})," Once the issue is resolved and your contribution is accepted, you will receive a reward. The exact nature of the reward will be specified in the issue description."]}),"\n"]}),"\n",(0,o.jsx)(n.h3,{id:"exceptional-contributions",children:"Exceptional Contributions"}),"\n",(0,o.jsx)(n.p,{children:"While not all issues may be marked with a bounty label, we recognize that exceptional solutions deserve recognition. If you provide a particularly outstanding solution to an issue not marked as a bounty, we may still decide to reward your contribution."}),"\n",(0,o.jsx)(n.h2,{id:"stay-tuned",children:"Stay Tuned"}),"\n",(0,o.jsx)(n.p,{children:"We are currently refining the details of our bounty program, including the reward system. Follow us on social media and keep an eye on our announcements to be the first to know when the bounty program goes live."}),"\n",(0,o.jsx)(n.p,{children:"Thank you for your patience and continued support. We look forward to collaborating with you and rewarding your valuable contributions!"})]})}function d(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},5710:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>a});var o=t(758);const r={},i=o.createContext(r);function s(e){const n=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),o.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/73ad1aec.9b45772d.js b/assets/js/73ad1aec.067759a6.js similarity index 99% rename from assets/js/73ad1aec.9b45772d.js rename to assets/js/73ad1aec.067759a6.js index 6fe05c95..2a26127c 100644 --- a/assets/js/73ad1aec.9b45772d.js +++ b/assets/js/73ad1aec.067759a6.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[7420],{2770:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>p,frontMatter:()=>a,metadata:()=>s,toc:()=>l});var i=t(6070),o=t(5710);const a={id:"client-node",title:"Client Node"},r=void 0,s={id:"learn/core-concepts/node/client-node",title:"Client Node",description:"Runtime",source:"@site/docs/02-learn/03-core-concepts/02-node/01-client-node.mdx",sourceDirName:"02-learn/03-core-concepts/02-node",slug:"/learn/core-concepts/node/client-node",permalink:"/learn/core-concepts/node/client-node",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718634626e3,sidebarPosition:1,frontMatter:{id:"client-node",title:"Client Node"},sidebar:"tutorialSidebar",previous:{title:"Identity",permalink:"/learn/core-concepts/identity"},next:{title:"Runtime",permalink:"/learn/core-concepts/node/runtime"}},c={},l=[{value:"Runtime",id:"runtime",level:3},{value:"Recommendations for Developers: Thorough testing of applications in a controlled environment is advised before deploying them in production to ensure stability and security. Additionally, developers are encouraged to implement locked update rules to prevent unauthorized modifications to the application's behavior.",id:"recommendations-for-developers-thorough-testing-of-applications-in-a-controlled-environment-is-advised-before-deploying-them-in-production-to-ensure-stability-and-security-additionally-developers-are-encouraged-to-implement-locked-update-rules-to-prevent-unauthorized-modifications-to-the-applications-behavior",level:4},{value:"Storage",id:"storage",level:3},{value:"Encryption:",id:"encryption",level:3},{value:"Identity Management",id:"identity-management",level:3},{value:"Authentication",id:"authentication",level:3},{value:"Key Management",id:"key-management",level:3},{value:"Application Marketplace",id:"application-marketplace",level:3}];function d(e){const n={h3:"h3",h4:"h4",li:"li",p:"p",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h3,{id:"runtime",children:"Runtime"}),"\n",(0,i.jsx)(n.p,{children:"Overview: The runtime environment of a client node in the Calimero Network is crucial for the execution of decentralized applications (DApps), particularly those compiled to WebAssembly (WASM)."}),"\n",(0,i.jsx)(n.p,{children:"Functionality:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"State Synchronization: Each node can download and synchronize the state with existing applications, ensuring that all nodes participating in a particular application network are consistent and up-to-date."}),"\n",(0,i.jsx)(n.li,{children:"Application Settings: Nodes can be configured with specific settings for each application, including which WASM modules to run, source URLs for fetching these modules, encryption protocols to be used, and more."}),"\n",(0,i.jsx)(n.li,{children:"Network Topology & Update Rules: Defines the structure of the network and how nodes communicate and update each other. Proper update rules are crucial for application security and integrity, particularly in a decentralized setting where trust is distributed."}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"recommendations-for-developers-thorough-testing-of-applications-in-a-controlled-environment-is-advised-before-deploying-them-in-production-to-ensure-stability-and-security-additionally-developers-are-encouraged-to-implement-locked-update-rules-to-prevent-unauthorized-modifications-to-the-applications-behavior",children:"Recommendations for Developers: Thorough testing of applications in a controlled environment is advised before deploying them in production to ensure stability and security. Additionally, developers are encouraged to implement locked update rules to prevent unauthorized modifications to the application's behavior."}),"\n",(0,i.jsx)(n.h3,{id:"storage",children:"Storage"}),"\n",(0,i.jsx)(n.p,{children:"Overview: Storage on client nodes involves maintaining the state and data required for the decentralized applications they support."}),"\n",(0,i.jsx)(n.p,{children:"Functionality:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Local Storage: Each node stores application data locally, contributing to the overall decentralized storage model of the network. This ensures that data is distributed across the network, enhancing privacy and resilience against central points of failure."}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"encryption",children:"Encryption:"}),"\n",(0,i.jsx)(n.p,{children:"Data stored on client nodes can be encrypted, providing an additional layer of security and privacy for user data."}),"\n",(0,i.jsx)(n.h3,{id:"identity-management",children:"Identity Management"}),"\n",(0,i.jsx)(n.p,{children:"Overview: Managing identities on the Calimero Network is fundamental for ensuring secure and private interactions between nodes and applications.\nFunctionality:"}),"\n",(0,i.jsx)(n.h3,{id:"authentication",children:"Authentication"}),"\n",(0,i.jsx)(n.p,{children:"Nodes implement mechanisms for authenticating users and applications, ensuring that interactions are secure and that entities are who they claim to be."}),"\n",(0,i.jsx)(n.h3,{id:"key-management",children:"Key Management"}),"\n",(0,i.jsx)(n.p,{children:"The management of cryptographic keys is an integral part of identity management, enabling secure communication and data encryption across the network."}),"\n",(0,i.jsx)(n.h3,{id:"application-marketplace",children:"Application Marketplace"}),"\n",(0,i.jsx)(n.p,{children:"Current State: The marketplace for decentralized applications within the Calimero Network is facilitated by a smart contract on the NEAR blockchain, with application data and metadata hosted on IPFS. This setup serves as a temporary solution while further community engagement and discussions are underway to refine the marketplace's infrastructure and governance.\nThe Calimero Network's approach to client nodes emphasizes security, decentralization, and privacy, with a strong recommendation for users to engage with applications that have securely locked update mechanisms. These applications are more reliable for critical use cases and are the only ones featured in the official marketplace, ensuring a curated and trustworthy selection of DApps for users. This framework demonstrates Calimero Network's commitment to building a secure and user-centric decentralized ecosystem."})]})}function p(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},5710:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>s});var i=t(758);const o={},a=i.createContext(o);function r(e){const n=i.useContext(a);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),i.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[7420],{2770:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>p,frontMatter:()=>a,metadata:()=>s,toc:()=>l});var i=t(6070),o=t(5710);const a={id:"client-node",title:"Client Node"},r=void 0,s={id:"learn/core-concepts/node/client-node",title:"Client Node",description:"Runtime",source:"@site/docs/02-learn/03-core-concepts/02-node/01-client-node.mdx",sourceDirName:"02-learn/03-core-concepts/02-node",slug:"/learn/core-concepts/node/client-node",permalink:"/learn/core-concepts/node/client-node",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718723446e3,sidebarPosition:1,frontMatter:{id:"client-node",title:"Client Node"},sidebar:"tutorialSidebar",previous:{title:"Identity",permalink:"/learn/core-concepts/identity"},next:{title:"Runtime",permalink:"/learn/core-concepts/node/runtime"}},c={},l=[{value:"Runtime",id:"runtime",level:3},{value:"Recommendations for Developers: Thorough testing of applications in a controlled environment is advised before deploying them in production to ensure stability and security. Additionally, developers are encouraged to implement locked update rules to prevent unauthorized modifications to the application's behavior.",id:"recommendations-for-developers-thorough-testing-of-applications-in-a-controlled-environment-is-advised-before-deploying-them-in-production-to-ensure-stability-and-security-additionally-developers-are-encouraged-to-implement-locked-update-rules-to-prevent-unauthorized-modifications-to-the-applications-behavior",level:4},{value:"Storage",id:"storage",level:3},{value:"Encryption:",id:"encryption",level:3},{value:"Identity Management",id:"identity-management",level:3},{value:"Authentication",id:"authentication",level:3},{value:"Key Management",id:"key-management",level:3},{value:"Application Marketplace",id:"application-marketplace",level:3}];function d(e){const n={h3:"h3",h4:"h4",li:"li",p:"p",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h3,{id:"runtime",children:"Runtime"}),"\n",(0,i.jsx)(n.p,{children:"Overview: The runtime environment of a client node in the Calimero Network is crucial for the execution of decentralized applications (DApps), particularly those compiled to WebAssembly (WASM)."}),"\n",(0,i.jsx)(n.p,{children:"Functionality:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"State Synchronization: Each node can download and synchronize the state with existing applications, ensuring that all nodes participating in a particular application network are consistent and up-to-date."}),"\n",(0,i.jsx)(n.li,{children:"Application Settings: Nodes can be configured with specific settings for each application, including which WASM modules to run, source URLs for fetching these modules, encryption protocols to be used, and more."}),"\n",(0,i.jsx)(n.li,{children:"Network Topology & Update Rules: Defines the structure of the network and how nodes communicate and update each other. Proper update rules are crucial for application security and integrity, particularly in a decentralized setting where trust is distributed."}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"recommendations-for-developers-thorough-testing-of-applications-in-a-controlled-environment-is-advised-before-deploying-them-in-production-to-ensure-stability-and-security-additionally-developers-are-encouraged-to-implement-locked-update-rules-to-prevent-unauthorized-modifications-to-the-applications-behavior",children:"Recommendations for Developers: Thorough testing of applications in a controlled environment is advised before deploying them in production to ensure stability and security. Additionally, developers are encouraged to implement locked update rules to prevent unauthorized modifications to the application's behavior."}),"\n",(0,i.jsx)(n.h3,{id:"storage",children:"Storage"}),"\n",(0,i.jsx)(n.p,{children:"Overview: Storage on client nodes involves maintaining the state and data required for the decentralized applications they support."}),"\n",(0,i.jsx)(n.p,{children:"Functionality:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Local Storage: Each node stores application data locally, contributing to the overall decentralized storage model of the network. This ensures that data is distributed across the network, enhancing privacy and resilience against central points of failure."}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"encryption",children:"Encryption:"}),"\n",(0,i.jsx)(n.p,{children:"Data stored on client nodes can be encrypted, providing an additional layer of security and privacy for user data."}),"\n",(0,i.jsx)(n.h3,{id:"identity-management",children:"Identity Management"}),"\n",(0,i.jsx)(n.p,{children:"Overview: Managing identities on the Calimero Network is fundamental for ensuring secure and private interactions between nodes and applications.\nFunctionality:"}),"\n",(0,i.jsx)(n.h3,{id:"authentication",children:"Authentication"}),"\n",(0,i.jsx)(n.p,{children:"Nodes implement mechanisms for authenticating users and applications, ensuring that interactions are secure and that entities are who they claim to be."}),"\n",(0,i.jsx)(n.h3,{id:"key-management",children:"Key Management"}),"\n",(0,i.jsx)(n.p,{children:"The management of cryptographic keys is an integral part of identity management, enabling secure communication and data encryption across the network."}),"\n",(0,i.jsx)(n.h3,{id:"application-marketplace",children:"Application Marketplace"}),"\n",(0,i.jsx)(n.p,{children:"Current State: The marketplace for decentralized applications within the Calimero Network is facilitated by a smart contract on the NEAR blockchain, with application data and metadata hosted on IPFS. This setup serves as a temporary solution while further community engagement and discussions are underway to refine the marketplace's infrastructure and governance.\nThe Calimero Network's approach to client nodes emphasizes security, decentralization, and privacy, with a strong recommendation for users to engage with applications that have securely locked update mechanisms. These applications are more reliable for critical use cases and are the only ones featured in the official marketplace, ensuring a curated and trustworthy selection of DApps for users. This framework demonstrates Calimero Network's commitment to building a secure and user-centric decentralized ecosystem."})]})}function p(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},5710:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>s});var i=t(758);const o={},a=i.createContext(o);function r(e){const n=i.useContext(a);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),i.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/77c0519e.55636fe1.js b/assets/js/77c0519e.ec0e1031.js similarity index 98% rename from assets/js/77c0519e.55636fe1.js rename to assets/js/77c0519e.ec0e1031.js index d9b0fd02..73d84735 100644 --- a/assets/js/77c0519e.55636fe1.js +++ b/assets/js/77c0519e.ec0e1031.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[636],{6197:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>d,frontMatter:()=>r,metadata:()=>l,toc:()=>c});var n=i(6070),o=i(5710);const r={id:"quickstart",title:"Quickstart"},a=void 0,l={id:"build/quickstart",title:"Quickstart",description:"Welcome to the exciting world of application development in the decentralized space! As a developer, you have the opportunity to build cutting-edge applications using our comprehensive suite of tools. Start by shaping the core application logic with our Protocol SDK and then bring your application to life by crafting intuitive user interfaces with the Client SDK. Join our community of developers and start creating powerful decentralized applications that can make a significant impact in the tech world.",source:"@site/docs/03-build/00-quickstart.mdx",sourceDirName:"03-build",slug:"/build/quickstart",permalink:"/build/quickstart",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718634626e3,sidebarPosition:0,frontMatter:{id:"quickstart",title:"Quickstart"},sidebar:"tutorialSidebar",previous:{title:"Encryption",permalink:"/learn/advanced-concepts/encryption"},next:{title:"Protocol SDK",permalink:"/build/protocol-sdks/protocol-sdk"}},s={},c=[{value:"Protocol SDK",id:"protocol-sdk",level:2},{value:"Client SDKs",id:"client-sdks",level:2},{value:"Publish app",id:"publish-app",level:2},{value:"Building app from template",id:"building-app-from-template",level:2}];function p(e){const t={a:"a",blockquote:"blockquote",code:"code",em:"em",h2:"h2",li:"li",ol:"ol",p:"p",strong:"strong",...(0,o.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.p,{children:"Welcome to the exciting world of application development in the decentralized space! As a developer, you have the opportunity to build cutting-edge applications using our comprehensive suite of tools. Start by shaping the core application logic with our Protocol SDK and then bring your application to life by crafting intuitive user interfaces with the Client SDK. Join our community of developers and start creating powerful decentralized applications that can make a significant impact in the tech world."}),"\n",(0,n.jsx)(t.p,{children:"Application development consists of two main parts:"}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsx)(t.li,{children:"building the application logic with the Protocol SDK"}),"\n",(0,n.jsx)(t.li,{children:"building the application client interface with the Client SDK"}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"protocol-sdk",children:"Protocol SDK"}),"\n",(0,n.jsx)(t.p,{children:"The Protocol SDK within the Calimero Network equips developers with tools for creating, testing, and deploying protocols essential for decentralized applications (DApps). It features capabilities such as code generation, security enhancement, and interoperability support to ensure robust and efficient DApp operations. This SDK is crucial for integrating with the Calimero Network's components, facilitating seamless updates and versioning critical for DApps in fields like decentralized messaging and finance."}),"\n",(0,n.jsx)(t.p,{children:"Currently we have SDK only for rust but in the future we will have SDKs for other languages as well."}),"\n",(0,n.jsx)(t.h2,{id:"client-sdks",children:"Client SDKs"}),"\n",(0,n.jsx)(t.p,{children:"The Client SDK includes straightforward tools to help you build your application. For logging in, we provide functions that allow users to authenticate using their wallet credentials, which must be set up as root keys in the admin dashboard. This setup ensures that access is both secure and straightforward. For handling data, the SDK supports JSON-RPC for direct data transactions and websockets for live updates. These features are designed to make your development process efficient and effective, allowing you to focus on creating a great user experience."}),"\n",(0,n.jsx)(t.p,{children:"Currently we have SDK only for typescript but in the future we will have SDKs for other languages as well."}),"\n",(0,n.jsx)(t.h2,{id:"publish-app",children:"Publish app"}),"\n",(0,n.jsxs)(t.p,{children:["After you have created your application logic with Rust and your application UI with TypeScript, you can publish your app. Follow instructions in the ",(0,n.jsx)(t.a,{href:"/build/publish-app",children:"Publish App"})," guide to learn how to publish your app and how users can download and run it."]}),"\n",(0,n.jsx)(t.h2,{id:"building-app-from-template",children:"Building app from template"}),"\n",(0,n.jsxs)(t.p,{children:["We have prepared template repository for you to get started quickly. You can find the template repository ",(0,n.jsx)(t.a,{href:"https://github.com/calimero-network/core-app-template",children:"here"}),".\nRepository contains two folders, ",(0,n.jsx)(t.code,{children:"logic"})," and ",(0,n.jsx)(t.code,{children:"app"}),". ",(0,n.jsx)(t.code,{children:"logic"})," folder contains the application logic written in Rust and ",(0,n.jsx)(t.code,{children:"app"})," folder contains the application client interface written in TypeScript."]}),"\n",(0,n.jsxs)(t.blockquote,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.strong,{children:(0,n.jsx)(t.em,{children:"NOTE:"})}),"\nLogic is still under development and may not be yet published."]}),"\n"]})]})}function d(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(p,{...e})}):p(e)}},5710:(e,t,i)=>{i.d(t,{R:()=>a,x:()=>l});var n=i(758);const o={},r=n.createContext(o);function a(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[636],{6197:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>d,frontMatter:()=>r,metadata:()=>l,toc:()=>c});var n=i(6070),o=i(5710);const r={id:"quickstart",title:"Quickstart"},a=void 0,l={id:"build/quickstart",title:"Quickstart",description:"Welcome to the exciting world of application development in the decentralized space! As a developer, you have the opportunity to build cutting-edge applications using our comprehensive suite of tools. Start by shaping the core application logic with our Protocol SDK and then bring your application to life by crafting intuitive user interfaces with the Client SDK. Join our community of developers and start creating powerful decentralized applications that can make a significant impact in the tech world.",source:"@site/docs/03-build/00-quickstart.mdx",sourceDirName:"03-build",slug:"/build/quickstart",permalink:"/build/quickstart",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718723446e3,sidebarPosition:0,frontMatter:{id:"quickstart",title:"Quickstart"},sidebar:"tutorialSidebar",previous:{title:"Encryption",permalink:"/learn/advanced-concepts/encryption"},next:{title:"Protocol SDK",permalink:"/build/protocol-sdks/protocol-sdk"}},s={},c=[{value:"Protocol SDK",id:"protocol-sdk",level:2},{value:"Client SDKs",id:"client-sdks",level:2},{value:"Publish app",id:"publish-app",level:2},{value:"Building app from template",id:"building-app-from-template",level:2}];function p(e){const t={a:"a",blockquote:"blockquote",code:"code",em:"em",h2:"h2",li:"li",ol:"ol",p:"p",strong:"strong",...(0,o.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.p,{children:"Welcome to the exciting world of application development in the decentralized space! As a developer, you have the opportunity to build cutting-edge applications using our comprehensive suite of tools. Start by shaping the core application logic with our Protocol SDK and then bring your application to life by crafting intuitive user interfaces with the Client SDK. Join our community of developers and start creating powerful decentralized applications that can make a significant impact in the tech world."}),"\n",(0,n.jsx)(t.p,{children:"Application development consists of two main parts:"}),"\n",(0,n.jsxs)(t.ol,{children:["\n",(0,n.jsx)(t.li,{children:"building the application logic with the Protocol SDK"}),"\n",(0,n.jsx)(t.li,{children:"building the application client interface with the Client SDK"}),"\n"]}),"\n",(0,n.jsx)(t.h2,{id:"protocol-sdk",children:"Protocol SDK"}),"\n",(0,n.jsx)(t.p,{children:"The Protocol SDK within the Calimero Network equips developers with tools for creating, testing, and deploying protocols essential for decentralized applications (DApps). It features capabilities such as code generation, security enhancement, and interoperability support to ensure robust and efficient DApp operations. This SDK is crucial for integrating with the Calimero Network's components, facilitating seamless updates and versioning critical for DApps in fields like decentralized messaging and finance."}),"\n",(0,n.jsx)(t.p,{children:"Currently we have SDK only for rust but in the future we will have SDKs for other languages as well."}),"\n",(0,n.jsx)(t.h2,{id:"client-sdks",children:"Client SDKs"}),"\n",(0,n.jsx)(t.p,{children:"The Client SDK includes straightforward tools to help you build your application. For logging in, we provide functions that allow users to authenticate using their wallet credentials, which must be set up as root keys in the admin dashboard. This setup ensures that access is both secure and straightforward. For handling data, the SDK supports JSON-RPC for direct data transactions and websockets for live updates. These features are designed to make your development process efficient and effective, allowing you to focus on creating a great user experience."}),"\n",(0,n.jsx)(t.p,{children:"Currently we have SDK only for typescript but in the future we will have SDKs for other languages as well."}),"\n",(0,n.jsx)(t.h2,{id:"publish-app",children:"Publish app"}),"\n",(0,n.jsxs)(t.p,{children:["After you have created your application logic with Rust and your application UI with TypeScript, you can publish your app. Follow instructions in the ",(0,n.jsx)(t.a,{href:"/build/publish-app",children:"Publish App"})," guide to learn how to publish your app and how users can download and run it."]}),"\n",(0,n.jsx)(t.h2,{id:"building-app-from-template",children:"Building app from template"}),"\n",(0,n.jsxs)(t.p,{children:["We have prepared template repository for you to get started quickly. You can find the template repository ",(0,n.jsx)(t.a,{href:"https://github.com/calimero-network/core-app-template",children:"here"}),".\nRepository contains two folders, ",(0,n.jsx)(t.code,{children:"logic"})," and ",(0,n.jsx)(t.code,{children:"app"}),". ",(0,n.jsx)(t.code,{children:"logic"})," folder contains the application logic written in Rust and ",(0,n.jsx)(t.code,{children:"app"})," folder contains the application client interface written in TypeScript."]}),"\n",(0,n.jsxs)(t.blockquote,{children:["\n",(0,n.jsxs)(t.p,{children:[(0,n.jsx)(t.strong,{children:(0,n.jsx)(t.em,{children:"NOTE:"})}),"\nLogic is still under development and may not be yet published."]}),"\n"]})]})}function d(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(p,{...e})}):p(e)}},5710:(e,t,i)=>{i.d(t,{R:()=>a,x:()=>l});var n=i(758);const o={},r=n.createContext(o);function a(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7b9fe0bb.b0c832fb.js b/assets/js/7b9fe0bb.95623596.js similarity index 96% rename from assets/js/7b9fe0bb.b0c832fb.js rename to assets/js/7b9fe0bb.95623596.js index f92659dd..22c436ec 100644 --- a/assets/js/7b9fe0bb.b0c832fb.js +++ b/assets/js/7b9fe0bb.95623596.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2822],{1631:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>p,frontMatter:()=>r,metadata:()=>o,toc:()=>l});var n=s(6070),i=s(5710);const r={id:"trustless-gaming",title:"Trustless Gaming"},a=void 0,o={id:"explore/use-cases/trustless-gaming",title:"Trustless Gaming",description:"Resolve the transparency and verification problems in games with turn mechanics (i.e. Battleship), and in those where private data holds significant importance (i.e. poker).",source:"@site/docs/01-explore/05-use-cases/05-trustless-gaming.mdx",sourceDirName:"01-explore/05-use-cases",slug:"/explore/use-cases/trustless-gaming",permalink:"/explore/use-cases/trustless-gaming",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718634626e3,sidebarPosition:5,frontMatter:{id:"trustless-gaming",title:"Trustless Gaming"},sidebar:"tutorialSidebar",previous:{title:"Decentralized Gig Economy",permalink:"/explore/use-cases/decentralized-gig-economy"},next:{title:"Decentralized Edge Compute",permalink:"/explore/use-cases/decentralized-edge-compute"}},c={},l=[];function u(e){const t={p:"p",...(0,i.R)(),...e.components};return(0,n.jsx)(t.p,{children:"Resolve the transparency and verification problems in games with turn mechanics (i.e. Battleship), and in those where private data holds significant importance (i.e. poker)."})}function p(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},5710:(e,t,s)=>{s.d(t,{R:()=>a,x:()=>o});var n=s(758);const i={},r=n.createContext(i);function a(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2822],{1631:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>p,frontMatter:()=>r,metadata:()=>o,toc:()=>l});var n=s(6070),i=s(5710);const r={id:"trustless-gaming",title:"Trustless Gaming"},a=void 0,o={id:"explore/use-cases/trustless-gaming",title:"Trustless Gaming",description:"Resolve the transparency and verification problems in games with turn mechanics (i.e. Battleship), and in those where private data holds significant importance (i.e. poker).",source:"@site/docs/01-explore/05-use-cases/05-trustless-gaming.mdx",sourceDirName:"01-explore/05-use-cases",slug:"/explore/use-cases/trustless-gaming",permalink:"/explore/use-cases/trustless-gaming",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718723446e3,sidebarPosition:5,frontMatter:{id:"trustless-gaming",title:"Trustless Gaming"},sidebar:"tutorialSidebar",previous:{title:"Decentralized Gig Economy",permalink:"/explore/use-cases/decentralized-gig-economy"},next:{title:"Decentralized Edge Compute",permalink:"/explore/use-cases/decentralized-edge-compute"}},c={},l=[];function u(e){const t={p:"p",...(0,i.R)(),...e.components};return(0,n.jsx)(t.p,{children:"Resolve the transparency and verification problems in games with turn mechanics (i.e. Battleship), and in those where private data holds significant importance (i.e. poker)."})}function p(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},5710:(e,t,s)=>{s.d(t,{R:()=>a,x:()=>o});var n=s(758);const i={},r=n.createContext(i);function a(e){const t=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/80fe3eff.4f203b28.js b/assets/js/80fe3eff.a87efc36.js similarity index 98% rename from assets/js/80fe3eff.4f203b28.js rename to assets/js/80fe3eff.a87efc36.js index 14b8e5f8..ffcb3842 100644 --- a/assets/js/80fe3eff.4f203b28.js +++ b/assets/js/80fe3eff.a87efc36.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[9300],{3975:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>r,default:()=>d,frontMatter:()=>i,metadata:()=>l,toc:()=>p});var o=n(6070),a=n(5710);const i={id:"example-app",title:"Example Application"},r=void 0,l={id:"explore/developers-quickstart/example-app",title:"Example Application",description:"We have created simple and easy to use example application called only-peers. Application enables writing posts and leaving comments.",source:"@site/docs/01-explore/02-developers-quickstart/03-example-app.mdx",sourceDirName:"01-explore/02-developers-quickstart",slug:"/explore/developers-quickstart/example-app",permalink:"/explore/developers-quickstart/example-app",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718634626e3,sidebarPosition:3,frontMatter:{id:"example-app",title:"Example Application"},sidebar:"tutorialSidebar",previous:{title:"Admin Dashboard",permalink:"/explore/developers-quickstart/admin-dashboard"},next:{title:"Blockchain",permalink:"/explore/why-not/blockchain"}},s={},p=[{value:"Create new context",id:"create-new-context",level:3},{value:"Try out Only-peers application",id:"try-out-only-peers-application",level:3}];function c(e){const t={a:"a",blockquote:"blockquote",code:"code",em:"em",h3:"h3",li:"li",p:"p",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(t.p,{children:["We have created simple and easy to use example application called ",(0,o.jsx)(t.code,{children:"only-peers"}),". Application enables writing posts and leaving comments.\nTo try out application you need to create new context where application will be installed."]}),"\n",(0,o.jsx)(t.h3,{id:"create-new-context",children:"Create new context"}),"\n",(0,o.jsxs)(t.p,{children:["Navigate back to Admin Dashboard. If you have not started Admin Dashboard, follow the instructions in ",(0,o.jsx)(t.a,{href:"/explore/developers-quickstart/admin-dashboard",children:"Admin Dashboard"}),"."]}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsxs)(t.li,{children:["Follow context creation instructions and select ",(0,o.jsx)(t.code,{children:"only-peers"})," app."]}),"\n"]}),"\n",(0,o.jsx)(t.p,{children:"You are now part of the context and can start using the application."}),"\n",(0,o.jsx)(t.h3,{id:"try-out-only-peers-application",children:"Try out Only-peers application"}),"\n",(0,o.jsx)(t.p,{children:"We have built and deployed a demo app so you can try it out immediately."}),"\n",(0,o.jsxs)(t.p,{children:["Navigate to ",(0,o.jsx)(t.a,{href:"https://calimero-network.github.io/only-peers-client/",children:"https://calimero-network.github.io/only-peers-client/"})," to access app frontend."]}),"\n",(0,o.jsxs)(t.p,{children:["You will be asked to setup the app by the adding the node url. It is the same url you used while starting the node in ",(0,o.jsx)(t.a,{href:"/explore/developers-quickstart/getting-started",children:"Getting-started"})," ",(0,o.jsx)(t.code,{children:"http://localhost:NODE_PORT"}),"\nAfter setting up node url, you will be asked to login."]}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.strong,{children:(0,o.jsx)(t.em,{children:"NOTE:"})}),"\nUse your wallet which you have already added as root key in ",(0,o.jsx)(t.a,{href:"/explore/developers-quickstart/admin-dashboard",children:"Admin Dashboard. "})]}),"\n"]}),"\n",(0,o.jsx)(t.p,{children:"You are now ready to use the app. Enjoy!"})]})}function d(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},5710:(e,t,n)=>{n.d(t,{R:()=>r,x:()=>l});var o=n(758);const a={},i=o.createContext(a);function r(e){const t=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:r(e.components),o.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[9300],{3975:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>r,default:()=>d,frontMatter:()=>i,metadata:()=>l,toc:()=>p});var o=n(6070),a=n(5710);const i={id:"example-app",title:"Example Application"},r=void 0,l={id:"explore/developers-quickstart/example-app",title:"Example Application",description:"We have created simple and easy to use example application called only-peers. Application enables writing posts and leaving comments.",source:"@site/docs/01-explore/02-developers-quickstart/03-example-app.mdx",sourceDirName:"01-explore/02-developers-quickstart",slug:"/explore/developers-quickstart/example-app",permalink:"/explore/developers-quickstart/example-app",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718723446e3,sidebarPosition:3,frontMatter:{id:"example-app",title:"Example Application"},sidebar:"tutorialSidebar",previous:{title:"Admin Dashboard",permalink:"/explore/developers-quickstart/admin-dashboard"},next:{title:"Blockchain",permalink:"/explore/why-not/blockchain"}},s={},p=[{value:"Create new context",id:"create-new-context",level:3},{value:"Try out Only-peers application",id:"try-out-only-peers-application",level:3}];function c(e){const t={a:"a",blockquote:"blockquote",code:"code",em:"em",h3:"h3",li:"li",p:"p",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(t.p,{children:["We have created simple and easy to use example application called ",(0,o.jsx)(t.code,{children:"only-peers"}),". Application enables writing posts and leaving comments.\nTo try out application you need to create new context where application will be installed."]}),"\n",(0,o.jsx)(t.h3,{id:"create-new-context",children:"Create new context"}),"\n",(0,o.jsxs)(t.p,{children:["Navigate back to Admin Dashboard. If you have not started Admin Dashboard, follow the instructions in ",(0,o.jsx)(t.a,{href:"/explore/developers-quickstart/admin-dashboard",children:"Admin Dashboard"}),"."]}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsxs)(t.li,{children:["Follow context creation instructions and select ",(0,o.jsx)(t.code,{children:"only-peers"})," app."]}),"\n"]}),"\n",(0,o.jsx)(t.p,{children:"You are now part of the context and can start using the application."}),"\n",(0,o.jsx)(t.h3,{id:"try-out-only-peers-application",children:"Try out Only-peers application"}),"\n",(0,o.jsx)(t.p,{children:"We have built and deployed a demo app so you can try it out immediately."}),"\n",(0,o.jsxs)(t.p,{children:["Navigate to ",(0,o.jsx)(t.a,{href:"https://calimero-network.github.io/only-peers-client/",children:"https://calimero-network.github.io/only-peers-client/"})," to access app frontend."]}),"\n",(0,o.jsxs)(t.p,{children:["You will be asked to setup the app by the adding the node url. It is the same url you used while starting the node in ",(0,o.jsx)(t.a,{href:"/explore/developers-quickstart/getting-started",children:"Getting-started"})," ",(0,o.jsx)(t.code,{children:"http://localhost:NODE_PORT"}),"\nAfter setting up node url, you will be asked to login."]}),"\n",(0,o.jsxs)(t.blockquote,{children:["\n",(0,o.jsxs)(t.p,{children:[(0,o.jsx)(t.strong,{children:(0,o.jsx)(t.em,{children:"NOTE:"})}),"\nUse your wallet which you have already added as root key in ",(0,o.jsx)(t.a,{href:"/explore/developers-quickstart/admin-dashboard",children:"Admin Dashboard. "})]}),"\n"]}),"\n",(0,o.jsx)(t.p,{children:"You are now ready to use the app. Enjoy!"})]})}function d(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},5710:(e,t,n)=>{n.d(t,{R:()=>r,x:()=>l});var o=n(758);const a={},i=o.createContext(a);function r(e){const t=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:r(e.components),o.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/889f3b97.6dde2377.js b/assets/js/889f3b97.79235f56.js similarity index 94% rename from assets/js/889f3b97.6dde2377.js rename to assets/js/889f3b97.79235f56.js index 726555f3..ba26cd22 100644 --- a/assets/js/889f3b97.6dde2377.js +++ b/assets/js/889f3b97.79235f56.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[5101],{8621:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>p,frontMatter:()=>a,metadata:()=>s,toc:()=>d});var r=i(6070),n=i(5710);const a={id:"decentralized-identity-verification",title:"Decentralized Identity Verification"},o=void 0,s={id:"explore/use-cases/decentralized-identity-verification",title:"Decentralized Identity Verification",description:"Create a private Calimero application network which provides transparent and trusted identity verification for service providers. With Calimero, sensitive procedures such as opening a bank account or applying for Visas would not require service providers to host the data of their users at centralized entities any more.",source:"@site/docs/01-explore/05-use-cases/07-decentralized-identity-verification.mdx",sourceDirName:"01-explore/05-use-cases",slug:"/explore/use-cases/decentralized-identity-verification",permalink:"/explore/use-cases/decentralized-identity-verification",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718634626e3,sidebarPosition:7,frontMatter:{id:"decentralized-identity-verification",title:"Decentralized Identity Verification"},sidebar:"tutorialSidebar",previous:{title:"Decentralized Edge Compute",permalink:"/explore/use-cases/decentralized-edge-compute"},next:{title:"Decentralized Intellectual Property Management",permalink:"/explore/use-cases/decentralized-intellectual-property-management"}},c={},d=[];function l(e){const t={p:"p",...(0,n.R)(),...e.components};return(0,r.jsx)(t.p,{children:"Create a private Calimero application network which provides transparent and trusted identity verification for service providers. With Calimero, sensitive procedures such as opening a bank account or applying for Visas would not require service providers to host the data of their users at centralized entities any more."})}function p(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},5710:(e,t,i)=>{i.d(t,{R:()=>o,x:()=>s});var r=i(758);const n={},a=r.createContext(n);function o(e){const t=r.useContext(a);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:o(e.components),r.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[5101],{8621:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>p,frontMatter:()=>a,metadata:()=>s,toc:()=>d});var r=i(6070),n=i(5710);const a={id:"decentralized-identity-verification",title:"Decentralized Identity Verification"},o=void 0,s={id:"explore/use-cases/decentralized-identity-verification",title:"Decentralized Identity Verification",description:"Create a private Calimero application network which provides transparent and trusted identity verification for service providers. With Calimero, sensitive procedures such as opening a bank account or applying for Visas would not require service providers to host the data of their users at centralized entities any more.",source:"@site/docs/01-explore/05-use-cases/07-decentralized-identity-verification.mdx",sourceDirName:"01-explore/05-use-cases",slug:"/explore/use-cases/decentralized-identity-verification",permalink:"/explore/use-cases/decentralized-identity-verification",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718723446e3,sidebarPosition:7,frontMatter:{id:"decentralized-identity-verification",title:"Decentralized Identity Verification"},sidebar:"tutorialSidebar",previous:{title:"Decentralized Edge Compute",permalink:"/explore/use-cases/decentralized-edge-compute"},next:{title:"Decentralized Intellectual Property Management",permalink:"/explore/use-cases/decentralized-intellectual-property-management"}},c={},d=[];function l(e){const t={p:"p",...(0,n.R)(),...e.components};return(0,r.jsx)(t.p,{children:"Create a private Calimero application network which provides transparent and trusted identity verification for service providers. With Calimero, sensitive procedures such as opening a bank account or applying for Visas would not require service providers to host the data of their users at centralized entities any more."})}function p(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},5710:(e,t,i)=>{i.d(t,{R:()=>o,x:()=>s});var r=i(758);const n={},a=r.createContext(n);function o(e){const t=r.useContext(a);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:o(e.components),r.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/90e69b51.ee377b66.js b/assets/js/90e69b51.f05b291f.js similarity index 98% rename from assets/js/90e69b51.ee377b66.js rename to assets/js/90e69b51.f05b291f.js index 6a6b3ba2..5311efa4 100644 --- a/assets/js/90e69b51.ee377b66.js +++ b/assets/js/90e69b51.f05b291f.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2262],{3564:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>h,contentTitle:()=>r,default:()=>d,frontMatter:()=>i,metadata:()=>s,toc:()=>l});var o=n(6070),a=n(5710);const i={id:"hackathons",title:"Hackathons"},r="Hackathons",s={id:"contribute/hackathons",title:"Hackathons",description:"At Calimero, we love innovation and collaboration, which is why we plan to regularly organize hackathons that include our product. We have exciting events planned for the future. Stay tuned by following us on our social media channels to get the latest updates.",source:"@site/docs/04-contribute/02-hackathons.mdx",sourceDirName:"04-contribute",slug:"/contribute/hackathons",permalink:"/contribute/hackathons",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718634626e3,sidebarPosition:2,frontMatter:{id:"hackathons",title:"Hackathons"},sidebar:"tutorialSidebar",previous:{title:"GitHub",permalink:"/contribute/github"},next:{title:"Bounty Program",permalink:"/contribute/bounty-program"}},h={},l=[{value:"What is a Hackathon?",id:"what-is-a-hackathon",level:2},{value:"How to Get Involved",id:"how-to-get-involved",level:2},{value:"Stay Updated",id:"stay-updated",level:3}];function c(e){const t={h1:"h1",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"hackathons",children:"Hackathons"}),"\n",(0,o.jsx)(t.p,{children:"At Calimero, we love innovation and collaboration, which is why we plan to regularly organize hackathons that include our product. We have exciting events planned for the future. Stay tuned by following us on our social media channels to get the latest updates."}),"\n",(0,o.jsx)(t.h2,{id:"what-is-a-hackathon",children:"What is a Hackathon?"}),"\n",(0,o.jsx)(t.p,{children:"A hackathon is an event where developers, designers, and other tech enthusiasts come together to create innovative solutions in a short amount of time. Participants work in teams to build projects, often centered around a specific theme or technology. Hackathons are a great opportunity to:"}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"Learn New Skills:"})," Whether you\u2019re a beginner or an expert, hackathons provide a platform to learn new technologies and tools."]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"Collaborate:"})," Work with other passionate individuals, share ideas, and collaborate on projects."]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"Showcase Your Talent:"})," Present your project to a panel of judges and other participants, winning prizes and recognition."]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"Network:"})," Meet like-minded individuals, industry experts, and potential employers or collaborators."]}),"\n"]}),"\n",(0,o.jsx)(t.h2,{id:"how-to-get-involved",children:"How to Get Involved"}),"\n",(0,o.jsx)(t.p,{children:"When we announce a new hackathon, here\u2019s how you can participate:"}),"\n",(0,o.jsxs)(t.ol,{children:["\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"Register for the Event:"})," Sign up through the event link provided in our announcements."]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"Form a Team:"})," Join with friends or team up with other participants."]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"Build Your Project:"})," Use our product and other tools to create something amazing."]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"Submit Your Work:"})," Present your project at the end of the hackathon for a chance to win prizes and gain recognition."]}),"\n"]}),"\n",(0,o.jsx)(t.h3,{id:"stay-updated",children:"Stay Updated"}),"\n",(0,o.jsx)(t.p,{children:"Follow us on social media to be the first to know about our upcoming hackathons and other events. We\u2019ll share all the details, including how to register and participate."}),"\n",(0,o.jsx)(t.p,{children:"Thank you for your interest in contributing to our project through hackathons. We look forward to seeing your innovative ideas and solutions!"})]})}function d(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},5710:(e,t,n)=>{n.d(t,{R:()=>r,x:()=>s});var o=n(758);const a={},i=o.createContext(a);function r(e){const t=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:r(e.components),o.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2262],{3564:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>h,contentTitle:()=>r,default:()=>d,frontMatter:()=>i,metadata:()=>s,toc:()=>l});var o=n(6070),a=n(5710);const i={id:"hackathons",title:"Hackathons"},r="Hackathons",s={id:"contribute/hackathons",title:"Hackathons",description:"At Calimero, we love innovation and collaboration, which is why we plan to regularly organize hackathons that include our product. We have exciting events planned for the future. Stay tuned by following us on our social media channels to get the latest updates.",source:"@site/docs/04-contribute/02-hackathons.mdx",sourceDirName:"04-contribute",slug:"/contribute/hackathons",permalink:"/contribute/hackathons",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718723446e3,sidebarPosition:2,frontMatter:{id:"hackathons",title:"Hackathons"},sidebar:"tutorialSidebar",previous:{title:"GitHub",permalink:"/contribute/github"},next:{title:"Bounty Program",permalink:"/contribute/bounty-program"}},h={},l=[{value:"What is a Hackathon?",id:"what-is-a-hackathon",level:2},{value:"How to Get Involved",id:"how-to-get-involved",level:2},{value:"Stay Updated",id:"stay-updated",level:3}];function c(e){const t={h1:"h1",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h1,{id:"hackathons",children:"Hackathons"}),"\n",(0,o.jsx)(t.p,{children:"At Calimero, we love innovation and collaboration, which is why we plan to regularly organize hackathons that include our product. We have exciting events planned for the future. Stay tuned by following us on our social media channels to get the latest updates."}),"\n",(0,o.jsx)(t.h2,{id:"what-is-a-hackathon",children:"What is a Hackathon?"}),"\n",(0,o.jsx)(t.p,{children:"A hackathon is an event where developers, designers, and other tech enthusiasts come together to create innovative solutions in a short amount of time. Participants work in teams to build projects, often centered around a specific theme or technology. Hackathons are a great opportunity to:"}),"\n",(0,o.jsxs)(t.ul,{children:["\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"Learn New Skills:"})," Whether you\u2019re a beginner or an expert, hackathons provide a platform to learn new technologies and tools."]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"Collaborate:"})," Work with other passionate individuals, share ideas, and collaborate on projects."]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"Showcase Your Talent:"})," Present your project to a panel of judges and other participants, winning prizes and recognition."]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"Network:"})," Meet like-minded individuals, industry experts, and potential employers or collaborators."]}),"\n"]}),"\n",(0,o.jsx)(t.h2,{id:"how-to-get-involved",children:"How to Get Involved"}),"\n",(0,o.jsx)(t.p,{children:"When we announce a new hackathon, here\u2019s how you can participate:"}),"\n",(0,o.jsxs)(t.ol,{children:["\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"Register for the Event:"})," Sign up through the event link provided in our announcements."]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"Form a Team:"})," Join with friends or team up with other participants."]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"Build Your Project:"})," Use our product and other tools to create something amazing."]}),"\n",(0,o.jsxs)(t.li,{children:[(0,o.jsx)(t.strong,{children:"Submit Your Work:"})," Present your project at the end of the hackathon for a chance to win prizes and gain recognition."]}),"\n"]}),"\n",(0,o.jsx)(t.h3,{id:"stay-updated",children:"Stay Updated"}),"\n",(0,o.jsx)(t.p,{children:"Follow us on social media to be the first to know about our upcoming hackathons and other events. We\u2019ll share all the details, including how to register and participate."}),"\n",(0,o.jsx)(t.p,{children:"Thank you for your interest in contributing to our project through hackathons. We look forward to seeing your innovative ideas and solutions!"})]})}function d(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},5710:(e,t,n)=>{n.d(t,{R:()=>r,x:()=>s});var o=n(758);const a={},i=o.createContext(a);function r(e){const t=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:r(e.components),o.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9471ce52.0eda1fa3.js b/assets/js/9471ce52.b25d0a66.js similarity index 99% rename from assets/js/9471ce52.0eda1fa3.js rename to assets/js/9471ce52.b25d0a66.js index 64ace5b6..b406a385 100644 --- a/assets/js/9471ce52.0eda1fa3.js +++ b/assets/js/9471ce52.b25d0a66.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[9229],{4007:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>p,frontMatter:()=>a,metadata:()=>r,toc:()=>c});var t=i(6070),s=i(5710);const a={id:"applications",title:"Applications"},o=void 0,r={id:"learn/core-concepts/applications",title:"Applications",description:"Applications in Calimero define the core logic governing how peers interact within a decentralized network. Developers can programmatically augment the protocol to create customized functionalities, supporting a wide range of applications tailored to various use cases, from direct messaging and communication channels to interactive games and collaborative editing.",source:"@site/docs/02-learn/03-core-concepts/03-applications.mdx",sourceDirName:"02-learn/03-core-concepts",slug:"/learn/core-concepts/applications",permalink:"/learn/core-concepts/applications",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718634626e3,sidebarPosition:3,frontMatter:{id:"applications",title:"Applications"},sidebar:"tutorialSidebar",previous:{title:"Admin Client API",permalink:"/learn/core-concepts/node/admin-client-api"},next:{title:"Contexts",permalink:"/learn/core-concepts/contexts"}},l={},c=[{value:"Examples of Applications",id:"examples-of-applications",level:3},{value:"Benefits of Decentralized Applications",id:"benefits-of-decentralized-applications",level:3},{value:"Security and Data Management",id:"security-and-data-management",level:3},{value:"Building Applications",id:"building-applications",level:3}];function d(e){const n={h3:"h3",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:"Applications in Calimero define the core logic governing how peers interact within a decentralized network. Developers can programmatically augment the protocol to create customized functionalities, supporting a wide range of applications tailored to various use cases, from direct messaging and communication channels to interactive games and collaborative editing."}),"\n",(0,t.jsx)(n.h3,{id:"examples-of-applications",children:"Examples of Applications"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Communication Platforms"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Direct Messages and Channels"}),": Support for private, encrypted messaging between users and group communications in shared, secure spaces. This setup can scale from one-on-one conversations to large group discussions, similar to Slack channels or Discord communities."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Community Platforms"}),": Decentralized alternatives to platforms like Reddit or Hacker News, enabling independent contexts for different purposes, fostering discussions, and sharing content securely."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Interactive Games"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Privacy-Focused Games"}),": These games require the privacy of each player's moves until both have played, ensuring fair play and maintaining the confidentiality of strategies. Examples include:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Rock-Paper-Scissors"}),": Players' choices are revealed simultaneously after both have made their moves."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Battleship"}),": The positions of ships are kept secret until revealed through gameplay."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Non-Privacy Games"}),": These games do not require concealment of moves and allow all actions to be visible to both players. Examples include:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Chess"}),": A strategy game where all moves are visible to both players, with game logic running locally."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Checkers"}),": Another strategy game where all moves are open and visible to both players."]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Collaborative Work"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Document Collaboration"}),": Real-time collaboration on documents, akin to Google Docs, but decentralized and secure."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Creative Projects"}),": Shared canvases or environments for drawing, designing, or working on various creative projects, where all contributions are securely encrypted."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"benefits-of-decentralized-applications",children:"Benefits of Decentralized Applications"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Resilience"}),": Distributed application logic ensures the system functions smoothly even if some devices go offline."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Autonomy"}),": Users control their data and activities without relying on a central authority."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Scalability"}),": The system scales effectively as more users join due to optimistic execution, with state being conflict-free and eventually reconciled."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Privacy"}),": Keeping data local and encrypted prevents exposure to third parties, crucial for sensitive information."]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"security-and-data-management",children:"Security and Data Management"}),"\n",(0,t.jsx)(n.p,{children:"All non-state-transitional data, such as attached files in DMs, collaborative document assets, and game resources, inherit the same level of security as state-transitional transactions. This ensures that all forms of data within the Calimero network are encrypted and secure."}),"\n",(0,t.jsx)(n.p,{children:"Calimero also functions as a decentralized filesystem for these non-state-transitional, encrypted blobs of data. Similar to BitTorrent or IPFS, nodes can lazily share the data without needing any centralized storage options. This decentralized approach allows for efficient and secure data distribution across the network."}),"\n",(0,t.jsx)(n.h3,{id:"building-applications",children:"Building Applications"}),"\n",(0,t.jsx)(n.p,{children:"Developers can leverage Calimero's framework to programmatically build and augment a wide range of applications using provided tools and documentation. This includes setting up the development environment and deploying applications within the network."}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Development Tools"}),"\nCalimero offers the Rust SDK and intuitive APIs, enabling developers to create applications that integrate seamlessly with the network."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Documentation and Support"}),"\nComprehensive documentation and community support assist developers in every step of the application development process, ensuring that they can build and deploy high-quality, secure applications efficiently."]}),"\n"]}),"\n"]})]})}function p(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},5710:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>r});var t=i(758);const s={},a=t.createContext(s);function o(e){const n=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),t.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[9229],{4007:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>p,frontMatter:()=>a,metadata:()=>r,toc:()=>c});var t=i(6070),s=i(5710);const a={id:"applications",title:"Applications"},o=void 0,r={id:"learn/core-concepts/applications",title:"Applications",description:"Applications in Calimero define the core logic governing how peers interact within a decentralized network. Developers can programmatically augment the protocol to create customized functionalities, supporting a wide range of applications tailored to various use cases, from direct messaging and communication channels to interactive games and collaborative editing.",source:"@site/docs/02-learn/03-core-concepts/03-applications.mdx",sourceDirName:"02-learn/03-core-concepts",slug:"/learn/core-concepts/applications",permalink:"/learn/core-concepts/applications",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718723446e3,sidebarPosition:3,frontMatter:{id:"applications",title:"Applications"},sidebar:"tutorialSidebar",previous:{title:"Admin Client API",permalink:"/learn/core-concepts/node/admin-client-api"},next:{title:"Contexts",permalink:"/learn/core-concepts/contexts"}},l={},c=[{value:"Examples of Applications",id:"examples-of-applications",level:3},{value:"Benefits of Decentralized Applications",id:"benefits-of-decentralized-applications",level:3},{value:"Security and Data Management",id:"security-and-data-management",level:3},{value:"Building Applications",id:"building-applications",level:3}];function d(e){const n={h3:"h3",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:"Applications in Calimero define the core logic governing how peers interact within a decentralized network. Developers can programmatically augment the protocol to create customized functionalities, supporting a wide range of applications tailored to various use cases, from direct messaging and communication channels to interactive games and collaborative editing."}),"\n",(0,t.jsx)(n.h3,{id:"examples-of-applications",children:"Examples of Applications"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Communication Platforms"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Direct Messages and Channels"}),": Support for private, encrypted messaging between users and group communications in shared, secure spaces. This setup can scale from one-on-one conversations to large group discussions, similar to Slack channels or Discord communities."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Community Platforms"}),": Decentralized alternatives to platforms like Reddit or Hacker News, enabling independent contexts for different purposes, fostering discussions, and sharing content securely."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Interactive Games"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Privacy-Focused Games"}),": These games require the privacy of each player's moves until both have played, ensuring fair play and maintaining the confidentiality of strategies. Examples include:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Rock-Paper-Scissors"}),": Players' choices are revealed simultaneously after both have made their moves."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Battleship"}),": The positions of ships are kept secret until revealed through gameplay."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Non-Privacy Games"}),": These games do not require concealment of moves and allow all actions to be visible to both players. Examples include:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Chess"}),": A strategy game where all moves are visible to both players, with game logic running locally."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Checkers"}),": Another strategy game where all moves are open and visible to both players."]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"Collaborative Work"})}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Document Collaboration"}),": Real-time collaboration on documents, akin to Google Docs, but decentralized and secure."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Creative Projects"}),": Shared canvases or environments for drawing, designing, or working on various creative projects, where all contributions are securely encrypted."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"benefits-of-decentralized-applications",children:"Benefits of Decentralized Applications"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Resilience"}),": Distributed application logic ensures the system functions smoothly even if some devices go offline."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Autonomy"}),": Users control their data and activities without relying on a central authority."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Scalability"}),": The system scales effectively as more users join due to optimistic execution, with state being conflict-free and eventually reconciled."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Privacy"}),": Keeping data local and encrypted prevents exposure to third parties, crucial for sensitive information."]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"security-and-data-management",children:"Security and Data Management"}),"\n",(0,t.jsx)(n.p,{children:"All non-state-transitional data, such as attached files in DMs, collaborative document assets, and game resources, inherit the same level of security as state-transitional transactions. This ensures that all forms of data within the Calimero network are encrypted and secure."}),"\n",(0,t.jsx)(n.p,{children:"Calimero also functions as a decentralized filesystem for these non-state-transitional, encrypted blobs of data. Similar to BitTorrent or IPFS, nodes can lazily share the data without needing any centralized storage options. This decentralized approach allows for efficient and secure data distribution across the network."}),"\n",(0,t.jsx)(n.h3,{id:"building-applications",children:"Building Applications"}),"\n",(0,t.jsx)(n.p,{children:"Developers can leverage Calimero's framework to programmatically build and augment a wide range of applications using provided tools and documentation. This includes setting up the development environment and deploying applications within the network."}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Development Tools"}),"\nCalimero offers the Rust SDK and intuitive APIs, enabling developers to create applications that integrate seamlessly with the network."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Documentation and Support"}),"\nComprehensive documentation and community support assist developers in every step of the application development process, ensuring that they can build and deploy high-quality, secure applications efficiently."]}),"\n"]}),"\n"]})]})}function p(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},5710:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>r});var t=i(758);const s={},a=t.createContext(s);function o(e){const n=t.useContext(a);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),t.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/94b34882.37fa2992.js b/assets/js/94b34882.f006147c.js similarity index 96% rename from assets/js/94b34882.37fa2992.js rename to assets/js/94b34882.f006147c.js index c12f352c..84a5a9c7 100644 --- a/assets/js/94b34882.37fa2992.js +++ b/assets/js/94b34882.f006147c.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[3299],{695:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>p,frontMatter:()=>o,metadata:()=>r,toc:()=>l});var a=n(6070),i=n(5710);const o={id:"private-daos-management",title:"Private DAOs Management"},s=void 0,r={id:"explore/use-cases/private-daos-management",title:"Private DAOs Management",description:"Migrate sensitive on-chain and off-chain data into a DAO-owned private Calimero application, enabling you to interact with the base chain of the DAO. DAO members keep the core contract logic on-chain, while shielding all the sensitive data.",source:"@site/docs/01-explore/05-use-cases/00-private-dao-management.mdx",sourceDirName:"01-explore/05-use-cases",slug:"/explore/use-cases/private-daos-management",permalink:"/explore/use-cases/private-daos-management",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718634626e3,sidebarPosition:0,frontMatter:{id:"private-daos-management",title:"Private DAOs Management"},sidebar:"tutorialSidebar",previous:{title:"ZK",permalink:"/explore/why-not/zk"},next:{title:"Decentralized Voting Systems",permalink:"/explore/use-cases/decentralized-voting-systems"}},c={},l=[];function d(e){const t={p:"p",...(0,i.R)(),...e.components};return(0,a.jsx)(t.p,{children:"Migrate sensitive on-chain and off-chain data into a DAO-owned private Calimero application, enabling you to interact with the base chain of the DAO. DAO members keep the core contract logic on-chain, while shielding all the sensitive data."})}function p(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},5710:(e,t,n)=>{n.d(t,{R:()=>s,x:()=>r});var a=n(758);const i={},o=a.createContext(i);function s(e){const t=a.useContext(o);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),a.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[3299],{695:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>p,frontMatter:()=>o,metadata:()=>r,toc:()=>l});var a=n(6070),i=n(5710);const o={id:"private-daos-management",title:"Private DAOs Management"},s=void 0,r={id:"explore/use-cases/private-daos-management",title:"Private DAOs Management",description:"Migrate sensitive on-chain and off-chain data into a DAO-owned private Calimero application, enabling you to interact with the base chain of the DAO. DAO members keep the core contract logic on-chain, while shielding all the sensitive data.",source:"@site/docs/01-explore/05-use-cases/00-private-dao-management.mdx",sourceDirName:"01-explore/05-use-cases",slug:"/explore/use-cases/private-daos-management",permalink:"/explore/use-cases/private-daos-management",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718723446e3,sidebarPosition:0,frontMatter:{id:"private-daos-management",title:"Private DAOs Management"},sidebar:"tutorialSidebar",previous:{title:"ZK",permalink:"/explore/why-not/zk"},next:{title:"Decentralized Voting Systems",permalink:"/explore/use-cases/decentralized-voting-systems"}},c={},l=[];function d(e){const t={p:"p",...(0,i.R)(),...e.components};return(0,a.jsx)(t.p,{children:"Migrate sensitive on-chain and off-chain data into a DAO-owned private Calimero application, enabling you to interact with the base chain of the DAO. DAO members keep the core contract logic on-chain, while shielding all the sensitive data."})}function p(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},5710:(e,t,n)=>{n.d(t,{R:()=>s,x:()=>r});var a=n(758);const i={},o=a.createContext(i);function s(e){const t=a.useContext(o);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function r(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),a.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/962e3ea7.5016389b.js b/assets/js/962e3ea7.397f56c8.js similarity index 99% rename from assets/js/962e3ea7.5016389b.js rename to assets/js/962e3ea7.397f56c8.js index e123172d..80f8e534 100644 --- a/assets/js/962e3ea7.5016389b.js +++ b/assets/js/962e3ea7.397f56c8.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8077],{334:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>a,contentTitle:()=>o,default:()=>h,frontMatter:()=>t,metadata:()=>l,toc:()=>c});var i=s(6070),r=s(5710);const t={id:"network",title:"Network"},o=void 0,l={id:"learn/core-concepts/node/network",title:"Network",description:"Overview",source:"@site/docs/02-learn/03-core-concepts/02-node/05-network.mdx",sourceDirName:"02-learn/03-core-concepts/02-node",slug:"/learn/core-concepts/node/network",permalink:"/learn/core-concepts/node/network",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718634626e3,sidebarPosition:5,frontMatter:{id:"network",title:"Network"},sidebar:"tutorialSidebar",previous:{title:"Storage",permalink:"/learn/core-concepts/node/storage"},next:{title:"Admin Client API",permalink:"/learn/core-concepts/node/admin-client-api"}},a={},c=[{value:"Overview",id:"overview",level:2},{value:"Node Types",id:"node-types",level:2},{value:"Client Node",id:"client-node",level:3},{value:"Boot Node",id:"boot-node",level:3},{value:"P2P protocols and techniques",id:"p2p-protocols-and-techniques",level:2},{value:"Protocol Descriptions",id:"protocol-descriptions",level:3},{value:"DCUtR (Direct Connection Upgrade through Relay)",id:"dcutr-direct-connection-upgrade-through-relay",level:4},{value:"Gossipsub",id:"gossipsub",level:4},{value:"Identify",id:"identify",level:4},{value:"Kademlia (Kad)",id:"kademlia-kad",level:4},{value:"mDNS (Multicast DNS)",id:"mdns-multicast-dns",level:4},{value:"Ping",id:"ping",level:4},{value:"Relay",id:"relay",level:4},{value:"Rendezvous",id:"rendezvous",level:4},{value:"NAT Traversal Techniques",id:"nat-traversal-techniques",level:3}];function d(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h2,{id:"overview",children:"Overview"}),"\n",(0,i.jsxs)(n.p,{children:["This document provides an overview of the networking component of Calimero Network, which is implemented using the ",(0,i.jsx)(n.code,{children:"libp2p"})," library. The network consists of two types of peers: client nodes and boot nodes, each serving distinct roles and utilizing specific protocols to facilitate peer-to-peer communication.\nClient node is the component which hosts and runs client applications, communicates and shares data between other client nodes.\nBoot node is the component used for the initial discovery of the peers in the network."]}),"\n",(0,i.jsx)(n.h2,{id:"node-types",children:"Node Types"}),"\n",(0,i.jsx)(n.h3,{id:"client-node",children:"Client Node"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Deployment:"})," Can run on any machine"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Protocols Utilized:"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#dcutr-direct-connection-upgrade-through-relay",children:"dcutr"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#gossipsub",children:"gossipsub"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#identify",children:"identify"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#kademlia-kad",children:"kad"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#mdns-multicast-dns",children:"mdns"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#ping",children:"ping"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#rendezvous",children:"rendezvous"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#relay",children:"relay"})}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Behavior:"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Configuration:"})," A client node can be configured to use zero boot nodes."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"External Address:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Direct Public External Address:"})," Nodes with a direct public external address do not require reservation at the relay server. These nodes publish their public external address to the Kademlia DHT, making them directly accessible to other peers."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Relayed External Address:"})," Nodes that do not have a direct public external address, typically those behind a NAT or firewall, can obtain a relayed external address by requesting a reservation at a relay server. Once the reservation is accepted, the node publishes its new external address to the rendezvous server. This allows other nodes to discover relayed addresses of a peers in a certain rendezvous namespace. The relay server can be used for the coordination of the hole punching between two nodes. If the hole punching attempt fails, the relay server will bridge the traffic."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Discovery Protocols:"})," ",(0,i.jsx)(n.code,{children:"mDNS"}),", ",(0,i.jsx)(n.code,{children:"rendezvous"})," and ",(0,i.jsx)(n.code,{children:"Kademlia"})]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Connection Management:"})," A peer, identified via PeerId, can be discovered either via mDNS, rendezvous or Kademlia. mDNS discovery provides local network addresses, rendezvous discovery provides relayed addresses, and Kademlia discovery provides direct public external addresses. The node maintains information about its connections to peers, including the discovery source. For a discovered external address, either relayed or direct public, the node will only attempt to dial the peer if the same peer is not already connected via a discovered local address. This ensures that local connections have higher priority and that there are no unnecessary hole punching attempts."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Message Relaying:"})," The node participates in the ",(0,i.jsx)(n.code,{children:"gossipsub"})," protocol, relaying messages to all connected peers that support it. This enables efficient and scalable message dissemination across the network."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"boot-node",children:"Boot Node"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Deployment:"})," Must run on a publicly available machine with a static IP address."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Protocols Utilized:"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#identify",children:"identify"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#kademlia-kad",children:"kad"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#ping",children:"ping"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#rendezvous",children:"rendezvous"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#relay",children:"relay"})}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Behavior:"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Characteristics:"})," Boot nodes are publicly available, long-running nodes that provide stable entry points to the network."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Functions:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Bootstrap Node:"})," Acts as a well-known peer for the Kademlia protocol, facilitating peer discovery and network join operations."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Circuit Relay Server:"})," Serves as a generic relay that provides the medium that facilitates the hole punching, enabling peers to establish direct connections even when they are behind NAT or firewalls. The relay server is used for the coordination of the hole punching between two nodes, and briding traffic if the hole punching attempt fails."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Rendezvous Server:"})," Facilitates peer discovery by allowing nodes to register their presence and query for other peers within a shared rendezvous namespace. This enables dynamic and efficient peer-to-peer connections without relying on a static list of peers."]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"p2p-protocols-and-techniques",children:"P2P protocols and techniques"}),"\n",(0,i.jsx)(n.h3,{id:"protocol-descriptions",children:"Protocol Descriptions"}),"\n",(0,i.jsx)(n.h4,{id:"dcutr-direct-connection-upgrade-through-relay",children:"DCUtR (Direct Connection Upgrade through Relay)"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"DCUtR is used to upgrade connections through relay nodes, allowing peers to establish direct connections even if they are behind NATs or firewalls. Peers initially connect via a relay node, then use the DCUtR protocol to attempt a direct connection, which reduces latency and bandwidth usage."}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Reference:"})," ",(0,i.jsx)(n.a,{href:"https://github.com/libp2p/specs/blob/master/relay/DCUtR.md",children:"libp2p DCUtR Documentation"})]}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"gossipsub",children:"Gossipsub"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Gossipsub is a scalable and efficient pub-sub protocol for message dissemination. It combines the best aspects of gossip protocols and topic-based pub-sub systems. It minimizes bandwidth usage by only gossiping metadata and ensuring that messages are only sent once per peer."}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Reference:"})," ",(0,i.jsx)(n.a,{href:"https://github.com/libp2p/specs/tree/master/pubsub/gossipsub",children:"libp2p Gossipsub Documentation"})]}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"identify",children:"Identify"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"The Identify protocol allows peers to identify themselves and share their capabilities with other peers. Peers exchange identification information such as supported protocols, listen addresses, and public keys. This helps peers make informed decisions about connecting and interacting."}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Reference:"})," ",(0,i.jsx)(n.a,{href:"https://github.com/libp2p/specs/blob/master/identify/README.md",children:"libp2p Identify Documentation"})]}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"kademlia-kad",children:"Kademlia (Kad)"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Kademlia is a distributed hash table (DHT) protocol used for peer discovery and data routing. It uses an XOR metric to ensure efficient and scalable peer lookup. Each node maintains a routing table with information about other nodes, facilitating quick lookups and robust network operation."}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Reference:"})," ",(0,i.jsx)(n.a,{href:"https://github.com/libp2p/specs/tree/master/kad-dht",children:"libp2p Kademlia DHT Documentation"})]}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"mdns-multicast-dns",children:"mDNS (Multicast DNS)"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"mDNS enables local network peer discovery without the need for a central server. It uses multicast DNS to allow peers to find each other on the same local network by broadcasting their presence and listening for broadcasts from other peers."}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Reference:"})," ",(0,i.jsx)(n.a,{href:"https://github.com/libp2p/specs/tree/master/discovery/mdns",children:"libp2p mDNS Documentation"})]}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"ping",children:"Ping"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"The Ping protocol measures the round-trip time (latency) between peers. It regularly pings connected peers and measures the time it takes for a response. This helps in maintaining healthy connections and understanding network latency."}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Reference:"})," ",(0,i.jsx)(n.a,{href:"https://github.com/libp2p/go-libp2p-ping",children:"libp2p Ping Documentation"})]}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"relay",children:"Relay"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"The Relay protocol supports relay-based communication, allowing peers to communicate through intermediary nodes when direct connections are not possible. Nodes can use relay nodes to forward their traffic, which is especially useful for nodes behind NATs or firewalls. The protocol includes mechanisms for reserving relay slots and managing relay connections."}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Reference:"})," ",(0,i.jsx)(n.a,{href:"https://github.com/libp2p/specs/tree/master/relay",children:"libp2p Relay Documentation"})]}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"rendezvous",children:"Rendezvous"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"The Rendezvous protocol enables peers to discover each other by registering at and querying a shared rendezvous point. This is useful for dynamically finding peers without needing a central directory or pre-established list of peers. Peers register their presence at a rendezvous server and can also query the server to find other peers."}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Reference:"})," ",(0,i.jsx)(n.a,{href:"https://github.com/libp2p/specs/tree/master/rendezvous",children:"libp2p Rendezvous Documentation"})]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"nat-traversal-techniques",children:"NAT Traversal Techniques"}),"\n",(0,i.jsxs)(n.p,{children:["One of the common techniques used for NAT traversal in P2P networks is ",(0,i.jsx)(n.strong,{children:"Hole Punching"}),". This technique allows two peers, each behind a NAT, to establish a direct connection with each other. Here's a brief explanation:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Hole Punching:"})," This technique involves three steps:","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Step 1 - Connection to Public Server:"}),' Both peers initially connect to a public server (in this case, the relay server). This creates a NAT mapping (a "hole") for outgoing packets to the server.']}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Step 2 - Exchange of Address Information:"})," The server shares the public address information of each peer with the other. This information includes the IP address and port number that the NAT has assigned for the connection to the server."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Step 3 - Direct Connection:"})," Each peer sends a packet to the other peer's public address. Since a mapping for this address already exists in the NAT (from the connection to the server), the NAT forwards the packet to the appropriate internal address, and a direct connection is established."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"This technique is particularly useful in P2P networks, as it allows peers to communicate directly, reducing the load on relay servers and improving network efficiency. However, it's worth noting that hole punching may not work with all types of NATs, and success can depend on the specific NAT implementation and configuration."}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Reference:"})," ",(0,i.jsx)(n.a,{href:"https://blog.ipfs.tech/2022-01-20-libp2p-hole-punching/",children:"Hole punching in libp2p"})]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Reference:"})," ",(0,i.jsx)(n.a,{href:"https://tailscale.com/blog/how-nat-traversal-works",children:"How NAT traversal works"})]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},5710:(e,n,s)=>{s.d(n,{R:()=>o,x:()=>l});var i=s(758);const r={},t=i.createContext(r);function o(e){const n=i.useContext(t);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),i.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8077],{334:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>a,contentTitle:()=>o,default:()=>h,frontMatter:()=>t,metadata:()=>l,toc:()=>c});var i=s(6070),r=s(5710);const t={id:"network",title:"Network"},o=void 0,l={id:"learn/core-concepts/node/network",title:"Network",description:"Overview",source:"@site/docs/02-learn/03-core-concepts/02-node/05-network.mdx",sourceDirName:"02-learn/03-core-concepts/02-node",slug:"/learn/core-concepts/node/network",permalink:"/learn/core-concepts/node/network",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718723446e3,sidebarPosition:5,frontMatter:{id:"network",title:"Network"},sidebar:"tutorialSidebar",previous:{title:"Storage",permalink:"/learn/core-concepts/node/storage"},next:{title:"Admin Client API",permalink:"/learn/core-concepts/node/admin-client-api"}},a={},c=[{value:"Overview",id:"overview",level:2},{value:"Node Types",id:"node-types",level:2},{value:"Client Node",id:"client-node",level:3},{value:"Boot Node",id:"boot-node",level:3},{value:"P2P protocols and techniques",id:"p2p-protocols-and-techniques",level:2},{value:"Protocol Descriptions",id:"protocol-descriptions",level:3},{value:"DCUtR (Direct Connection Upgrade through Relay)",id:"dcutr-direct-connection-upgrade-through-relay",level:4},{value:"Gossipsub",id:"gossipsub",level:4},{value:"Identify",id:"identify",level:4},{value:"Kademlia (Kad)",id:"kademlia-kad",level:4},{value:"mDNS (Multicast DNS)",id:"mdns-multicast-dns",level:4},{value:"Ping",id:"ping",level:4},{value:"Relay",id:"relay",level:4},{value:"Rendezvous",id:"rendezvous",level:4},{value:"NAT Traversal Techniques",id:"nat-traversal-techniques",level:3}];function d(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h2,{id:"overview",children:"Overview"}),"\n",(0,i.jsxs)(n.p,{children:["This document provides an overview of the networking component of Calimero Network, which is implemented using the ",(0,i.jsx)(n.code,{children:"libp2p"})," library. The network consists of two types of peers: client nodes and boot nodes, each serving distinct roles and utilizing specific protocols to facilitate peer-to-peer communication.\nClient node is the component which hosts and runs client applications, communicates and shares data between other client nodes.\nBoot node is the component used for the initial discovery of the peers in the network."]}),"\n",(0,i.jsx)(n.h2,{id:"node-types",children:"Node Types"}),"\n",(0,i.jsx)(n.h3,{id:"client-node",children:"Client Node"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Deployment:"})," Can run on any machine"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Protocols Utilized:"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#dcutr-direct-connection-upgrade-through-relay",children:"dcutr"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#gossipsub",children:"gossipsub"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#identify",children:"identify"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#kademlia-kad",children:"kad"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#mdns-multicast-dns",children:"mdns"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#ping",children:"ping"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#rendezvous",children:"rendezvous"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#relay",children:"relay"})}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Behavior:"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Configuration:"})," A client node can be configured to use zero boot nodes."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"External Address:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Direct Public External Address:"})," Nodes with a direct public external address do not require reservation at the relay server. These nodes publish their public external address to the Kademlia DHT, making them directly accessible to other peers."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Relayed External Address:"})," Nodes that do not have a direct public external address, typically those behind a NAT or firewall, can obtain a relayed external address by requesting a reservation at a relay server. Once the reservation is accepted, the node publishes its new external address to the rendezvous server. This allows other nodes to discover relayed addresses of a peers in a certain rendezvous namespace. The relay server can be used for the coordination of the hole punching between two nodes. If the hole punching attempt fails, the relay server will bridge the traffic."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Discovery Protocols:"})," ",(0,i.jsx)(n.code,{children:"mDNS"}),", ",(0,i.jsx)(n.code,{children:"rendezvous"})," and ",(0,i.jsx)(n.code,{children:"Kademlia"})]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Connection Management:"})," A peer, identified via PeerId, can be discovered either via mDNS, rendezvous or Kademlia. mDNS discovery provides local network addresses, rendezvous discovery provides relayed addresses, and Kademlia discovery provides direct public external addresses. The node maintains information about its connections to peers, including the discovery source. For a discovered external address, either relayed or direct public, the node will only attempt to dial the peer if the same peer is not already connected via a discovered local address. This ensures that local connections have higher priority and that there are no unnecessary hole punching attempts."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Message Relaying:"})," The node participates in the ",(0,i.jsx)(n.code,{children:"gossipsub"})," protocol, relaying messages to all connected peers that support it. This enables efficient and scalable message dissemination across the network."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"boot-node",children:"Boot Node"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Deployment:"})," Must run on a publicly available machine with a static IP address."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Protocols Utilized:"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#identify",children:"identify"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#kademlia-kad",children:"kad"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#ping",children:"ping"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#rendezvous",children:"rendezvous"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"#relay",children:"relay"})}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Behavior:"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Characteristics:"})," Boot nodes are publicly available, long-running nodes that provide stable entry points to the network."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Functions:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Bootstrap Node:"})," Acts as a well-known peer for the Kademlia protocol, facilitating peer discovery and network join operations."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Circuit Relay Server:"})," Serves as a generic relay that provides the medium that facilitates the hole punching, enabling peers to establish direct connections even when they are behind NAT or firewalls. The relay server is used for the coordination of the hole punching between two nodes, and briding traffic if the hole punching attempt fails."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Rendezvous Server:"})," Facilitates peer discovery by allowing nodes to register their presence and query for other peers within a shared rendezvous namespace. This enables dynamic and efficient peer-to-peer connections without relying on a static list of peers."]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"p2p-protocols-and-techniques",children:"P2P protocols and techniques"}),"\n",(0,i.jsx)(n.h3,{id:"protocol-descriptions",children:"Protocol Descriptions"}),"\n",(0,i.jsx)(n.h4,{id:"dcutr-direct-connection-upgrade-through-relay",children:"DCUtR (Direct Connection Upgrade through Relay)"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"DCUtR is used to upgrade connections through relay nodes, allowing peers to establish direct connections even if they are behind NATs or firewalls. Peers initially connect via a relay node, then use the DCUtR protocol to attempt a direct connection, which reduces latency and bandwidth usage."}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Reference:"})," ",(0,i.jsx)(n.a,{href:"https://github.com/libp2p/specs/blob/master/relay/DCUtR.md",children:"libp2p DCUtR Documentation"})]}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"gossipsub",children:"Gossipsub"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Gossipsub is a scalable and efficient pub-sub protocol for message dissemination. It combines the best aspects of gossip protocols and topic-based pub-sub systems. It minimizes bandwidth usage by only gossiping metadata and ensuring that messages are only sent once per peer."}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Reference:"})," ",(0,i.jsx)(n.a,{href:"https://github.com/libp2p/specs/tree/master/pubsub/gossipsub",children:"libp2p Gossipsub Documentation"})]}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"identify",children:"Identify"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"The Identify protocol allows peers to identify themselves and share their capabilities with other peers. Peers exchange identification information such as supported protocols, listen addresses, and public keys. This helps peers make informed decisions about connecting and interacting."}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Reference:"})," ",(0,i.jsx)(n.a,{href:"https://github.com/libp2p/specs/blob/master/identify/README.md",children:"libp2p Identify Documentation"})]}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"kademlia-kad",children:"Kademlia (Kad)"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Kademlia is a distributed hash table (DHT) protocol used for peer discovery and data routing. It uses an XOR metric to ensure efficient and scalable peer lookup. Each node maintains a routing table with information about other nodes, facilitating quick lookups and robust network operation."}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Reference:"})," ",(0,i.jsx)(n.a,{href:"https://github.com/libp2p/specs/tree/master/kad-dht",children:"libp2p Kademlia DHT Documentation"})]}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"mdns-multicast-dns",children:"mDNS (Multicast DNS)"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"mDNS enables local network peer discovery without the need for a central server. It uses multicast DNS to allow peers to find each other on the same local network by broadcasting their presence and listening for broadcasts from other peers."}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Reference:"})," ",(0,i.jsx)(n.a,{href:"https://github.com/libp2p/specs/tree/master/discovery/mdns",children:"libp2p mDNS Documentation"})]}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"ping",children:"Ping"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"The Ping protocol measures the round-trip time (latency) between peers. It regularly pings connected peers and measures the time it takes for a response. This helps in maintaining healthy connections and understanding network latency."}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Reference:"})," ",(0,i.jsx)(n.a,{href:"https://github.com/libp2p/go-libp2p-ping",children:"libp2p Ping Documentation"})]}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"relay",children:"Relay"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"The Relay protocol supports relay-based communication, allowing peers to communicate through intermediary nodes when direct connections are not possible. Nodes can use relay nodes to forward their traffic, which is especially useful for nodes behind NATs or firewalls. The protocol includes mechanisms for reserving relay slots and managing relay connections."}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Reference:"})," ",(0,i.jsx)(n.a,{href:"https://github.com/libp2p/specs/tree/master/relay",children:"libp2p Relay Documentation"})]}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"rendezvous",children:"Rendezvous"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"The Rendezvous protocol enables peers to discover each other by registering at and querying a shared rendezvous point. This is useful for dynamically finding peers without needing a central directory or pre-established list of peers. Peers register their presence at a rendezvous server and can also query the server to find other peers."}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Reference:"})," ",(0,i.jsx)(n.a,{href:"https://github.com/libp2p/specs/tree/master/rendezvous",children:"libp2p Rendezvous Documentation"})]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"nat-traversal-techniques",children:"NAT Traversal Techniques"}),"\n",(0,i.jsxs)(n.p,{children:["One of the common techniques used for NAT traversal in P2P networks is ",(0,i.jsx)(n.strong,{children:"Hole Punching"}),". This technique allows two peers, each behind a NAT, to establish a direct connection with each other. Here's a brief explanation:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Hole Punching:"})," This technique involves three steps:","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Step 1 - Connection to Public Server:"}),' Both peers initially connect to a public server (in this case, the relay server). This creates a NAT mapping (a "hole") for outgoing packets to the server.']}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Step 2 - Exchange of Address Information:"})," The server shares the public address information of each peer with the other. This information includes the IP address and port number that the NAT has assigned for the connection to the server."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Step 3 - Direct Connection:"})," Each peer sends a packet to the other peer's public address. Since a mapping for this address already exists in the NAT (from the connection to the server), the NAT forwards the packet to the appropriate internal address, and a direct connection is established."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"This technique is particularly useful in P2P networks, as it allows peers to communicate directly, reducing the load on relay servers and improving network efficiency. However, it's worth noting that hole punching may not work with all types of NATs, and success can depend on the specific NAT implementation and configuration."}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Reference:"})," ",(0,i.jsx)(n.a,{href:"https://blog.ipfs.tech/2022-01-20-libp2p-hole-punching/",children:"Hole punching in libp2p"})]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Reference:"})," ",(0,i.jsx)(n.a,{href:"https://tailscale.com/blog/how-nat-traversal-works",children:"How NAT traversal works"})]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},5710:(e,n,s)=>{s.d(n,{R:()=>o,x:()=>l});var i=s(758);const r={},t=i.createContext(r);function o(e){const n=i.useContext(t);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),i.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/964ce0ca.2dd6d71d.js b/assets/js/964ce0ca.69f4f9be.js similarity index 98% rename from assets/js/964ce0ca.2dd6d71d.js rename to assets/js/964ce0ca.69f4f9be.js index 9ed5df1e..b514cb13 100644 --- a/assets/js/964ce0ca.2dd6d71d.js +++ b/assets/js/964ce0ca.69f4f9be.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[106],{4552:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>o,contentTitle:()=>s,default:()=>u,frontMatter:()=>p,metadata:()=>l,toc:()=>r});var n=t(6070),a=t(5710);const p={id:"publish-app",title:"Publish App"},s=void 0,l={id:"build/publish-app",title:"Publish App",description:"After you have built your application, you can publish it to the network. This will make it available for users to interact with.",source:"@site/docs/03-build/03-publish-app.mdx",sourceDirName:"03-build",slug:"/build/publish-app",permalink:"/build/publish-app",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718634626e3,sidebarPosition:3,frontMatter:{id:"publish-app",title:"Publish App"},sidebar:"tutorialSidebar",previous:{title:"TypeScript Client SDK",permalink:"/build/client-sdks/client-ts-sdk"},next:{title:"GitHub",permalink:"/contribute/github"}},o={},r=[{value:"Publishing application",id:"publishing-application",level:2},{value:"Application preview",id:"application-preview",level:2},{value:"Example app preview",id:"example-app-preview",level:2}];function c(e){const i={a:"a",code:"code",h2:"h2",img:"img",p:"p",...(0,a.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.p,{children:"After you have built your application, you can publish it to the network. This will make it available for users to interact with."}),"\n",(0,n.jsx)(i.h2,{id:"publishing-application",children:"Publishing application"}),"\n",(0,n.jsxs)(i.p,{children:["Navigate to ",(0,n.jsx)(i.a,{href:"../explore/developers-quickstart/admin-dashboard",children:"Admin Dashboard"})," and select ",(0,n.jsx)(i.code,{children:"Applications"})," tab."]}),"\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.img,{alt:"Publish application",src:t(9987).A+"",width:"1968",height:"1562"})}),"\n",(0,n.jsx)(i.p,{children:"Enter the required data and publish the application. After publishing, your application will be available for users to interact with in new contexts."}),"\n",(0,n.jsx)(i.h2,{id:"application-preview",children:"Application preview"}),"\n",(0,n.jsx)(i.p,{children:"Good practice allows users to try an app before they decide to use it. You can deploy an app to any host provider."}),"\n",(0,n.jsxs)(i.p,{children:["We have used GitHub Pages to preview our ",(0,n.jsx)(i.a,{href:"../explore/developers-quickstart/example-app",children:"example app"}),". You can do the same by following the steps below."]}),"\n",(0,n.jsx)(i.h2,{id:"example-app-preview",children:"Example app preview"}),"\n",(0,n.jsxs)(i.p,{children:["First you need to enable GitHub Pages by following ",(0,n.jsx)(i.a,{href:"https://docs.github.com/en/pages/getting-started-with-github-pages/creating-a-github-pages-site",children:"Creating a GitHub Pages"})]}),"\n",(0,n.jsxs)(i.p,{children:["Our example app is written in next.js and code is available in ",(0,n.jsx)(i.a,{href:"https://github.com/calimero-network/only-peers-client",children:"only-peers-client"}),"\nAfter enabling GitHub Pages, a few changes are required in your next.js app.\n",(0,n.jsx)(i.code,{children:"next.config.mjs"}),' should contain output: "export" field']}),"\n",(0,n.jsxs)(i.p,{children:["GitHub Actions is a platform used to automate the deployment process. You can find example in ",(0,n.jsx)(i.a,{href:"https://github.com/calimero-network/only-peers-client/tree/master/.github/workflows",children:"github workflow"})]})]})}function u(e={}){const{wrapper:i}={...(0,a.R)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},9987:(e,i,t)=>{t.d(i,{A:()=>n});const n=t.p+"assets/images/publish-new-application-f4493f9baa5b1dc59d62ab483b52bb65.png"},5710:(e,i,t)=>{t.d(i,{R:()=>s,x:()=>l});var n=t(758);const a={},p=n.createContext(a);function s(e){const i=n.useContext(p);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function l(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),n.createElement(p.Provider,{value:i},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[106],{4552:(e,i,t)=>{t.r(i),t.d(i,{assets:()=>o,contentTitle:()=>s,default:()=>u,frontMatter:()=>p,metadata:()=>l,toc:()=>r});var n=t(6070),a=t(5710);const p={id:"publish-app",title:"Publish App"},s=void 0,l={id:"build/publish-app",title:"Publish App",description:"After you have built your application, you can publish it to the network. This will make it available for users to interact with.",source:"@site/docs/03-build/03-publish-app.mdx",sourceDirName:"03-build",slug:"/build/publish-app",permalink:"/build/publish-app",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718723446e3,sidebarPosition:3,frontMatter:{id:"publish-app",title:"Publish App"},sidebar:"tutorialSidebar",previous:{title:"TypeScript Client SDK",permalink:"/build/client-sdks/client-ts-sdk"},next:{title:"GitHub",permalink:"/contribute/github"}},o={},r=[{value:"Publishing application",id:"publishing-application",level:2},{value:"Application preview",id:"application-preview",level:2},{value:"Example app preview",id:"example-app-preview",level:2}];function c(e){const i={a:"a",code:"code",h2:"h2",img:"img",p:"p",...(0,a.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(i.p,{children:"After you have built your application, you can publish it to the network. This will make it available for users to interact with."}),"\n",(0,n.jsx)(i.h2,{id:"publishing-application",children:"Publishing application"}),"\n",(0,n.jsxs)(i.p,{children:["Navigate to ",(0,n.jsx)(i.a,{href:"../explore/developers-quickstart/admin-dashboard",children:"Admin Dashboard"})," and select ",(0,n.jsx)(i.code,{children:"Applications"})," tab."]}),"\n",(0,n.jsx)(i.p,{children:(0,n.jsx)(i.img,{alt:"Publish application",src:t(9987).A+"",width:"1968",height:"1562"})}),"\n",(0,n.jsx)(i.p,{children:"Enter the required data and publish the application. After publishing, your application will be available for users to interact with in new contexts."}),"\n",(0,n.jsx)(i.h2,{id:"application-preview",children:"Application preview"}),"\n",(0,n.jsx)(i.p,{children:"Good practice allows users to try an app before they decide to use it. You can deploy an app to any host provider."}),"\n",(0,n.jsxs)(i.p,{children:["We have used GitHub Pages to preview our ",(0,n.jsx)(i.a,{href:"../explore/developers-quickstart/example-app",children:"example app"}),". You can do the same by following the steps below."]}),"\n",(0,n.jsx)(i.h2,{id:"example-app-preview",children:"Example app preview"}),"\n",(0,n.jsxs)(i.p,{children:["First you need to enable GitHub Pages by following ",(0,n.jsx)(i.a,{href:"https://docs.github.com/en/pages/getting-started-with-github-pages/creating-a-github-pages-site",children:"Creating a GitHub Pages"})]}),"\n",(0,n.jsxs)(i.p,{children:["Our example app is written in next.js and code is available in ",(0,n.jsx)(i.a,{href:"https://github.com/calimero-network/only-peers-client",children:"only-peers-client"}),"\nAfter enabling GitHub Pages, a few changes are required in your next.js app.\n",(0,n.jsx)(i.code,{children:"next.config.mjs"}),' should contain output: "export" field']}),"\n",(0,n.jsxs)(i.p,{children:["GitHub Actions is a platform used to automate the deployment process. You can find example in ",(0,n.jsx)(i.a,{href:"https://github.com/calimero-network/only-peers-client/tree/master/.github/workflows",children:"github workflow"})]})]})}function u(e={}){const{wrapper:i}={...(0,a.R)(),...e.components};return i?(0,n.jsx)(i,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},9987:(e,i,t)=>{t.d(i,{A:()=>n});const n=t.p+"assets/images/publish-new-application-f4493f9baa5b1dc59d62ab483b52bb65.png"},5710:(e,i,t)=>{t.d(i,{R:()=>s,x:()=>l});var n=t(758);const a={},p=n.createContext(a);function s(e){const i=n.useContext(p);return n.useMemo((function(){return"function"==typeof e?e(i):{...i,...e}}),[i,e])}function l(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),n.createElement(p.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/96f6c727.49536363.js b/assets/js/96f6c727.2e093355.js similarity index 97% rename from assets/js/96f6c727.49536363.js rename to assets/js/96f6c727.2e093355.js index 4190a483..f03e9b0a 100644 --- a/assets/js/96f6c727.49536363.js +++ b/assets/js/96f6c727.2e093355.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[6373],{6679:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>s,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>c});var o=t(6070),i=t(5710);const r={id:"zk",title:"ZK"},s=void 0,a={id:"explore/why-not/zk",title:"ZK",description:"Why not ZK?",source:"@site/docs/01-explore/04-why-not/03-zk.mdx",sourceDirName:"01-explore/04-why-not",slug:"/explore/why-not/zk",permalink:"/explore/why-not/zk",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718634626e3,sidebarPosition:3,frontMatter:{id:"zk",title:"ZK"},sidebar:"tutorialSidebar",previous:{title:"IPFS",permalink:"/explore/why-not/ipfs"},next:{title:"Private DAOs Management",permalink:"/explore/use-cases/private-daos-management"}},l={},c=[{value:"Why not ZK?",id:"why-not-zk",level:2},{value:"Calimero vs ZK",id:"calimero-vs-zk",level:2}];function d(e){const n={h2:"h2",p:"p",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h2,{id:"why-not-zk",children:"Why not ZK?"}),"\n",(0,o.jsx)(n.p,{children:"Zero-Knowledge (ZK) solutions focus on enhancing privacy and reducing the need to reveal data during synchronization, but they don't eliminate the need for synchronization itself."}),"\n",(0,o.jsx)(n.h2,{id:"calimero-vs-zk",children:"Calimero vs ZK"}),"\n",(0,o.jsx)(n.p,{children:"Calimero offers a fundamentally different approach with local-first execution and eventual consistency, minimizing synchronization overhead. Additionally, ZK solutions can complement Calimero by providing enhanced privacy features within its framework, offering the best of both worlds without inheriting the synchronization complexities of traditional ZK implementations."})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},5710:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>a});var o=t(758);const i={},r=o.createContext(i);function s(e){const n=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[6373],{6679:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>s,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>c});var o=t(6070),i=t(5710);const r={id:"zk",title:"ZK"},s=void 0,a={id:"explore/why-not/zk",title:"ZK",description:"Why not ZK?",source:"@site/docs/01-explore/04-why-not/03-zk.mdx",sourceDirName:"01-explore/04-why-not",slug:"/explore/why-not/zk",permalink:"/explore/why-not/zk",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718723446e3,sidebarPosition:3,frontMatter:{id:"zk",title:"ZK"},sidebar:"tutorialSidebar",previous:{title:"IPFS",permalink:"/explore/why-not/ipfs"},next:{title:"Private DAOs Management",permalink:"/explore/use-cases/private-daos-management"}},l={},c=[{value:"Why not ZK?",id:"why-not-zk",level:2},{value:"Calimero vs ZK",id:"calimero-vs-zk",level:2}];function d(e){const n={h2:"h2",p:"p",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h2,{id:"why-not-zk",children:"Why not ZK?"}),"\n",(0,o.jsx)(n.p,{children:"Zero-Knowledge (ZK) solutions focus on enhancing privacy and reducing the need to reveal data during synchronization, but they don't eliminate the need for synchronization itself."}),"\n",(0,o.jsx)(n.h2,{id:"calimero-vs-zk",children:"Calimero vs ZK"}),"\n",(0,o.jsx)(n.p,{children:"Calimero offers a fundamentally different approach with local-first execution and eventual consistency, minimizing synchronization overhead. Additionally, ZK solutions can complement Calimero by providing enhanced privacy features within its framework, offering the best of both worlds without inheriting the synchronization complexities of traditional ZK implementations."})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},5710:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>a});var o=t(758);const i={},r=o.createContext(i);function s(e){const n=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9bc1354f.7c091ec2.js b/assets/js/9bc1354f.75f3d4b0.js similarity index 98% rename from assets/js/9bc1354f.7c091ec2.js rename to assets/js/9bc1354f.75f3d4b0.js index 8fa3d073..5d0dde21 100644 --- a/assets/js/9bc1354f.7c091ec2.js +++ b/assets/js/9bc1354f.75f3d4b0.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[3208],{9899:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>c,contentTitle:()=>r,default:()=>u,frontMatter:()=>n,metadata:()=>i,toc:()=>l});var o=a(6070),s=a(5710);const n={id:"decentralized-edge-compute",title:"Decentralized Edge Compute"},r=void 0,i={id:"explore/use-cases/decentralized-edge-compute",title:"Decentralized Edge Compute",description:"Most of the general compute today happens on cloud service because that is where most of the data lives. With Calimero, all the applications data is stored locally, whereas Calimero enables edge compute on that data. Combined with the use of decentralized AI and Edge Inference LLMs, there are numerous use cases how Calimero can enhance user experience: Edge AI on users data for social spam filtering, e-commerce shopping recommendations across channels, to name a few. This would allow users to finally maximize the endless possibilities from their data, on their own rules.",source:"@site/docs/01-explore/05-use-cases/06-decentralized-edge-compute.mdx",sourceDirName:"01-explore/05-use-cases",slug:"/explore/use-cases/decentralized-edge-compute",permalink:"/explore/use-cases/decentralized-edge-compute",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718634626e3,sidebarPosition:6,frontMatter:{id:"decentralized-edge-compute",title:"Decentralized Edge Compute"},sidebar:"tutorialSidebar",previous:{title:"Trustless Gaming",permalink:"/explore/use-cases/trustless-gaming"},next:{title:"Decentralized Identity Verification",permalink:"/explore/use-cases/decentralized-identity-verification"}},c={},l=[];function d(e){const t={p:"p",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.p,{children:"Most of the general compute today happens on cloud service because that is where most of the data lives. With Calimero, all the applications data is stored locally, whereas Calimero enables edge compute on that data. Combined with the use of decentralized AI and Edge Inference LLMs, there are numerous use cases how Calimero can enhance user experience: Edge AI on users data for social spam filtering, e-commerce shopping recommendations across channels, to name a few. This would allow users to finally maximize the endless possibilities from their data, on their own rules."}),"\n",(0,o.jsx)(t.p,{children:"For example, when you used to purchase from a certain merchant, the data was fully controlled by that merchant or the platform where the data was hosted, which would yield to your recommendations being exclusively tied to that merchant. But if the data would have lived on your device, your data recommendations would have been across various market channels, and not exclusively tied to that specific merchant."})]})}function u(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},5710:(e,t,a)=>{a.d(t,{R:()=>r,x:()=>i});var o=a(758);const s={},n=o.createContext(s);function r(e){const t=o.useContext(n);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),o.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[3208],{9899:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>c,contentTitle:()=>r,default:()=>u,frontMatter:()=>n,metadata:()=>i,toc:()=>l});var o=a(6070),s=a(5710);const n={id:"decentralized-edge-compute",title:"Decentralized Edge Compute"},r=void 0,i={id:"explore/use-cases/decentralized-edge-compute",title:"Decentralized Edge Compute",description:"Most of the general compute today happens on cloud service because that is where most of the data lives. With Calimero, all the applications data is stored locally, whereas Calimero enables edge compute on that data. Combined with the use of decentralized AI and Edge Inference LLMs, there are numerous use cases how Calimero can enhance user experience: Edge AI on users data for social spam filtering, e-commerce shopping recommendations across channels, to name a few. This would allow users to finally maximize the endless possibilities from their data, on their own rules.",source:"@site/docs/01-explore/05-use-cases/06-decentralized-edge-compute.mdx",sourceDirName:"01-explore/05-use-cases",slug:"/explore/use-cases/decentralized-edge-compute",permalink:"/explore/use-cases/decentralized-edge-compute",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718723446e3,sidebarPosition:6,frontMatter:{id:"decentralized-edge-compute",title:"Decentralized Edge Compute"},sidebar:"tutorialSidebar",previous:{title:"Trustless Gaming",permalink:"/explore/use-cases/trustless-gaming"},next:{title:"Decentralized Identity Verification",permalink:"/explore/use-cases/decentralized-identity-verification"}},c={},l=[];function d(e){const t={p:"p",...(0,s.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.p,{children:"Most of the general compute today happens on cloud service because that is where most of the data lives. With Calimero, all the applications data is stored locally, whereas Calimero enables edge compute on that data. Combined with the use of decentralized AI and Edge Inference LLMs, there are numerous use cases how Calimero can enhance user experience: Edge AI on users data for social spam filtering, e-commerce shopping recommendations across channels, to name a few. This would allow users to finally maximize the endless possibilities from their data, on their own rules."}),"\n",(0,o.jsx)(t.p,{children:"For example, when you used to purchase from a certain merchant, the data was fully controlled by that merchant or the platform where the data was hosted, which would yield to your recommendations being exclusively tied to that merchant. But if the data would have lived on your device, your data recommendations would have been across various market channels, and not exclusively tied to that specific merchant."})]})}function u(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},5710:(e,t,a)=>{a.d(t,{R:()=>r,x:()=>i});var o=a(758);const s={},n=o.createContext(s);function r(e){const t=o.useContext(n);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),o.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a9154f55.7abbeed0.js b/assets/js/a9154f55.acca73cd.js similarity index 97% rename from assets/js/a9154f55.7abbeed0.js rename to assets/js/a9154f55.acca73cd.js index 5393e3e6..6638a42d 100644 --- a/assets/js/a9154f55.7abbeed0.js +++ b/assets/js/a9154f55.acca73cd.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[1259],{4098:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>d,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var r=n(6070),a=n(5710);const l={id:"decentralized-intellectual-property-management",title:"Decentralized Intellectual Property Management"},o=void 0,i={id:"explore/use-cases/decentralized-intellectual-property-management",title:"Decentralized Intellectual Property Management",description:"The traditional platforms for managing and enforcing intellectual property rights are not fully transparent, resulting in creators not being able to maximize the utility of their work. Developing a decentralized IP management platform would result in a fairer compensation system for all creators.",source:"@site/docs/01-explore/05-use-cases/08-decentralized-intellectual-property-management.mdx",sourceDirName:"01-explore/05-use-cases",slug:"/explore/use-cases/decentralized-intellectual-property-management",permalink:"/explore/use-cases/decentralized-intellectual-property-management",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718634626e3,sidebarPosition:8,frontMatter:{id:"decentralized-intellectual-property-management",title:"Decentralized Intellectual Property Management"},sidebar:"tutorialSidebar",previous:{title:"Decentralized Identity Verification",permalink:"/explore/use-cases/decentralized-identity-verification"},next:{title:"Only Peers",permalink:"/explore/awesome-projects/only-peers"}},s={},c=[];function p(e){const t={p:"p",...(0,a.R)(),...e.components};return(0,r.jsx)(t.p,{children:"The traditional platforms for managing and enforcing intellectual property rights are not fully transparent, resulting in creators not being able to maximize the utility of their work. Developing a decentralized IP management platform would result in a fairer compensation system for all creators."})}function d(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(p,{...e})}):p(e)}},5710:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>i});var r=n(758);const a={},l=r.createContext(a);function o(e){const t=r.useContext(l);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),r.createElement(l.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[1259],{4098:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>d,frontMatter:()=>l,metadata:()=>i,toc:()=>c});var r=n(6070),a=n(5710);const l={id:"decentralized-intellectual-property-management",title:"Decentralized Intellectual Property Management"},o=void 0,i={id:"explore/use-cases/decentralized-intellectual-property-management",title:"Decentralized Intellectual Property Management",description:"The traditional platforms for managing and enforcing intellectual property rights are not fully transparent, resulting in creators not being able to maximize the utility of their work. Developing a decentralized IP management platform would result in a fairer compensation system for all creators.",source:"@site/docs/01-explore/05-use-cases/08-decentralized-intellectual-property-management.mdx",sourceDirName:"01-explore/05-use-cases",slug:"/explore/use-cases/decentralized-intellectual-property-management",permalink:"/explore/use-cases/decentralized-intellectual-property-management",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718723446e3,sidebarPosition:8,frontMatter:{id:"decentralized-intellectual-property-management",title:"Decentralized Intellectual Property Management"},sidebar:"tutorialSidebar",previous:{title:"Decentralized Identity Verification",permalink:"/explore/use-cases/decentralized-identity-verification"},next:{title:"Only Peers",permalink:"/explore/awesome-projects/only-peers"}},s={},c=[];function p(e){const t={p:"p",...(0,a.R)(),...e.components};return(0,r.jsx)(t.p,{children:"The traditional platforms for managing and enforcing intellectual property rights are not fully transparent, resulting in creators not being able to maximize the utility of their work. Developing a decentralized IP management platform would result in a fairer compensation system for all creators."})}function d(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(p,{...e})}):p(e)}},5710:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>i});var r=n(758);const a={},l=r.createContext(a);function o(e){const t=r.useContext(l);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),r.createElement(l.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b9be9bb6.26fbc574.js b/assets/js/b9be9bb6.2ffdf1df.js similarity index 97% rename from assets/js/b9be9bb6.26fbc574.js rename to assets/js/b9be9bb6.2ffdf1df.js index a86e88ec..818fb782 100644 --- a/assets/js/b9be9bb6.26fbc574.js +++ b/assets/js/b9be9bb6.2ffdf1df.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8086],{8665:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>p,frontMatter:()=>o,metadata:()=>i,toc:()=>d});var r=n(6070),s=n(5710);const o={id:"decentralized-voting-systems",title:"Decentralized Voting Systems"},a=void 0,i={id:"explore/use-cases/decentralized-voting-systems",title:"Decentralized Voting Systems",description:"Enhance trust in voting by creating a secure and tamper-proof voting process application, ensuring each vote is counted accurately and cannot be altered. This technology enhances trust in voting by providing verifiable and immutable records while protecting voter privacy. It empowers voters, reduces the risk of fraud, and promotes democratic participation through a transparent and secure voting platform.",source:"@site/docs/01-explore/05-use-cases/01-decentralized-voting-systems.mdx",sourceDirName:"01-explore/05-use-cases",slug:"/explore/use-cases/decentralized-voting-systems",permalink:"/explore/use-cases/decentralized-voting-systems",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718634626e3,sidebarPosition:1,frontMatter:{id:"decentralized-voting-systems",title:"Decentralized Voting Systems"},sidebar:"tutorialSidebar",previous:{title:"Private DAOs Management",permalink:"/explore/use-cases/private-daos-management"},next:{title:"Decentralized Social Platforms",permalink:"/explore/use-cases/decentralized-social-platforms"}},c={},d=[];function l(e){const t={p:"p",...(0,s.R)(),...e.components};return(0,r.jsx)(t.p,{children:"Enhance trust in voting by creating a secure and tamper-proof voting process application, ensuring each vote is counted accurately and cannot be altered. This technology enhances trust in voting by providing verifiable and immutable records while protecting voter privacy. It empowers voters, reduces the risk of fraud, and promotes democratic participation through a transparent and secure voting platform."})}function p(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},5710:(e,t,n)=>{n.d(t,{R:()=>a,x:()=>i});var r=n(758);const s={},o=r.createContext(s);function a(e){const t=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),r.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8086],{8665:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>p,frontMatter:()=>o,metadata:()=>i,toc:()=>d});var r=n(6070),s=n(5710);const o={id:"decentralized-voting-systems",title:"Decentralized Voting Systems"},a=void 0,i={id:"explore/use-cases/decentralized-voting-systems",title:"Decentralized Voting Systems",description:"Enhance trust in voting by creating a secure and tamper-proof voting process application, ensuring each vote is counted accurately and cannot be altered. This technology enhances trust in voting by providing verifiable and immutable records while protecting voter privacy. It empowers voters, reduces the risk of fraud, and promotes democratic participation through a transparent and secure voting platform.",source:"@site/docs/01-explore/05-use-cases/01-decentralized-voting-systems.mdx",sourceDirName:"01-explore/05-use-cases",slug:"/explore/use-cases/decentralized-voting-systems",permalink:"/explore/use-cases/decentralized-voting-systems",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718723446e3,sidebarPosition:1,frontMatter:{id:"decentralized-voting-systems",title:"Decentralized Voting Systems"},sidebar:"tutorialSidebar",previous:{title:"Private DAOs Management",permalink:"/explore/use-cases/private-daos-management"},next:{title:"Decentralized Social Platforms",permalink:"/explore/use-cases/decentralized-social-platforms"}},c={},d=[];function l(e){const t={p:"p",...(0,s.R)(),...e.components};return(0,r.jsx)(t.p,{children:"Enhance trust in voting by creating a secure and tamper-proof voting process application, ensuring each vote is counted accurately and cannot be altered. This technology enhances trust in voting by providing verifiable and immutable records while protecting voter privacy. It empowers voters, reduces the risk of fraud, and promotes democratic participation through a transparent and secure voting platform."})}function p(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},5710:(e,t,n)=>{n.d(t,{R:()=>a,x:()=>i});var r=n(758);const s={},o=r.createContext(s);function a(e){const t=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),r.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/bc9a0017.4a4c0fff.js b/assets/js/bc9a0017.ef7309c7.js similarity index 97% rename from assets/js/bc9a0017.4a4c0fff.js rename to assets/js/bc9a0017.ef7309c7.js index 436828e3..a27f21e1 100644 --- a/assets/js/bc9a0017.4a4c0fff.js +++ b/assets/js/bc9a0017.ef7309c7.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[772],{8154:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>d,contentTitle:()=>a,default:()=>u,frontMatter:()=>n,metadata:()=>s,toc:()=>c});var r=o(6070),i=o(5710);const n={id:"deprod",title:"Decentralized Productivity (DeProd) SaaS"},a=void 0,s={id:"explore/use-cases/deprod",title:"Decentralized Productivity (DeProd) SaaS",description:"Create a decentralized productivity tools suite by self hosting your data on Calimero\u2019s private applications and move away from the control of centralized entities. The new platform would mitigate the burden of lifetime deals and hard migration processes for the current users of Productivity SaaS solutions.",source:"@site/docs/01-explore/05-use-cases/03-deprod.mdx",sourceDirName:"01-explore/05-use-cases",slug:"/explore/use-cases/deprod",permalink:"/explore/use-cases/deprod",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718634626e3,sidebarPosition:3,frontMatter:{id:"deprod",title:"Decentralized Productivity (DeProd) SaaS"},sidebar:"tutorialSidebar",previous:{title:"Decentralized Social Platforms",permalink:"/explore/use-cases/decentralized-social-platforms"},next:{title:"Decentralized Gig Economy",permalink:"/explore/use-cases/decentralized-gig-economy"}},d={},c=[];function l(e){const t={p:"p",...(0,i.R)(),...e.components};return(0,r.jsx)(t.p,{children:"Create a decentralized productivity tools suite by self hosting your data on Calimero\u2019s private applications and move away from the control of centralized entities. The new platform would mitigate the burden of lifetime deals and hard migration processes for the current users of Productivity SaaS solutions."})}function u(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},5710:(e,t,o)=>{o.d(t,{R:()=>a,x:()=>s});var r=o(758);const i={},n=r.createContext(i);function a(e){const t=r.useContext(n);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),r.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[772],{8154:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>d,contentTitle:()=>a,default:()=>u,frontMatter:()=>n,metadata:()=>s,toc:()=>c});var r=o(6070),i=o(5710);const n={id:"deprod",title:"Decentralized Productivity (DeProd) SaaS"},a=void 0,s={id:"explore/use-cases/deprod",title:"Decentralized Productivity (DeProd) SaaS",description:"Create a decentralized productivity tools suite by self hosting your data on Calimero\u2019s private applications and move away from the control of centralized entities. The new platform would mitigate the burden of lifetime deals and hard migration processes for the current users of Productivity SaaS solutions.",source:"@site/docs/01-explore/05-use-cases/03-deprod.mdx",sourceDirName:"01-explore/05-use-cases",slug:"/explore/use-cases/deprod",permalink:"/explore/use-cases/deprod",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718723446e3,sidebarPosition:3,frontMatter:{id:"deprod",title:"Decentralized Productivity (DeProd) SaaS"},sidebar:"tutorialSidebar",previous:{title:"Decentralized Social Platforms",permalink:"/explore/use-cases/decentralized-social-platforms"},next:{title:"Decentralized Gig Economy",permalink:"/explore/use-cases/decentralized-gig-economy"}},d={},c=[];function l(e){const t={p:"p",...(0,i.R)(),...e.components};return(0,r.jsx)(t.p,{children:"Create a decentralized productivity tools suite by self hosting your data on Calimero\u2019s private applications and move away from the control of centralized entities. The new platform would mitigate the burden of lifetime deals and hard migration processes for the current users of Productivity SaaS solutions."})}function u(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},5710:(e,t,o)=>{o.d(t,{R:()=>a,x:()=>s});var r=o(758);const i={},n=r.createContext(i);function a(e){const t=r.useContext(n);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),r.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/bf6ec8e5.a547715d.js b/assets/js/bf6ec8e5.1929a2ae.js similarity index 98% rename from assets/js/bf6ec8e5.a547715d.js rename to assets/js/bf6ec8e5.1929a2ae.js index a9564b33..0c8a5d42 100644 --- a/assets/js/bf6ec8e5.a547715d.js +++ b/assets/js/bf6ec8e5.1929a2ae.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[7607],{8026:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>c});var i=t(6070),s=t(5710);const r={id:"identity",title:"Identity"},o=void 0,a={id:"learn/core-concepts/identity",title:"Identity",description:"Key Management",source:"@site/docs/02-learn/03-core-concepts/01-identity (DID).mdx",sourceDirName:"02-learn/03-core-concepts",slug:"/learn/core-concepts/identity",permalink:"/learn/core-concepts/identity",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718634626e3,sidebarPosition:1,frontMatter:{id:"identity",title:"Identity"},sidebar:"tutorialSidebar",previous:{title:"Architecture",permalink:"/learn/architecture"},next:{title:"Client Node",permalink:"/learn/core-concepts/node/client-node"}},l={},c=[{value:"Key Management",id:"key-management",level:3},{value:"Node Keys",id:"node-keys",level:3},{value:"Application Keys",id:"application-keys",level:3}];function d(e){const n={a:"a",h3:"h3",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h3,{id:"key-management",children:"Key Management"}),"\n",(0,i.jsx)(n.p,{children:"Calimero's key management is centered around two types: Node Keys for node management and Application Keys for app operation. This structure ensures secure, anonymous and decentralized control across the network."}),"\n",(0,i.jsx)(n.h3,{id:"node-keys",children:"Node Keys"}),"\n",(0,i.jsx)(n.p,{children:"Node Keys are used to for node operations which include, add new node keys, identifier listing, and key deletion. Web3 wallets can be used as node keys, easing the setup process."}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Key Initialization Process"}),":"]}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Starting Without Keys"}),": Initially, nodes have no keys. The addition of the first key is crucial for setting up application identities."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Adding the First Key"}),":","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["In the node admin UI, connect a wallet, such as MetaMask or Near wallets compliant with ",(0,i.jsx)(n.a,{href:"https://github.com/near/NEPs/blob/master/neps/nep-0413.md",children:"NEP-413"}),"."]}),"\n",(0,i.jsx)(n.li,{children:"Sign a challenge from the node and submit the signature."}),"\n",(0,i.jsx)(n.li,{children:"If the signature matches the challenge and the public key, the first node key is added, activating key management capabilities."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"application-keys",children:"Application Keys"}),"\n",(0,i.jsx)(n.p,{children:"Application Keys initiate applications, with keypairs stored in browser local storage."}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Application Key Usage"}),":"]}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Key Creation"}),": Users generate a new keypair in their browser."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Verification"}),":","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"A Verifiable Presentation Request is sent to the node, which responds with a challenge."}),"\n",(0,i.jsx)(n.li,{children:"The challenge and public key are signed using the node key."}),"\n",(0,i.jsx)(n.li,{children:"Upon node verification of the request and signature, the new key is cleared for JSONRPC API communication from the browser to the node."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Calimero's TypeScript SDK supports developers in building browser and CLI applications by simplifying interaction with the network."}),"\n",(0,i.jsx)(n.p,{children:"This key management setup underpins secure and efficient operations within the Calimero Network, facilitating both node and application functionalities."})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},5710:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>a});var i=t(758);const s={},r=i.createContext(s);function o(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[7607],{8026:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>r,metadata:()=>a,toc:()=>c});var i=t(6070),s=t(5710);const r={id:"identity",title:"Identity"},o=void 0,a={id:"learn/core-concepts/identity",title:"Identity",description:"Key Management",source:"@site/docs/02-learn/03-core-concepts/01-identity (DID).mdx",sourceDirName:"02-learn/03-core-concepts",slug:"/learn/core-concepts/identity",permalink:"/learn/core-concepts/identity",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718723446e3,sidebarPosition:1,frontMatter:{id:"identity",title:"Identity"},sidebar:"tutorialSidebar",previous:{title:"Architecture",permalink:"/learn/architecture"},next:{title:"Client Node",permalink:"/learn/core-concepts/node/client-node"}},l={},c=[{value:"Key Management",id:"key-management",level:3},{value:"Node Keys",id:"node-keys",level:3},{value:"Application Keys",id:"application-keys",level:3}];function d(e){const n={a:"a",h3:"h3",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h3,{id:"key-management",children:"Key Management"}),"\n",(0,i.jsx)(n.p,{children:"Calimero's key management is centered around two types: Node Keys for node management and Application Keys for app operation. This structure ensures secure, anonymous and decentralized control across the network."}),"\n",(0,i.jsx)(n.h3,{id:"node-keys",children:"Node Keys"}),"\n",(0,i.jsx)(n.p,{children:"Node Keys are used to for node operations which include, add new node keys, identifier listing, and key deletion. Web3 wallets can be used as node keys, easing the setup process."}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Key Initialization Process"}),":"]}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Starting Without Keys"}),": Initially, nodes have no keys. The addition of the first key is crucial for setting up application identities."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Adding the First Key"}),":","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["In the node admin UI, connect a wallet, such as MetaMask or Near wallets compliant with ",(0,i.jsx)(n.a,{href:"https://github.com/near/NEPs/blob/master/neps/nep-0413.md",children:"NEP-413"}),"."]}),"\n",(0,i.jsx)(n.li,{children:"Sign a challenge from the node and submit the signature."}),"\n",(0,i.jsx)(n.li,{children:"If the signature matches the challenge and the public key, the first node key is added, activating key management capabilities."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"application-keys",children:"Application Keys"}),"\n",(0,i.jsx)(n.p,{children:"Application Keys initiate applications, with keypairs stored in browser local storage."}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Application Key Usage"}),":"]}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Key Creation"}),": Users generate a new keypair in their browser."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Verification"}),":","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"A Verifiable Presentation Request is sent to the node, which responds with a challenge."}),"\n",(0,i.jsx)(n.li,{children:"The challenge and public key are signed using the node key."}),"\n",(0,i.jsx)(n.li,{children:"Upon node verification of the request and signature, the new key is cleared for JSONRPC API communication from the browser to the node."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"Calimero's TypeScript SDK supports developers in building browser and CLI applications by simplifying interaction with the network."}),"\n",(0,i.jsx)(n.p,{children:"This key management setup underpins secure and efficient operations within the Calimero Network, facilitating both node and application functionalities."})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},5710:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>a});var i=t(758);const s={},r=i.createContext(s);function o(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c022fa4c.d2ddb871.js b/assets/js/c022fa4c.d579777d.js similarity index 98% rename from assets/js/c022fa4c.d2ddb871.js rename to assets/js/c022fa4c.d579777d.js index 25a994b8..a91d6cf8 100644 --- a/assets/js/c022fa4c.d2ddb871.js +++ b/assets/js/c022fa4c.d579777d.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[7074],{2022:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>r,default:()=>p,frontMatter:()=>a,metadata:()=>c,toc:()=>l});var o=n(6070),i=n(5710);const a={id:"blockchain",title:"Blockchain"},r=void 0,c={id:"explore/why-not/blockchain",title:"Blockchain",description:"Why not Blockchain?",source:"@site/docs/01-explore/04-why-not/01-blockchain.mdx",sourceDirName:"01-explore/04-why-not",slug:"/explore/why-not/blockchain",permalink:"/explore/why-not/blockchain",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718634626e3,sidebarPosition:1,frontMatter:{id:"blockchain",title:"Blockchain"},sidebar:"tutorialSidebar",previous:{title:"Example Application",permalink:"/explore/developers-quickstart/example-app"},next:{title:"IPFS",permalink:"/explore/why-not/ipfs"}},s={},l=[{value:"Why not Blockchain?",id:"why-not-blockchain",level:2},{value:"Calimero vs Blockchain",id:"calimero-vs-blockchain",level:2}];function h(e){const t={h2:"h2",p:"p",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h2,{id:"why-not-blockchain",children:"Why not Blockchain?"}),"\n",(0,o.jsx)(t.p,{children:"By virtue of blockchain principles, there's a couple of issues that arise. The major one being that everyone has to agree on the state of the canonical chain, and therefore there can be only one network actor at any given time. Different chains implement different strategies for electing this actor to alleviate the risk of compromise, but the fundamental issue remains, and hence, the long-standing problem of scalability."}),"\n",(0,o.jsx)(t.h2,{id:"calimero-vs-blockchain",children:"Calimero vs Blockchain"}),"\n",(0,o.jsx)(t.p,{children:"Calimero fundamentally rethinks the problem and offers an alternative approach, local-first execution with eventual consistency. This means that each actor can independently drive their own local state, and the network will eventually reconcile to the same state. Essentially pegging the scalability threshold to the number of actors in the network, and executions are practically instantaneous."}),"\n",(0,o.jsx)(t.p,{children:"State reconciliation is context-aware, meaning that all activity revolves around an instance of an app. This means that participants of a context only have to synchronize with each other, and not the entire network. This is in stark contrast to blockchains, where everyone is forced to synchronize with everyone else and this competition is reflected in gas fees. Calimero doesn't have gas fees, and the cost of execution is directly borne by the actor."}),"\n",(0,o.jsx)(t.p,{children:"Blockchains achieve integrity through transparency, which is a double-edged sword, essentially precluding you from using it in private environments. Calimero however, leverages the direct-actor relationship to encrypt all network traffic between them, and therefore, the network is inherently private."}),"\n",(0,o.jsx)(t.p,{children:"Calimero is also designed to be embeddable, meaning that client apps themselves become the network actors, and the network is the app itself. This is in stark contrast to blockchains, where the network is a separate entity from the client apps."})]})}function p(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}},5710:(e,t,n)=>{n.d(t,{R:()=>r,x:()=>c});var o=n(758);const i={},a=o.createContext(i);function r(e){const t=o.useContext(a);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),o.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[7074],{2022:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>r,default:()=>p,frontMatter:()=>a,metadata:()=>c,toc:()=>l});var o=n(6070),i=n(5710);const a={id:"blockchain",title:"Blockchain"},r=void 0,c={id:"explore/why-not/blockchain",title:"Blockchain",description:"Why not Blockchain?",source:"@site/docs/01-explore/04-why-not/01-blockchain.mdx",sourceDirName:"01-explore/04-why-not",slug:"/explore/why-not/blockchain",permalink:"/explore/why-not/blockchain",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718723446e3,sidebarPosition:1,frontMatter:{id:"blockchain",title:"Blockchain"},sidebar:"tutorialSidebar",previous:{title:"Example Application",permalink:"/explore/developers-quickstart/example-app"},next:{title:"IPFS",permalink:"/explore/why-not/ipfs"}},s={},l=[{value:"Why not Blockchain?",id:"why-not-blockchain",level:2},{value:"Calimero vs Blockchain",id:"calimero-vs-blockchain",level:2}];function h(e){const t={h2:"h2",p:"p",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.h2,{id:"why-not-blockchain",children:"Why not Blockchain?"}),"\n",(0,o.jsx)(t.p,{children:"By virtue of blockchain principles, there's a couple of issues that arise. The major one being that everyone has to agree on the state of the canonical chain, and therefore there can be only one network actor at any given time. Different chains implement different strategies for electing this actor to alleviate the risk of compromise, but the fundamental issue remains, and hence, the long-standing problem of scalability."}),"\n",(0,o.jsx)(t.h2,{id:"calimero-vs-blockchain",children:"Calimero vs Blockchain"}),"\n",(0,o.jsx)(t.p,{children:"Calimero fundamentally rethinks the problem and offers an alternative approach, local-first execution with eventual consistency. This means that each actor can independently drive their own local state, and the network will eventually reconcile to the same state. Essentially pegging the scalability threshold to the number of actors in the network, and executions are practically instantaneous."}),"\n",(0,o.jsx)(t.p,{children:"State reconciliation is context-aware, meaning that all activity revolves around an instance of an app. This means that participants of a context only have to synchronize with each other, and not the entire network. This is in stark contrast to blockchains, where everyone is forced to synchronize with everyone else and this competition is reflected in gas fees. Calimero doesn't have gas fees, and the cost of execution is directly borne by the actor."}),"\n",(0,o.jsx)(t.p,{children:"Blockchains achieve integrity through transparency, which is a double-edged sword, essentially precluding you from using it in private environments. Calimero however, leverages the direct-actor relationship to encrypt all network traffic between them, and therefore, the network is inherently private."}),"\n",(0,o.jsx)(t.p,{children:"Calimero is also designed to be embeddable, meaning that client apps themselves become the network actors, and the network is the app itself. This is in stark contrast to blockchains, where the network is a separate entity from the client apps."})]})}function p(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}},5710:(e,t,n)=>{n.d(t,{R:()=>r,x:()=>c});var o=n(758);const i={},a=o.createContext(i);function r(e){const t=o.useContext(a);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),o.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d84133a6.7e061a46.js b/assets/js/d84133a6.4cb4a6fe.js similarity index 99% rename from assets/js/d84133a6.7e061a46.js rename to assets/js/d84133a6.4cb4a6fe.js index c0e51300..0de288cb 100644 --- a/assets/js/d84133a6.7e061a46.js +++ b/assets/js/d84133a6.4cb4a6fe.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[965],{4735:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>o,default:()=>d,frontMatter:()=>r,metadata:()=>c,toc:()=>l});var i=t(6070),s=t(5710);const r={id:"client-ts-sdk",title:"TypeScript Client SDK"},o=void 0,c={id:"build/client-sdks/client-ts-sdk",title:"TypeScript Client SDK",description:"Getting Started with Calimero SDK for Typescript",source:"@site/docs/03-build/02-client-sdks/02-client-ts-sdk.mdx",sourceDirName:"03-build/02-client-sdks",slug:"/build/client-sdks/client-ts-sdk",permalink:"/build/client-sdks/client-ts-sdk",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718634626e3,sidebarPosition:2,frontMatter:{id:"client-ts-sdk",title:"TypeScript Client SDK"},sidebar:"tutorialSidebar",previous:{title:"Rust Protocol SDK",permalink:"/build/protocol-sdks/protocol-rs-sdk"},next:{title:"Publish App",permalink:"/build/publish-app"}},a={},l=[{value:"Getting Started with Calimero SDK for Typescript",id:"getting-started-with-calimero-sdk-for-typescript",level:2},{value:"Components",id:"components",level:3},{value:"RpcClient interface",id:"rpcclient-interface",level:4},{value:"SubscriptionsClient",id:"subscriptionsclient",level:4},{value:"Examples",id:"examples",level:3},{value:"JsonRpcClient",id:"jsonrpcclient",level:4},{value:"WsSubscriptionsClient",id:"wssubscriptionsclient",level:4}];function p(e){const n={code:"code",h2:"h2",h3:"h3",h4:"h4",p:"p",pre:"pre",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h2,{id:"getting-started-with-calimero-sdk-for-typescript",children:"Getting Started with Calimero SDK for Typescript"}),"\n",(0,i.jsx)(n.p,{children:"Our TypeScript Client SDK is a powerful tool designed to simplify the process of interacting with decentralized peer-to-peer applications installed on the node. It serves as an efficient conduit for communication between the client and the node\u2019s server. This SDK is particularly beneficial for developers as it abstracts the complexities of server communication, allowing them to concentrate on the core application logic."}),"\n",(0,i.jsx)(n.p,{children:"The SDK is built with the modern features of TypeScript, a language that is gaining popularity for its static typing and advanced capabilities. By using our SDK, developers can write applications in TypeScript, and the SDK takes care of the rest. It handles all the interactions with the server, making the development process more streamlined and efficient."}),"\n",(0,i.jsx)(n.p,{children:"This not only enhances the overall development experience but also accelerates the deployment of innovative decentralized applications on our network. In essence, our TypeScript SDK is a comprehensive solution that makes building and interacting with decentralized applications a breeze. It\u2019s all about making the development process more enjoyable and productive for developers worldwide."}),"\n",(0,i.jsx)(n.h3,{id:"components",children:"Components"}),"\n",(0,i.jsxs)(n.p,{children:["Our TypeScript Client SDK is composed of two main components: ",(0,i.jsx)(n.code,{children:"RpcClient"})," and ",(0,i.jsx)(n.code,{children:"SubscriptionsClient"}),". Each of these components has an interface and a class that implements the interface. The ",(0,i.jsx)(n.code,{children:"RpcClient"})," interface is implemented by the ",(0,i.jsx)(n.code,{children:"JsonRpcClient"})," class, and the ",(0,i.jsx)(n.code,{children:"SubscriptionsClient"})," interface is implemented by the ",(0,i.jsx)(n.code,{children:"WsSubscriptionsClient"})," class."]}),"\n",(0,i.jsx)(n.p,{children:"These components are designed with flexibility and future growth in mind. While currently there is only one implementation of each interface, we anticipate multiple implementations in the future. This is because our server will have multiple implementations of both the Rpc server and the Subscriptions server. This design allows us to easily add new classes that implement these interfaces as our server capabilities expand."}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"RpcClient"})," and ",(0,i.jsx)(n.code,{children:"SubscriptionsClient"})," interfaces define a standard set of methods that all implementations must provide. This ensures consistency across different implementations, making it easier for developers to switch between different Rpc and Subscriptions servers as needed."]}),"\n",(0,i.jsx)(n.p,{children:"By designing our SDK in this way, we ensure that it remains flexible, scalable, and easy to use, regardless of how our server implementations evolve in the future."}),"\n",(0,i.jsx)(n.h4,{id:"rpcclient-interface",children:"RpcClient interface"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-typescript",children:"export interface RpcClient {\n query(\n params: RpcQueryParams,\n config?: RequestConfig\n ): Promise>;\n mutate(\n params: RpcMutateParams,\n config?: RequestConfig\n ): Promise>;\n}\n\nexport interface RequestConfig {\n timeout?: number;\n}\n\nexport interface RpcQueryParams {\n applicationId: ApplicationId;\n method: string;\n argsJson: Args;\n}\n\nexport interface RpcQueryResponse {\n output?: Output;\n}\n\nexport interface RpcMutateParams {\n applicationId: ApplicationId;\n method: string;\n argsJson: Args;\n}\n\nexport interface RpcMutateResponse {\n output?: Output;\n}\n"})}),"\n",(0,i.jsx)(n.h4,{id:"subscriptionsclient",children:"SubscriptionsClient"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-typescript",children:'export interface SubscriptionsClient {\n connect(connectionId?: string): void;\n disconnect(connectionId?: string): void;\n subscribe(applicationIds: string[], connectionId?: string): void;\n unsubscribe(applicationIds: string[], connectionId?: string): void;\n addCallback(\n callback: (event: NodeEvent) => void,\n connectionId?: string\n ): void;\n removeCallback(\n callback: (event: NodeEvent) => void,\n connectionId?: string\n ): void;\n}\n\nexport type NodeEvent = ApplicationEvent;\n\nexport interface ApplicationEvent {\n application_id: ApplicationId;\n type: "TransactionExecuted" | "PeerJoined";\n data: TransactionExecuted | PeerJoined;\n}\n\nexport interface TransactionExecuted {\n hash: string;\n}\n\nexport interface PeerJoined {\n peerId: string;\n}\n'})}),"\n",(0,i.jsx)(n.h3,{id:"examples",children:"Examples"}),"\n",(0,i.jsx)(n.h4,{id:"jsonrpcclient",children:"JsonRpcClient"}),"\n",(0,i.jsx)(n.p,{children:"Here's an example of how to use it:"}),"\n",(0,i.jsx)(n.p,{children:"Define application endpoint and application id.\nYou can find application id in the Admin Dashboard -> Contexts -> select application id from the context where your app logic is installed"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:'NEXT_PUBLIC_API_URL=http://localhost:{NODE_PORT}\nNEXT_PUBLIC_APPLICATION_ID="my-application-id"\n'})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-typescript",children:'// Import the necessary classes and interfaces from the SDK\nimport {\n RpcClient,\n JsonRpcClient,\n RpcMutateParams,\n RpcMutateResponse,\n} from "@calimero-is-near/calimero-p2p-sdk";\n\n// Define the Args and Output interfaces\ninterface CreatePost {\n title: string;\n text: string;\n}\n\ninterface Post {\n id: string;\n title: string;\n text: string;\n}\n\n// Create an instance of JsonRpcClient\nconst rpcClient: RpcClient = new JsonRpcClient(\n process.env["NEXT_PUBLIC_API_URL],\n "/jsonrpc"\n);\n\n// Define the parameters for the mutate\nconst params: RpcMutateParams = {\n applicationId: process.env["NEXT_PUBLIC_APPLICATION_ID"],\n method: "create_post",\n argsJson: {\n title: "My First Post",\n text: "This is my first post using the TypeScript Client SDK",\n },\n};\n\n// Use the mutate method\nconst respone: RpcMutateResponse = await rpcClient.mutate<\nCreatePost,\nPost\n\n> (params);\n\nconsole.log(response);\n\n'})}),"\n",(0,i.jsx)(n.h4,{id:"wssubscriptionsclient",children:"WsSubscriptionsClient"}),"\n",(0,i.jsx)(n.p,{children:"Here's an example of how to use it:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-typescript",children:'// Import the necessary classes and interfaces from the SDK\nimport {\n SubscriptionsClient,\n WsSubscriptionsClient,\n NodeEvent,\n} from "@calimero-is-near/calimero-p2p-sdk";\n\n// Create an instance of WsSubscriptionsClient\nconst subscriptionsClient: SubscriptionsClient = new WsSubscriptionsClient(\n process.env["NEXT_PUBLIC_API_URL],\n "/ws"\n);\n\n// Create (default) connection to the server\nawait subscriptionsClient.connect();\n\n// Subscribe to an application events\nsubscriptionsClient.subscribe([process.env["NEXT_PUBLIC_APPLICATION_ID"]]);\n\n// Add a callback to process messages\nsubscriptionsClient.addCallback((data: NodeEvent) => {\n console.log(data);\n});\n'})})]})}function d(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(p,{...e})}):p(e)}},5710:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>c});var i=t(758);const s={},r=i.createContext(s);function o(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[965],{4735:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>o,default:()=>d,frontMatter:()=>r,metadata:()=>c,toc:()=>l});var i=t(6070),s=t(5710);const r={id:"client-ts-sdk",title:"TypeScript Client SDK"},o=void 0,c={id:"build/client-sdks/client-ts-sdk",title:"TypeScript Client SDK",description:"Getting Started with Calimero SDK for Typescript",source:"@site/docs/03-build/02-client-sdks/02-client-ts-sdk.mdx",sourceDirName:"03-build/02-client-sdks",slug:"/build/client-sdks/client-ts-sdk",permalink:"/build/client-sdks/client-ts-sdk",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718723446e3,sidebarPosition:2,frontMatter:{id:"client-ts-sdk",title:"TypeScript Client SDK"},sidebar:"tutorialSidebar",previous:{title:"Rust Protocol SDK",permalink:"/build/protocol-sdks/protocol-rs-sdk"},next:{title:"Publish App",permalink:"/build/publish-app"}},a={},l=[{value:"Getting Started with Calimero SDK for Typescript",id:"getting-started-with-calimero-sdk-for-typescript",level:2},{value:"Components",id:"components",level:3},{value:"RpcClient interface",id:"rpcclient-interface",level:4},{value:"SubscriptionsClient",id:"subscriptionsclient",level:4},{value:"Examples",id:"examples",level:3},{value:"JsonRpcClient",id:"jsonrpcclient",level:4},{value:"WsSubscriptionsClient",id:"wssubscriptionsclient",level:4}];function p(e){const n={code:"code",h2:"h2",h3:"h3",h4:"h4",p:"p",pre:"pre",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.h2,{id:"getting-started-with-calimero-sdk-for-typescript",children:"Getting Started with Calimero SDK for Typescript"}),"\n",(0,i.jsx)(n.p,{children:"Our TypeScript Client SDK is a powerful tool designed to simplify the process of interacting with decentralized peer-to-peer applications installed on the node. It serves as an efficient conduit for communication between the client and the node\u2019s server. This SDK is particularly beneficial for developers as it abstracts the complexities of server communication, allowing them to concentrate on the core application logic."}),"\n",(0,i.jsx)(n.p,{children:"The SDK is built with the modern features of TypeScript, a language that is gaining popularity for its static typing and advanced capabilities. By using our SDK, developers can write applications in TypeScript, and the SDK takes care of the rest. It handles all the interactions with the server, making the development process more streamlined and efficient."}),"\n",(0,i.jsx)(n.p,{children:"This not only enhances the overall development experience but also accelerates the deployment of innovative decentralized applications on our network. In essence, our TypeScript SDK is a comprehensive solution that makes building and interacting with decentralized applications a breeze. It\u2019s all about making the development process more enjoyable and productive for developers worldwide."}),"\n",(0,i.jsx)(n.h3,{id:"components",children:"Components"}),"\n",(0,i.jsxs)(n.p,{children:["Our TypeScript Client SDK is composed of two main components: ",(0,i.jsx)(n.code,{children:"RpcClient"})," and ",(0,i.jsx)(n.code,{children:"SubscriptionsClient"}),". Each of these components has an interface and a class that implements the interface. The ",(0,i.jsx)(n.code,{children:"RpcClient"})," interface is implemented by the ",(0,i.jsx)(n.code,{children:"JsonRpcClient"})," class, and the ",(0,i.jsx)(n.code,{children:"SubscriptionsClient"})," interface is implemented by the ",(0,i.jsx)(n.code,{children:"WsSubscriptionsClient"})," class."]}),"\n",(0,i.jsx)(n.p,{children:"These components are designed with flexibility and future growth in mind. While currently there is only one implementation of each interface, we anticipate multiple implementations in the future. This is because our server will have multiple implementations of both the Rpc server and the Subscriptions server. This design allows us to easily add new classes that implement these interfaces as our server capabilities expand."}),"\n",(0,i.jsxs)(n.p,{children:["The ",(0,i.jsx)(n.code,{children:"RpcClient"})," and ",(0,i.jsx)(n.code,{children:"SubscriptionsClient"})," interfaces define a standard set of methods that all implementations must provide. This ensures consistency across different implementations, making it easier for developers to switch between different Rpc and Subscriptions servers as needed."]}),"\n",(0,i.jsx)(n.p,{children:"By designing our SDK in this way, we ensure that it remains flexible, scalable, and easy to use, regardless of how our server implementations evolve in the future."}),"\n",(0,i.jsx)(n.h4,{id:"rpcclient-interface",children:"RpcClient interface"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-typescript",children:"export interface RpcClient {\n query(\n params: RpcQueryParams,\n config?: RequestConfig\n ): Promise>;\n mutate(\n params: RpcMutateParams,\n config?: RequestConfig\n ): Promise>;\n}\n\nexport interface RequestConfig {\n timeout?: number;\n}\n\nexport interface RpcQueryParams {\n applicationId: ApplicationId;\n method: string;\n argsJson: Args;\n}\n\nexport interface RpcQueryResponse {\n output?: Output;\n}\n\nexport interface RpcMutateParams {\n applicationId: ApplicationId;\n method: string;\n argsJson: Args;\n}\n\nexport interface RpcMutateResponse {\n output?: Output;\n}\n"})}),"\n",(0,i.jsx)(n.h4,{id:"subscriptionsclient",children:"SubscriptionsClient"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-typescript",children:'export interface SubscriptionsClient {\n connect(connectionId?: string): void;\n disconnect(connectionId?: string): void;\n subscribe(applicationIds: string[], connectionId?: string): void;\n unsubscribe(applicationIds: string[], connectionId?: string): void;\n addCallback(\n callback: (event: NodeEvent) => void,\n connectionId?: string\n ): void;\n removeCallback(\n callback: (event: NodeEvent) => void,\n connectionId?: string\n ): void;\n}\n\nexport type NodeEvent = ApplicationEvent;\n\nexport interface ApplicationEvent {\n application_id: ApplicationId;\n type: "TransactionExecuted" | "PeerJoined";\n data: TransactionExecuted | PeerJoined;\n}\n\nexport interface TransactionExecuted {\n hash: string;\n}\n\nexport interface PeerJoined {\n peerId: string;\n}\n'})}),"\n",(0,i.jsx)(n.h3,{id:"examples",children:"Examples"}),"\n",(0,i.jsx)(n.h4,{id:"jsonrpcclient",children:"JsonRpcClient"}),"\n",(0,i.jsx)(n.p,{children:"Here's an example of how to use it:"}),"\n",(0,i.jsx)(n.p,{children:"Define application endpoint and application id.\nYou can find application id in the Admin Dashboard -> Contexts -> select application id from the context where your app logic is installed"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:'NEXT_PUBLIC_API_URL=http://localhost:{NODE_PORT}\nNEXT_PUBLIC_APPLICATION_ID="my-application-id"\n'})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-typescript",children:'// Import the necessary classes and interfaces from the SDK\nimport {\n RpcClient,\n JsonRpcClient,\n RpcMutateParams,\n RpcMutateResponse,\n} from "@calimero-is-near/calimero-p2p-sdk";\n\n// Define the Args and Output interfaces\ninterface CreatePost {\n title: string;\n text: string;\n}\n\ninterface Post {\n id: string;\n title: string;\n text: string;\n}\n\n// Create an instance of JsonRpcClient\nconst rpcClient: RpcClient = new JsonRpcClient(\n process.env["NEXT_PUBLIC_API_URL],\n "/jsonrpc"\n);\n\n// Define the parameters for the mutate\nconst params: RpcMutateParams = {\n applicationId: process.env["NEXT_PUBLIC_APPLICATION_ID"],\n method: "create_post",\n argsJson: {\n title: "My First Post",\n text: "This is my first post using the TypeScript Client SDK",\n },\n};\n\n// Use the mutate method\nconst respone: RpcMutateResponse = await rpcClient.mutate<\nCreatePost,\nPost\n\n> (params);\n\nconsole.log(response);\n\n'})}),"\n",(0,i.jsx)(n.h4,{id:"wssubscriptionsclient",children:"WsSubscriptionsClient"}),"\n",(0,i.jsx)(n.p,{children:"Here's an example of how to use it:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-typescript",children:'// Import the necessary classes and interfaces from the SDK\nimport {\n SubscriptionsClient,\n WsSubscriptionsClient,\n NodeEvent,\n} from "@calimero-is-near/calimero-p2p-sdk";\n\n// Create an instance of WsSubscriptionsClient\nconst subscriptionsClient: SubscriptionsClient = new WsSubscriptionsClient(\n process.env["NEXT_PUBLIC_API_URL],\n "/ws"\n);\n\n// Create (default) connection to the server\nawait subscriptionsClient.connect();\n\n// Subscribe to an application events\nsubscriptionsClient.subscribe([process.env["NEXT_PUBLIC_APPLICATION_ID"]]);\n\n// Add a callback to process messages\nsubscriptionsClient.addCallback((data: NodeEvent) => {\n console.log(data);\n});\n'})})]})}function d(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(p,{...e})}):p(e)}},5710:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>c});var i=t(758);const s={},r=i.createContext(s);function o(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d94758ba.2e77b8af.js b/assets/js/d94758ba.344d58d1.js similarity index 97% rename from assets/js/d94758ba.2e77b8af.js rename to assets/js/d94758ba.344d58d1.js index 10fb7d74..56951d99 100644 --- a/assets/js/d94758ba.2e77b8af.js +++ b/assets/js/d94758ba.344d58d1.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[21],{8238:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>r,contentTitle:()=>n,default:()=>p,frontMatter:()=>o,metadata:()=>c,toc:()=>l});var a=s(6070),i=s(5710);const o={id:"decentralized-social-platforms",title:"Decentralized Social Platforms"},n=void 0,c={id:"explore/use-cases/decentralized-social-platforms",title:"Decentralized Social Platforms",description:"Build social experiences which need scalable but private data like social groups, direct messages and others, while eliminating high transaction costs (gas fees associated with blockchains). This can include exclusive groups and gated communities based on ownership of NFTs or token payments which would allow participation and decryption of the community data content.",source:"@site/docs/01-explore/05-use-cases/02-decentralized-social-platforms.mdx",sourceDirName:"01-explore/05-use-cases",slug:"/explore/use-cases/decentralized-social-platforms",permalink:"/explore/use-cases/decentralized-social-platforms",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718634626e3,sidebarPosition:2,frontMatter:{id:"decentralized-social-platforms",title:"Decentralized Social Platforms"},sidebar:"tutorialSidebar",previous:{title:"Decentralized Voting Systems",permalink:"/explore/use-cases/decentralized-voting-systems"},next:{title:"Decentralized Productivity (DeProd) SaaS",permalink:"/explore/use-cases/deprod"}},r={},l=[];function d(e){const t={p:"p",...(0,i.R)(),...e.components};return(0,a.jsx)(t.p,{children:"Build social experiences which need scalable but private data like social groups, direct messages and others, while eliminating high transaction costs (gas fees associated with blockchains). This can include exclusive groups and gated communities based on ownership of NFTs or token payments which would allow participation and decryption of the community data content."})}function p(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},5710:(e,t,s)=>{s.d(t,{R:()=>n,x:()=>c});var a=s(758);const i={},o=a.createContext(i);function n(e){const t=a.useContext(o);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:n(e.components),a.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[21],{8238:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>r,contentTitle:()=>n,default:()=>p,frontMatter:()=>o,metadata:()=>c,toc:()=>l});var a=s(6070),i=s(5710);const o={id:"decentralized-social-platforms",title:"Decentralized Social Platforms"},n=void 0,c={id:"explore/use-cases/decentralized-social-platforms",title:"Decentralized Social Platforms",description:"Build social experiences which need scalable but private data like social groups, direct messages and others, while eliminating high transaction costs (gas fees associated with blockchains). This can include exclusive groups and gated communities based on ownership of NFTs or token payments which would allow participation and decryption of the community data content.",source:"@site/docs/01-explore/05-use-cases/02-decentralized-social-platforms.mdx",sourceDirName:"01-explore/05-use-cases",slug:"/explore/use-cases/decentralized-social-platforms",permalink:"/explore/use-cases/decentralized-social-platforms",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718723446e3,sidebarPosition:2,frontMatter:{id:"decentralized-social-platforms",title:"Decentralized Social Platforms"},sidebar:"tutorialSidebar",previous:{title:"Decentralized Voting Systems",permalink:"/explore/use-cases/decentralized-voting-systems"},next:{title:"Decentralized Productivity (DeProd) SaaS",permalink:"/explore/use-cases/deprod"}},r={},l=[];function d(e){const t={p:"p",...(0,i.R)(),...e.components};return(0,a.jsx)(t.p,{children:"Build social experiences which need scalable but private data like social groups, direct messages and others, while eliminating high transaction costs (gas fees associated with blockchains). This can include exclusive groups and gated communities based on ownership of NFTs or token payments which would allow participation and decryption of the community data content."})}function p(e={}){const{wrapper:t}={...(0,i.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(d,{...e})}):d(e)}},5710:(e,t,s)=>{s.d(t,{R:()=>n,x:()=>c});var a=s(758);const i={},o=a.createContext(i);function n(e){const t=a.useContext(o);return a.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:n(e.components),a.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e6fe25da.2bb61cea.js b/assets/js/e6fe25da.ad5b6119.js similarity index 98% rename from assets/js/e6fe25da.2bb61cea.js rename to assets/js/e6fe25da.ad5b6119.js index 5ca8d886..27c0264c 100644 --- a/assets/js/e6fe25da.2bb61cea.js +++ b/assets/js/e6fe25da.ad5b6119.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[9667],{9601:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>p,frontMatter:()=>o,metadata:()=>s,toc:()=>l});var r=t(6070),i=t(5710);const o={id:"server",title:"Server"},a=void 0,s={id:"learn/core-concepts/node/server",title:"Server",description:"The server is a core component for interacting with a Calimero node. Calimero can be embedded with your client to make it a self-contained node, or it can run as a remote node that multiple clients can connect to, allowing centralized state management.",source:"@site/docs/02-learn/03-core-concepts/02-node/03-server.mdx",sourceDirName:"02-learn/03-core-concepts/02-node",slug:"/learn/core-concepts/node/server",permalink:"/learn/core-concepts/node/server",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718634626e3,sidebarPosition:3,frontMatter:{id:"server",title:"Server"},sidebar:"tutorialSidebar",previous:{title:"Runtime",permalink:"/learn/core-concepts/node/runtime"},next:{title:"Storage",permalink:"/learn/core-concepts/node/storage"}},c={},l=[{value:"Core Capabilities",id:"core-capabilities",level:3}];function d(e){const n={h3:"h3",li:"li",p:"p",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.p,{children:"The server is a core component for interacting with a Calimero node. Calimero can be embedded with your client to make it a self-contained node, or it can run as a remote node that multiple clients can connect to, allowing centralized state management."}),"\n",(0,r.jsx)(n.h3,{id:"core-capabilities",children:"Core Capabilities"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"JSON-RPC API"}),": Provides a standardized way for clients to query or mutate the state of their counterpart applications on the node, ensuring seamless integration and communication."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"WebSocket Interface"}),": Allows clients to subscribe to events emitted from applications, enabling real-time reactions to activity triggered by other peers in the network."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Admin API"}),": Manages various aspects of the node, including:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Context Administration"}),": Create, delete, invite others to contexts, and accept invitations."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Storage Management"}),": Track usage, view raw state storage for each context, and view encrypted blobs."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"State Management"}),": Manually garbage collect state-transitional transactions."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Network Management"}),": Manually connect to peers and manage blocklists."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Application Management"}),": Manage installed applications, create contexts from applications, delete applications if no contexts are associated, and manually sideload applications."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Peer Identity Management"}),": Rotate peer identities without affecting context identities."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Node Metrics"}),": Track network bandwidth usage, both total and by context, to manage resource usage effectively."]}),"\n"]}),"\n"]}),"\n"]})]})}function p(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},5710:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>s});var r=t(758);const i={},o=r.createContext(i);function a(e){const n=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[9667],{9601:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>p,frontMatter:()=>o,metadata:()=>s,toc:()=>l});var r=t(6070),i=t(5710);const o={id:"server",title:"Server"},a=void 0,s={id:"learn/core-concepts/node/server",title:"Server",description:"The server is a core component for interacting with a Calimero node. Calimero can be embedded with your client to make it a self-contained node, or it can run as a remote node that multiple clients can connect to, allowing centralized state management.",source:"@site/docs/02-learn/03-core-concepts/02-node/03-server.mdx",sourceDirName:"02-learn/03-core-concepts/02-node",slug:"/learn/core-concepts/node/server",permalink:"/learn/core-concepts/node/server",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718723446e3,sidebarPosition:3,frontMatter:{id:"server",title:"Server"},sidebar:"tutorialSidebar",previous:{title:"Runtime",permalink:"/learn/core-concepts/node/runtime"},next:{title:"Storage",permalink:"/learn/core-concepts/node/storage"}},c={},l=[{value:"Core Capabilities",id:"core-capabilities",level:3}];function d(e){const n={h3:"h3",li:"li",p:"p",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.p,{children:"The server is a core component for interacting with a Calimero node. Calimero can be embedded with your client to make it a self-contained node, or it can run as a remote node that multiple clients can connect to, allowing centralized state management."}),"\n",(0,r.jsx)(n.h3,{id:"core-capabilities",children:"Core Capabilities"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"JSON-RPC API"}),": Provides a standardized way for clients to query or mutate the state of their counterpart applications on the node, ensuring seamless integration and communication."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"WebSocket Interface"}),": Allows clients to subscribe to events emitted from applications, enabling real-time reactions to activity triggered by other peers in the network."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Admin API"}),": Manages various aspects of the node, including:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Context Administration"}),": Create, delete, invite others to contexts, and accept invitations."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Storage Management"}),": Track usage, view raw state storage for each context, and view encrypted blobs."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"State Management"}),": Manually garbage collect state-transitional transactions."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Network Management"}),": Manually connect to peers and manage blocklists."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Application Management"}),": Manage installed applications, create contexts from applications, delete applications if no contexts are associated, and manually sideload applications."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Peer Identity Management"}),": Rotate peer identities without affecting context identities."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Node Metrics"}),": Track network bandwidth usage, both total and by context, to manage resource usage effectively."]}),"\n"]}),"\n"]}),"\n"]})]})}function p(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},5710:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>s});var r=t(758);const i={},o=r.createContext(i);function a(e){const n=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f4e7e388.627c0fc3.js b/assets/js/f4e7e388.222f2f72.js similarity index 98% rename from assets/js/f4e7e388.627c0fc3.js rename to assets/js/f4e7e388.222f2f72.js index 8a8cb582..3c91e65e 100644 --- a/assets/js/f4e7e388.627c0fc3.js +++ b/assets/js/f4e7e388.222f2f72.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[1249],{6190:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>p,frontMatter:()=>a,metadata:()=>s,toc:()=>l});var n=i(6070),r=i(5710);const a={id:"architecture",title:"Architecture"},o=void 0,s={id:"learn/architecture",title:"Architecture",description:"Calimero Network offers a robust framework for developing and running peer-to-peer (P2P) applications. Our framework allows users to participate in the network or build applications for others to use.",source:"@site/docs/02-learn/02-architecture.mdx",sourceDirName:"02-learn",slug:"/learn/architecture",permalink:"/learn/architecture",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718634626e3,sidebarPosition:2,frontMatter:{id:"architecture",title:"Architecture"},sidebar:"tutorialSidebar",previous:{title:"Terminology",permalink:"/learn/terminology"},next:{title:"Identity",permalink:"/learn/core-concepts/identity"}},c={},l=[{value:"Participate",id:"participate",level:2},{value:"Build",id:"build",level:2}];function d(e){const t={h2:"h2",img:"img",li:"li",p:"p",ul:"ul",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.p,{children:"Calimero Network offers a robust framework for developing and running peer-to-peer (P2P) applications. Our framework allows users to participate in the network or build applications for others to use."}),"\n",(0,n.jsx)(t.h2,{id:"participate",children:"Participate"}),"\n",(0,n.jsx)(t.p,{children:"Users participate in the network with a client node. By encapsulating the complexities of operating a client node, we aim to make it easy and intuitive for everyone to engage in the decentralized world."}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"Client node acts as a gateway that runs applications and connects with other peers"}),"\n",(0,n.jsx)(t.li,{children:"Each application is loaded and isolated from other applications into a separate context. This ensures that each application runs independently while still allowing interactions through shared states or messages."}),"\n",(0,n.jsx)(t.li,{children:"Context consolidates all necessary components into a secure, isolated environment."}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"Some networks may require specialized functionalities, which are provided by a dedicated compute market. Users can integrate these special functionalities from a pool of available specialized nodes."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Calimero Architecture",src:i(6645).A+"",width:"1920",height:"1080"})}),"\n",(0,n.jsx)(t.h2,{id:"build",children:"Build"}),"\n",(0,n.jsx)(t.p,{children:"To develop applications on the Calimero Network, we provide comprehensive SDKs:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"Protocol SDK to define how the application should behave and communicate with the node."}),"\n",(0,n.jsx)(t.li,{children:"Client SDK to connect to node and use data in user interface and authenticate using wallets UI."}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"Developer applications are shared through application registry where developers upload their applications and share it with other users"}),"\n",(0,n.jsx)(t.p,{children:"Explore other sections to learn more about each component, and how they contribute to a seamless decentralized experience."})]})}function p(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},6645:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/architecture-88be4e09ef7ca7e8a3bf6b5a69783f03.png"},5710:(e,t,i)=>{i.d(t,{R:()=>o,x:()=>s});var n=i(758);const r={},a=n.createContext(r);function o(e){const t=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),n.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[1249],{6190:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>o,default:()=>p,frontMatter:()=>a,metadata:()=>s,toc:()=>l});var n=i(6070),r=i(5710);const a={id:"architecture",title:"Architecture"},o=void 0,s={id:"learn/architecture",title:"Architecture",description:"Calimero Network offers a robust framework for developing and running peer-to-peer (P2P) applications. Our framework allows users to participate in the network or build applications for others to use.",source:"@site/docs/02-learn/02-architecture.mdx",sourceDirName:"02-learn",slug:"/learn/architecture",permalink:"/learn/architecture",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718723446e3,sidebarPosition:2,frontMatter:{id:"architecture",title:"Architecture"},sidebar:"tutorialSidebar",previous:{title:"Terminology",permalink:"/learn/terminology"},next:{title:"Identity",permalink:"/learn/core-concepts/identity"}},c={},l=[{value:"Participate",id:"participate",level:2},{value:"Build",id:"build",level:2}];function d(e){const t={h2:"h2",img:"img",li:"li",p:"p",ul:"ul",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.p,{children:"Calimero Network offers a robust framework for developing and running peer-to-peer (P2P) applications. Our framework allows users to participate in the network or build applications for others to use."}),"\n",(0,n.jsx)(t.h2,{id:"participate",children:"Participate"}),"\n",(0,n.jsx)(t.p,{children:"Users participate in the network with a client node. By encapsulating the complexities of operating a client node, we aim to make it easy and intuitive for everyone to engage in the decentralized world."}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"Client node acts as a gateway that runs applications and connects with other peers"}),"\n",(0,n.jsx)(t.li,{children:"Each application is loaded and isolated from other applications into a separate context. This ensures that each application runs independently while still allowing interactions through shared states or messages."}),"\n",(0,n.jsx)(t.li,{children:"Context consolidates all necessary components into a secure, isolated environment."}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"Some networks may require specialized functionalities, which are provided by a dedicated compute market. Users can integrate these special functionalities from a pool of available specialized nodes."}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"Calimero Architecture",src:i(6645).A+"",width:"1920",height:"1080"})}),"\n",(0,n.jsx)(t.h2,{id:"build",children:"Build"}),"\n",(0,n.jsx)(t.p,{children:"To develop applications on the Calimero Network, we provide comprehensive SDKs:"}),"\n",(0,n.jsxs)(t.ul,{children:["\n",(0,n.jsx)(t.li,{children:"Protocol SDK to define how the application should behave and communicate with the node."}),"\n",(0,n.jsx)(t.li,{children:"Client SDK to connect to node and use data in user interface and authenticate using wallets UI."}),"\n"]}),"\n",(0,n.jsx)(t.p,{children:"Developer applications are shared through application registry where developers upload their applications and share it with other users"}),"\n",(0,n.jsx)(t.p,{children:"Explore other sections to learn more about each component, and how they contribute to a seamless decentralized experience."})]})}function p(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(d,{...e})}):d(e)}},6645:(e,t,i)=>{i.d(t,{A:()=>n});const n=i.p+"assets/images/architecture-88be4e09ef7ca7e8a3bf6b5a69783f03.png"},5710:(e,t,i)=>{i.d(t,{R:()=>o,x:()=>s});var n=i(758);const r={},a=n.createContext(r);function o(e){const t=n.useContext(a);return n.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),n.createElement(a.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f582a9aa.1ff0c6e1.js b/assets/js/f582a9aa.31317538.js similarity index 97% rename from assets/js/f582a9aa.1ff0c6e1.js rename to assets/js/f582a9aa.31317538.js index f65f87ba..6eb688d4 100644 --- a/assets/js/f582a9aa.1ff0c6e1.js +++ b/assets/js/f582a9aa.31317538.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2226],{4446:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>a,toc:()=>l});var i=t(6070),s=t(5710);const o={id:"contexts",title:"Contexts"},r=void 0,a={id:"learn/core-concepts/contexts",title:"Contexts",description:"Contexts are the core of the Calimero ecosystem. These are application specific networks designed to enable direct communication between users, eliminating the need for intermediaries. Here's a closer look at how they operate:",source:"@site/docs/02-learn/03-core-concepts/04-context.mdx",sourceDirName:"02-learn/03-core-concepts",slug:"/learn/core-concepts/contexts",permalink:"/learn/core-concepts/contexts",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718634626e3,sidebarPosition:4,frontMatter:{id:"contexts",title:"Contexts"},sidebar:"tutorialSidebar",previous:{title:"Applications",permalink:"/learn/core-concepts/applications"},next:{title:"Specialized Nodes",permalink:"/learn/advanced-concepts/specialized-nodes"}},c={},l=[{value:"How Contexts Work:",id:"how-contexts-work",level:4}];function d(e){const n={h4:"h4",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.p,{children:"Contexts are the core of the Calimero ecosystem. These are application specific networks designed to enable direct communication between users, eliminating the need for intermediaries. Here's a closer look at how they operate:"}),"\n",(0,i.jsx)(n.h4,{id:"how-contexts-work",children:(0,i.jsx)(n.strong,{children:"How Contexts Work:"})}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Initialization"}),": A user selects a WebAssembly (WASM) module from a repository, which contains the logic and rules for the application. With this, they initiate a new Application Network, creating a unique identity for this specific network and setting the initial parameters and update strategies."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Joining the Network"}),":"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Inviting Peers"}),": The initial user can invite others directly or set up Access Control Lists (ACLs) to govern how new members can join the network."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"New Member Process"}),": When a new user joins, they generate a unique identity for the network, download the relevant WASM module, and synchronize with the existing data on the network. This process ensures they're up to speed and ready to engage fully with the network's activities."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Data Interaction"}),": Within the network, users can query and modify data according to the application's rules. Each Application Network autonomously manages data interactions, ensuring consistency and integrity."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Security and Privacy"}),": All communications within an Application Network are secured with end-to-end encryption, utilizing the Double Ratchet Algorithm. This ensures that data exchanged between peers remains private and secure."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Offline Capability and Consistency"}),": Calimero's design is 'offline-first,' accommodating the reality that peers may not always be online. When a peer goes offline and later returns, they synchronize with the network to update and reconcile any changes, maintaining eventual consistency across the network's state."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Governance and Updates"}),": Application Networks can be governed by the users themselves, with decisions made through a consensus mechanism. Updates to the network, including changes to the WASM module or network parameters, can be proposed and voted on by the network's members."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Extending network capabilities"}),": In addition to the core components of Application Networks, Calimero introduces Specialized Nodes to further enhance network capabilities. These nodes are designed to perform specific functions that go beyond the standard operations of client nodes, such as heavy data processing, advanced encryption tasks, or providing additional storage solutions. They play a crucial role in scaling the network's functionality and performance, ensuring that even as demand grows, the network remains efficient and responsive. Specialized Nodes can be deployed by any participant in the network, including Calimero, third-party developers, or users themselves, offering a flexible and decentralized approach to augmenting the network's capabilities. By leveraging these nodes, Application Networks can meet the diverse needs of different applications, ensuring that each network can be customized and optimized for its unique requirements, all while maintaining the overarching principles of privacy, security, and decentralization inherent to Calimero."]}),"\n"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},5710:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>a});var i=t(758);const s={},o=i.createContext(s);function r(e){const n=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[2226],{2065:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>a,toc:()=>l});var i=t(6070),s=t(5710);const o={id:"contexts",title:"Contexts"},r=void 0,a={id:"learn/core-concepts/contexts",title:"Contexts",description:"Contexts are the core of the Calimero ecosystem. These are application specific networks designed to enable direct communication between users, eliminating the need for intermediaries. Here's a closer look at how they operate:",source:"@site/docs/02-learn/03-core-concepts/04-context.mdx",sourceDirName:"02-learn/03-core-concepts",slug:"/learn/core-concepts/contexts",permalink:"/learn/core-concepts/contexts",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718723446e3,sidebarPosition:4,frontMatter:{id:"contexts",title:"Contexts"},sidebar:"tutorialSidebar",previous:{title:"Applications",permalink:"/learn/core-concepts/applications"},next:{title:"Specialized Nodes",permalink:"/learn/advanced-concepts/specialized-nodes"}},c={},l=[{value:"How Contexts Work:",id:"how-contexts-work",level:4}];function d(e){const n={h4:"h4",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.p,{children:"Contexts are the core of the Calimero ecosystem. These are application specific networks designed to enable direct communication between users, eliminating the need for intermediaries. Here's a closer look at how they operate:"}),"\n",(0,i.jsx)(n.h4,{id:"how-contexts-work",children:(0,i.jsx)(n.strong,{children:"How Contexts Work:"})}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Initialization"}),": A user selects a WebAssembly (WASM) module from a repository, which contains the logic and rules for the application. With this, they initiate a new Application Network, creating a unique identity for this specific network and setting the initial parameters and update strategies."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Joining the Network"}),":"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Inviting Peers"}),": The initial user can invite others directly or set up Access Control Lists (ACLs) to govern how new members can join the network."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"New Member Process"}),": When a new user joins, they generate a unique identity for the network, download the relevant WASM module, and synchronize with the existing data on the network. This process ensures they're up to speed and ready to engage fully with the network's activities."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Data Interaction"}),": Within the network, users can query and modify data according to the application's rules. Each Application Network autonomously manages data interactions, ensuring consistency and integrity."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Security and Privacy"}),": All communications within an Application Network are secured with end-to-end encryption, utilizing the Double Ratchet Algorithm. This ensures that data exchanged between peers remains private and secure."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Offline Capability and Consistency"}),": Calimero's design is 'offline-first,' accommodating the reality that peers may not always be online. When a peer goes offline and later returns, they synchronize with the network to update and reconcile any changes, maintaining eventual consistency across the network's state."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Governance and Updates"}),": Application Networks can be governed by the users themselves, with decisions made through a consensus mechanism. Updates to the network, including changes to the WASM module or network parameters, can be proposed and voted on by the network's members."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Extending network capabilities"}),": In addition to the core components of Application Networks, Calimero introduces Specialized Nodes to further enhance network capabilities. These nodes are designed to perform specific functions that go beyond the standard operations of client nodes, such as heavy data processing, advanced encryption tasks, or providing additional storage solutions. They play a crucial role in scaling the network's functionality and performance, ensuring that even as demand grows, the network remains efficient and responsive. Specialized Nodes can be deployed by any participant in the network, including Calimero, third-party developers, or users themselves, offering a flexible and decentralized approach to augmenting the network's capabilities. By leveraging these nodes, Application Networks can meet the diverse needs of different applications, ensuring that each network can be customized and optimized for its unique requirements, all while maintaining the overarching principles of privacy, security, and decentralization inherent to Calimero."]}),"\n"]}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},5710:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>a});var i=t(758);const s={},o=i.createContext(s);function r(e){const n=i.useContext(o);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),i.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/fdb23cd9.d639e92a.js b/assets/js/fdb23cd9.d5657c7b.js similarity index 96% rename from assets/js/fdb23cd9.d639e92a.js rename to assets/js/fdb23cd9.d5657c7b.js index d25e693b..8e79d7b1 100644 --- a/assets/js/fdb23cd9.d639e92a.js +++ b/assets/js/fdb23cd9.d5657c7b.js @@ -1 +1 @@ -"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[546],{1748:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>p,frontMatter:()=>i,metadata:()=>s,toc:()=>l});var o=r(6070),n=r(5710);const i={id:"decentralized-gig-economy",title:"Decentralized Gig Economy"},a=void 0,s={id:"explore/use-cases/decentralized-gig-economy",title:"Decentralized Gig Economy",description:"Disrupt the current gig economy players and compose a fully decentralized ride sharing, freelancing, temporary work, mechanical turk platform, or any other shared economy model where each network participant gets their fair share of the profits.",source:"@site/docs/01-explore/05-use-cases/04-decentralized-gig-economy.mdx",sourceDirName:"01-explore/05-use-cases",slug:"/explore/use-cases/decentralized-gig-economy",permalink:"/explore/use-cases/decentralized-gig-economy",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718634626e3,sidebarPosition:4,frontMatter:{id:"decentralized-gig-economy",title:"Decentralized Gig Economy"},sidebar:"tutorialSidebar",previous:{title:"Decentralized Productivity (DeProd) SaaS",permalink:"/explore/use-cases/deprod"},next:{title:"Trustless Gaming",permalink:"/explore/use-cases/trustless-gaming"}},c={},l=[];function d(e){const t={p:"p",...(0,n.R)(),...e.components};return(0,o.jsx)(t.p,{children:"Disrupt the current gig economy players and compose a fully decentralized ride sharing, freelancing, temporary work, mechanical turk platform, or any other shared economy model where each network participant gets their fair share of the profits."})}function p(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},5710:(e,t,r)=>{r.d(t,{R:()=>a,x:()=>s});var o=r(758);const n={},i=o.createContext(n);function a(e){const t=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),o.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[546],{1748:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>p,frontMatter:()=>i,metadata:()=>s,toc:()=>l});var o=r(6070),n=r(5710);const i={id:"decentralized-gig-economy",title:"Decentralized Gig Economy"},a=void 0,s={id:"explore/use-cases/decentralized-gig-economy",title:"Decentralized Gig Economy",description:"Disrupt the current gig economy players and compose a fully decentralized ride sharing, freelancing, temporary work, mechanical turk platform, or any other shared economy model where each network participant gets their fair share of the profits.",source:"@site/docs/01-explore/05-use-cases/04-decentralized-gig-economy.mdx",sourceDirName:"01-explore/05-use-cases",slug:"/explore/use-cases/decentralized-gig-economy",permalink:"/explore/use-cases/decentralized-gig-economy",draft:!1,unlisted:!1,tags:[],version:"current",lastUpdatedAt:1718723446e3,sidebarPosition:4,frontMatter:{id:"decentralized-gig-economy",title:"Decentralized Gig Economy"},sidebar:"tutorialSidebar",previous:{title:"Decentralized Productivity (DeProd) SaaS",permalink:"/explore/use-cases/deprod"},next:{title:"Trustless Gaming",permalink:"/explore/use-cases/trustless-gaming"}},c={},l=[];function d(e){const t={p:"p",...(0,n.R)(),...e.components};return(0,o.jsx)(t.p,{children:"Disrupt the current gig economy players and compose a fully decentralized ride sharing, freelancing, temporary work, mechanical turk platform, or any other shared economy model where each network participant gets their fair share of the profits."})}function p(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},5710:(e,t,r)=>{r.d(t,{R:()=>a,x:()=>s});var o=r(758);const n={},i=o.createContext(n);function a(e){const t=o.useContext(i);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),o.createElement(i.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/main.40576d62.js b/assets/js/main.40aab0cd.js similarity index 94% rename from assets/js/main.40576d62.js rename to assets/js/main.40aab0cd.js index a0f2fb04..329bb8af 100644 --- a/assets/js/main.40576d62.js +++ b/assets/js/main.40aab0cd.js @@ -1,2 +1,2 @@ -/*! For license information please see main.40576d62.js.LICENSE.txt */ -(self.webpackChunkdocs=self.webpackChunkdocs||[]).push([[8792],{8788:(e,t,n)=>{"use strict";n.d(t,{W:()=>a});var r=n(758);function a(){return r.createElement("svg",{width:"20",height:"20",className:"DocSearch-Search-Icon",viewBox:"0 0 20 20","aria-hidden":"true"},r.createElement("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}},1721:(e,t,n)=>{var r={"./prism-bash":8520,"./prism-toml":6290};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=1721},8218:(e,t,n)=>{"use strict";n.d(t,{A:()=>p});n(758);var r=n(2059),a=n.n(r),o=n(4054);const i={"08c23959":[()=>n.e(822).then(n.bind(n,5431)),"@site/docs/03-build/01-protocol-sdks/01-protocol-sdk.mdx",5431],"0b38cd53":[()=>n.e(6673).then(n.bind(n,8171)),"@site/docs/02-learn/04-advanced-concepts/01-specialized-nodes.mdx",8171],13477880:[()=>n.e(105).then(n.bind(n,3130)),"@site/docs/01-explore/06-awesome-projects/01-only-peers.mdx",3130],"150624dd":[()=>n.e(2329).then(n.bind(n,749)),"@site/docs/02-learn/01-terminology.mdx",749],17896441:[()=>Promise.all([n.e(1869),n.e(6785),n.e(8401)]).then(n.bind(n,4034)),"@theme/DocItem",4034],"190ec3a6":[()=>n.e(7707).then(n.bind(n,8202)),"@site/docs/02-learn/03-core-concepts/02-node/admin-api.mdx",8202],"1a4e3797":[()=>Promise.all([n.e(1869),n.e(2138)]).then(n.bind(n,7920)),"@theme/SearchPage",7920],"1df93b7f":[()=>Promise.all([n.e(1869),n.e(4583)]).then(n.bind(n,1938)),"@site/src/pages/index.tsx",1938],"22dd74f7":[()=>n.e(1567).then(n.t.bind(n,5226,19)),"@generated/docusaurus-plugin-content-docs/default/p/index-466.json",5226],"22e91f41":[()=>n.e(317).then(n.bind(n,8799)),"@site/docs/01-explore/06-awesome-projects/02-rock-paper-scissors.mdx",8799],"2b77e7d3":[()=>n.e(2802).then(n.bind(n,8522)),"@site/docs/03-build/01-protocol-sdks/02-protocol-rs-sdk.mdx",8522],"2ccf3cc5":[()=>n.e(9951).then(n.bind(n,7145)),"@site/docs/01-explore/02-developers-quickstart/01-getting-started.mdx",7145],"37e9fbd6":[()=>n.e(2193).then(n.bind(n,3591)),"@site/docs/05-resources/02-learning.mdx",3591],"3e1f1522":[()=>n.e(8044).then(n.bind(n,7828)),"@site/docs/01-explore/02-developers-quickstart/02-admin-dashboard.mdx",7828],"42b3b6e0":[()=>n.e(6391).then(n.bind(n,9442)),"@site/docs/01-explore/01-intro.mdx",9442],"47adee10":[()=>n.e(2806).then(n.bind(n,3015)),"@site/docs/05-resources/01-community-and-support.mdx",3015],"514a65da":[()=>n.e(3182).then(n.bind(n,9830)),"@site/docs/02-learn/03-core-concepts/02-node/04-storage.mdx",9830],"5af830f1":[()=>n.e(1337).then(n.bind(n,5455)),"@site/docs/01-explore/04-why-not/02-ipfs.mdx",5455],"5b892390":[()=>n.e(8725).then(n.bind(n,5635)),"@site/docs/02-learn/03-core-concepts/02-node/02-runtime.mdx",5635],"5bb4bac1":[()=>n.e(3331).then(n.bind(n,2374)),"@site/docs/04-contribute/01-github.mdx",2374],"5e95c892":[()=>n.e(9647).then(n.bind(n,2416)),"@theme/DocsRoot",2416],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,4784)),"@generated/docusaurus.config",4784],"64bee9bd":[()=>n.e(2074).then(n.bind(n,9864)),"@site/docs/02-learn/04-advanced-concepts/02-encryption.mdx",9864],"66902dc0":[()=>n.e(4811).then(n.bind(n,3259)),"@site/docs/04-contribute/03-bounty-program.mdx",3259],"73ad1aec":[()=>n.e(7420).then(n.bind(n,2770)),"@site/docs/02-learn/03-core-concepts/02-node/01-client-node.mdx",2770],"77c0519e":[()=>n.e(636).then(n.bind(n,6197)),"@site/docs/03-build/00-quickstart.mdx",6197],"7b9fe0bb":[()=>n.e(2822).then(n.bind(n,1631)),"@site/docs/01-explore/05-use-cases/05-trustless-gaming.mdx",1631],"80fe3eff":[()=>n.e(9300).then(n.bind(n,3975)),"@site/docs/01-explore/02-developers-quickstart/03-example-app.mdx",3975],"889f3b97":[()=>n.e(5101).then(n.bind(n,8621)),"@site/docs/01-explore/05-use-cases/07-decentralized-identity-verification.mdx",8621],"90e69b51":[()=>n.e(2262).then(n.bind(n,3564)),"@site/docs/04-contribute/02-hackathons.mdx",3564],"9471ce52":[()=>n.e(9229).then(n.bind(n,4007)),"@site/docs/02-learn/03-core-concepts/03-applications.mdx",4007],"94b34882":[()=>n.e(3299).then(n.bind(n,695)),"@site/docs/01-explore/05-use-cases/00-private-dao-management.mdx",695],"962e3ea7":[()=>n.e(8077).then(n.bind(n,334)),"@site/docs/02-learn/03-core-concepts/02-node/05-network.mdx",334],"964ce0ca":[()=>n.e(106).then(n.bind(n,4552)),"@site/docs/03-build/03-publish-app.mdx",4552],"96f6c727":[()=>n.e(6373).then(n.bind(n,6679)),"@site/docs/01-explore/04-why-not/03-zk.mdx",6679],"9bc1354f":[()=>n.e(3208).then(n.bind(n,9899)),"@site/docs/01-explore/05-use-cases/06-decentralized-edge-compute.mdx",9899],a7456010:[()=>n.e(1235).then(n.t.bind(n,8552,19)),"@generated/docusaurus-plugin-content-pages/default/__plugin.json",8552],a7bd4aaa:[()=>n.e(7098).then(n.bind(n,6829)),"@theme/DocVersionRoot",6829],a9154f55:[()=>n.e(1259).then(n.bind(n,4098)),"@site/docs/01-explore/05-use-cases/08-decentralized-intellectual-property-management.mdx",4098],a94703ab:[()=>Promise.all([n.e(1869),n.e(9048)]).then(n.bind(n,8034)),"@theme/DocRoot",8034],aba21aa0:[()=>n.e(5742).then(n.t.bind(n,7093,19)),"@generated/docusaurus-plugin-content-docs/default/__plugin.json",7093],b9be9bb6:[()=>n.e(8086).then(n.bind(n,8665)),"@site/docs/01-explore/05-use-cases/01-decentralized-voting-systems.mdx",8665],bc9a0017:[()=>n.e(772).then(n.bind(n,8154)),"@site/docs/01-explore/05-use-cases/03-deprod.mdx",8154],bf6ec8e5:[()=>n.e(7607).then(n.bind(n,8026)),"@site/docs/02-learn/03-core-concepts/01-identity (DID).mdx",8026],c022fa4c:[()=>n.e(7074).then(n.bind(n,2022)),"@site/docs/01-explore/04-why-not/01-blockchain.mdx",2022],c141421f:[()=>n.e(957).then(n.t.bind(n,936,19)),"@generated/docusaurus-theme-search-algolia/default/__plugin.json",936],d84133a6:[()=>n.e(965).then(n.bind(n,4735)),"@site/docs/03-build/02-client-sdks/02-client-ts-sdk.mdx",4735],d94758ba:[()=>n.e(21).then(n.bind(n,8238)),"@site/docs/01-explore/05-use-cases/02-decentralized-social-platforms.mdx",8238],e6fe25da:[()=>n.e(9667).then(n.bind(n,9601)),"@site/docs/02-learn/03-core-concepts/02-node/03-server.mdx",9601],f4e7e388:[()=>n.e(1249).then(n.bind(n,6190)),"@site/docs/02-learn/02-architecture.mdx",6190],f582a9aa:[()=>n.e(2226).then(n.bind(n,4446)),"@site/docs/02-learn/03-core-concepts/04-context.mdx",4446],fdb23cd9:[()=>n.e(546).then(n.bind(n,1748)),"@site/docs/01-explore/05-use-cases/04-decentralized-gig-economy.mdx",1748]};var l=n(6070);function s(e){let{error:t,retry:n,pastDelay:r}=e;return t?(0,l.jsxs)("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"},children:[(0,l.jsx)("p",{children:String(t)}),(0,l.jsx)("div",{children:(0,l.jsx)("button",{type:"button",onClick:n,children:"Retry"})})]}):r?(0,l.jsx)("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:(0,l.jsx)("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb",children:(0,l.jsxs)("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2",children:[(0,l.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,l.jsx)("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,l.jsx)("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,l.jsx)("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,l.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,l.jsx)("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,l.jsx)("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,l.jsx)("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,l.jsx)("circle",{cx:"22",cy:"22",r:"8",children:(0,l.jsx)("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"})})]})})}):null}var c=n(7114),u=n(7281);function d(e,t){if("*"===e)return a()({loading:s,loader:()=>n.e(3604).then(n.bind(n,3604)),modules:["@theme/NotFound"],webpack:()=>[3604],render(e,t){const n=e.default;return(0,l.jsx)(u.W,{value:{plugin:{name:"native",id:"default"}},children:(0,l.jsx)(n,{...t})})}});const r=o[`${e}-${t}`],d={},p=[],f=[],h=(0,c.A)(r);return Object.entries(h).forEach((e=>{let[t,n]=e;const r=i[n];r&&(d[t]=r[0],p.push(r[1]),f.push(r[2]))})),a().Map({loading:s,loader:d,modules:p,webpack:()=>f,render(t,n){const a=JSON.parse(JSON.stringify(r));Object.entries(t).forEach((t=>{let[n,r]=t;const o=r.default;if(!o)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof o&&"function"!=typeof o||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{o[e]=r[e]}));let i=a;const l=n.split(".");l.slice(0,-1).forEach((e=>{i=i[e]})),i[l[l.length-1]]=o}));const o=a.__comp;delete a.__comp;const i=a.__context;delete a.__context;const s=a.__props;return delete a.__props,(0,l.jsx)(u.W,{value:i,children:(0,l.jsx)(o,{...a,...s,...n})})}})}const p=[{path:"/search",component:d("/search","5de"),exact:!0},{path:"/",component:d("/","e5f"),exact:!0},{path:"/",component:d("/","735"),routes:[{path:"/",component:d("/","d17"),routes:[{path:"/",component:d("/","903"),routes:[{path:"/build/client-sdks/client-ts-sdk",component:d("/build/client-sdks/client-ts-sdk","5d3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/build/protocol-sdks/protocol-rs-sdk",component:d("/build/protocol-sdks/protocol-rs-sdk","1d5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/build/protocol-sdks/protocol-sdk",component:d("/build/protocol-sdks/protocol-sdk","100"),exact:!0,sidebar:"tutorialSidebar"},{path:"/build/publish-app",component:d("/build/publish-app","786"),exact:!0,sidebar:"tutorialSidebar"},{path:"/build/quickstart",component:d("/build/quickstart","977"),exact:!0,sidebar:"tutorialSidebar"},{path:"/contribute/bounty-program",component:d("/contribute/bounty-program","6f8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/contribute/github",component:d("/contribute/github","09b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/contribute/hackathons",component:d("/contribute/hackathons","515"),exact:!0,sidebar:"tutorialSidebar"},{path:"/explore/awesome-projects/only-peers",component:d("/explore/awesome-projects/only-peers","290"),exact:!0,sidebar:"tutorialSidebar"},{path:"/explore/awesome-projects/rock-paper-scissors",component:d("/explore/awesome-projects/rock-paper-scissors","d4a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/explore/developers-quickstart/admin-dashboard",component:d("/explore/developers-quickstart/admin-dashboard","f7b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/explore/developers-quickstart/example-app",component:d("/explore/developers-quickstart/example-app","a0c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/explore/developers-quickstart/getting-started",component:d("/explore/developers-quickstart/getting-started","97b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/explore/intro",component:d("/explore/intro","c45"),exact:!0,sidebar:"tutorialSidebar"},{path:"/explore/use-cases/decentralized-edge-compute",component:d("/explore/use-cases/decentralized-edge-compute","f7f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/explore/use-cases/decentralized-gig-economy",component:d("/explore/use-cases/decentralized-gig-economy","46a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/explore/use-cases/decentralized-identity-verification",component:d("/explore/use-cases/decentralized-identity-verification","603"),exact:!0,sidebar:"tutorialSidebar"},{path:"/explore/use-cases/decentralized-intellectual-property-management",component:d("/explore/use-cases/decentralized-intellectual-property-management","2f0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/explore/use-cases/decentralized-social-platforms",component:d("/explore/use-cases/decentralized-social-platforms","91d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/explore/use-cases/decentralized-voting-systems",component:d("/explore/use-cases/decentralized-voting-systems","ea2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/explore/use-cases/deprod",component:d("/explore/use-cases/deprod","cd4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/explore/use-cases/private-daos-management",component:d("/explore/use-cases/private-daos-management","6a9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/explore/use-cases/trustless-gaming",component:d("/explore/use-cases/trustless-gaming","fbf"),exact:!0,sidebar:"tutorialSidebar"},{path:"/explore/why-not/blockchain",component:d("/explore/why-not/blockchain","6dc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/explore/why-not/ipfs",component:d("/explore/why-not/ipfs","5a6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/explore/why-not/zk",component:d("/explore/why-not/zk","896"),exact:!0,sidebar:"tutorialSidebar"},{path:"/learn/advanced-concepts/encryption",component:d("/learn/advanced-concepts/encryption","80b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/learn/advanced-concepts/specialized-nodes",component:d("/learn/advanced-concepts/specialized-nodes","774"),exact:!0,sidebar:"tutorialSidebar"},{path:"/learn/architecture",component:d("/learn/architecture","e64"),exact:!0,sidebar:"tutorialSidebar"},{path:"/learn/core-concepts/applications",component:d("/learn/core-concepts/applications","c4f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/learn/core-concepts/contexts",component:d("/learn/core-concepts/contexts","b64"),exact:!0,sidebar:"tutorialSidebar"},{path:"/learn/core-concepts/identity",component:d("/learn/core-concepts/identity","c2c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/learn/core-concepts/node/admin-client-api",component:d("/learn/core-concepts/node/admin-client-api","1e1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/learn/core-concepts/node/client-node",component:d("/learn/core-concepts/node/client-node","436"),exact:!0,sidebar:"tutorialSidebar"},{path:"/learn/core-concepts/node/network",component:d("/learn/core-concepts/node/network","8b4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/learn/core-concepts/node/runtime",component:d("/learn/core-concepts/node/runtime","631"),exact:!0,sidebar:"tutorialSidebar"},{path:"/learn/core-concepts/node/server",component:d("/learn/core-concepts/node/server","868"),exact:!0,sidebar:"tutorialSidebar"},{path:"/learn/core-concepts/node/storage",component:d("/learn/core-concepts/node/storage","147"),exact:!0,sidebar:"tutorialSidebar"},{path:"/learn/terminology",component:d("/learn/terminology","e59"),exact:!0,sidebar:"tutorialSidebar"},{path:"/resources/community-and-support",component:d("/resources/community-and-support","3ec"),exact:!0,sidebar:"tutorialSidebar"},{path:"/resources/learning",component:d("/resources/learning","f5c"),exact:!0,sidebar:"tutorialSidebar"}]}]}]},{path:"*",component:d("*")}]},3550:(e,t,n)=>{"use strict";n.d(t,{o:()=>o,x:()=>i});var r=n(758),a=n(6070);const o=r.createContext(!1);function i(e){let{children:t}=e;const[n,i]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{i(!0)}),[]),(0,a.jsx)(o.Provider,{value:n,children:t})}},9947:(e,t,n)=>{"use strict";var r=n(758),a=n(9576),o=n(932),i=n(1742),l=n(4784),s=n(9902);const c=[n(3533),n(2409),n(6229),n(6267)];var u=n(8218),d=n(5557),p=n(1977),f=n(6070);function h(e){let{children:t}=e;return(0,f.jsx)(f.Fragment,{children:t})}var m=n(5463),g=n(8765),y=n(1958),b=n(8949),v=n(2667),w=n(5514),x=n(6860),k=n(5266),S=n(1887),E=n(2622);function _(){const{i18n:{currentLocale:e,defaultLocale:t,localeConfigs:n}}=(0,g.A)(),r=(0,w.o)(),a=n[e].htmlLang,o=e=>e.replace("-","_");return(0,f.jsxs)(m.A,{children:[Object.entries(n).map((e=>{let[t,{htmlLang:n}]=e;return(0,f.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:n},t)})),(0,f.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:"x-default"}),(0,f.jsx)("meta",{property:"og:locale",content:o(a)}),Object.values(n).filter((e=>a!==e.htmlLang)).map((e=>(0,f.jsx)("meta",{property:"og:locale:alternate",content:o(e.htmlLang)},`meta-og-${e.htmlLang}`)))]})}function C(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,g.A)(),r=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,g.A)(),{pathname:r}=(0,d.zy)();return e+(0,S.applyTrailingSlash)((0,y.Ay)(r),{trailingSlash:n,baseUrl:t})}(),a=t?`${n}${t}`:r;return(0,f.jsxs)(m.A,{children:[(0,f.jsx)("meta",{property:"og:url",content:a}),(0,f.jsx)("link",{rel:"canonical",href:a})]})}function T(){const{i18n:{currentLocale:e}}=(0,g.A)(),{metadata:t,image:n}=(0,b.p)();return(0,f.jsxs)(f.Fragment,{children:[(0,f.jsxs)(m.A,{children:[(0,f.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,f.jsx)("body",{className:x.w})]}),n&&(0,f.jsx)(v.be,{image:n}),(0,f.jsx)(C,{}),(0,f.jsx)(_,{}),(0,f.jsx)(E.A,{tag:k.Cy,locale:e}),(0,f.jsx)(m.A,{children:t.map(((e,t)=>(0,f.jsx)("meta",{...e},t)))})]})}const A=new Map;var N=n(3550),L=n(3792),O=n(9700);function P(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r{const r=t.default?.[e]??t[e];return r?.(...n)}));return()=>a.forEach((e=>e?.()))}const j=function(e){let{children:t,location:n,previousLocation:r}=e;return(0,O.A)((()=>{r!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,a=t.hash===n.hash,o=t.search===n.search;if(r&&a&&!o)return;const{hash:i}=t;if(i){const e=decodeURIComponent(i.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:r}),P("onRouteDidUpdate",{previousLocation:r,location:n}))}),[r,n]),t};function R(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,p.u)(u.A,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class I extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=s.A.canUseDOM?P("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=P("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),R(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return(0,f.jsx)(j,{previousLocation:this.previousLocation,location:t,children:(0,f.jsx)(d.qh,{location:t,render:()=>e})})}}const M=I,D="__docusaurus-base-url-issue-banner-container",F="__docusaurus-base-url-issue-banner",z="__docusaurus-base-url-issue-banner-suggestion-container";function B(e){return`\ndocument.addEventListener('DOMContentLoaded', function maybeInsertBanner() {\n var shouldInsert = typeof window['docusaurus'] === 'undefined';\n shouldInsert && insertBanner();\n});\n\nfunction insertBanner() {\n var bannerContainer = document.createElement('div');\n bannerContainer.id = '${D}';\n var bannerHtml = ${JSON.stringify(function(e){return`\n
\n

Your Docusaurus site did not load properly.

\n

A very common reason is a wrong site baseUrl configuration.

\n

Current configured baseUrl = ${e} ${"/"===e?" (default value)":""}

\n

We suggest trying baseUrl =

\n
\n`}(e)).replace(/{let{route:t}=e;return!0===t.exact})))return A.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return A.set(e.pathname,t),{...e,pathname:t}}((0,d.zy)());return(0,f.jsx)(M,{location:e,children:G})}function Y(){return(0,f.jsx)(W.A,{children:(0,f.jsx)(L.l,{children:(0,f.jsxs)(N.x,{children:[(0,f.jsxs)(h,{children:[(0,f.jsx)(H,{}),(0,f.jsx)(T,{}),(0,f.jsx)(U,{}),(0,f.jsx)(K,{})]}),(0,f.jsx)(q,{})]})})})}var Q=n(4054);const Z=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise(((t,n)=>{if("undefined"==typeof document)return void n();const r=document.createElement("link");r.setAttribute("rel","prefetch"),r.setAttribute("href",e),r.onload=()=>t(),r.onerror=()=>n();const a=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;a?.appendChild(r)}))}:function(e){return new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)}))};var X=n(7114);const J=new Set,ee=new Set,te=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,ne={prefetch:e=>{if(!(e=>!te()&&!ee.has(e)&&!J.has(e))(e))return!1;J.add(e);const t=(0,p.u)(u.A,e).flatMap((e=>{return t=e.route.path,Object.entries(Q).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,X.A)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?Z(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!te()&&!ee.has(e))(e)&&(ee.add(e),R(e))},re=Object.freeze(ne);function ae(e){let{children:t}=e;return"hash"===l.default.future.experimental_router?(0,f.jsx)(i.I9,{children:t}):(0,f.jsx)(i.Kd,{children:t})}const oe=Boolean(!0);if(s.A.canUseDOM){window.docusaurus=re;const e=document.getElementById("__docusaurus"),t=(0,f.jsx)(o.vd,{children:(0,f.jsx)(ae,{children:(0,f.jsx)(Y,{})})}),n=(e,t)=>{console.error("Docusaurus React Root onRecoverableError:",e,t)},i=()=>{if(window.docusaurusRoot)window.docusaurusRoot.render(t);else if(oe)window.docusaurusRoot=a.hydrateRoot(e,t,{onRecoverableError:n});else{const r=a.createRoot(e,{onRecoverableError:n});r.render(t),window.docusaurusRoot=r}};R(window.location.pathname).then((()=>{(0,r.startTransition)(i)}))}},3792:(e,t,n)=>{"use strict";n.d(t,{o:()=>d,l:()=>p});var r=n(758),a=n(4784);const o=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/","versions":[{"name":"current","label":"Next","isLast":true,"path":"/","mainDocId":"explore/intro","docs":[{"id":"build/client-sdks/client-ts-sdk","path":"/build/client-sdks/client-ts-sdk","sidebar":"tutorialSidebar"},{"id":"build/protocol-sdks/protocol-rs-sdk","path":"/build/protocol-sdks/protocol-rs-sdk","sidebar":"tutorialSidebar"},{"id":"build/protocol-sdks/protocol-sdk","path":"/build/protocol-sdks/protocol-sdk","sidebar":"tutorialSidebar"},{"id":"build/publish-app","path":"/build/publish-app","sidebar":"tutorialSidebar"},{"id":"build/quickstart","path":"/build/quickstart","sidebar":"tutorialSidebar"},{"id":"contribute/bounty-program","path":"/contribute/bounty-program","sidebar":"tutorialSidebar"},{"id":"contribute/github","path":"/contribute/github","sidebar":"tutorialSidebar"},{"id":"contribute/hackathons","path":"/contribute/hackathons","sidebar":"tutorialSidebar"},{"id":"explore/awesome-projects/only-peers","path":"/explore/awesome-projects/only-peers","sidebar":"tutorialSidebar"},{"id":"explore/awesome-projects/rock-paper-scissors","path":"/explore/awesome-projects/rock-paper-scissors","sidebar":"tutorialSidebar"},{"id":"explore/developers-quickstart/admin-dashboard","path":"/explore/developers-quickstart/admin-dashboard","sidebar":"tutorialSidebar"},{"id":"explore/developers-quickstart/example-app","path":"/explore/developers-quickstart/example-app","sidebar":"tutorialSidebar"},{"id":"explore/developers-quickstart/getting-started","path":"/explore/developers-quickstart/getting-started","sidebar":"tutorialSidebar"},{"id":"explore/intro","path":"/explore/intro","sidebar":"tutorialSidebar"},{"id":"explore/use-cases/decentralized-edge-compute","path":"/explore/use-cases/decentralized-edge-compute","sidebar":"tutorialSidebar"},{"id":"explore/use-cases/decentralized-gig-economy","path":"/explore/use-cases/decentralized-gig-economy","sidebar":"tutorialSidebar"},{"id":"explore/use-cases/decentralized-identity-verification","path":"/explore/use-cases/decentralized-identity-verification","sidebar":"tutorialSidebar"},{"id":"explore/use-cases/decentralized-intellectual-property-management","path":"/explore/use-cases/decentralized-intellectual-property-management","sidebar":"tutorialSidebar"},{"id":"explore/use-cases/decentralized-social-platforms","path":"/explore/use-cases/decentralized-social-platforms","sidebar":"tutorialSidebar"},{"id":"explore/use-cases/decentralized-voting-systems","path":"/explore/use-cases/decentralized-voting-systems","sidebar":"tutorialSidebar"},{"id":"explore/use-cases/deprod","path":"/explore/use-cases/deprod","sidebar":"tutorialSidebar"},{"id":"explore/use-cases/private-daos-management","path":"/explore/use-cases/private-daos-management","sidebar":"tutorialSidebar"},{"id":"explore/use-cases/trustless-gaming","path":"/explore/use-cases/trustless-gaming","sidebar":"tutorialSidebar"},{"id":"explore/why-not/blockchain","path":"/explore/why-not/blockchain","sidebar":"tutorialSidebar"},{"id":"explore/why-not/ipfs","path":"/explore/why-not/ipfs","sidebar":"tutorialSidebar"},{"id":"explore/why-not/zk","path":"/explore/why-not/zk","sidebar":"tutorialSidebar"},{"id":"learn/advanced-concepts/encryption","path":"/learn/advanced-concepts/encryption","sidebar":"tutorialSidebar"},{"id":"learn/advanced-concepts/specialized-nodes","path":"/learn/advanced-concepts/specialized-nodes","sidebar":"tutorialSidebar"},{"id":"learn/architecture","path":"/learn/architecture","sidebar":"tutorialSidebar"},{"id":"learn/core-concepts/applications","path":"/learn/core-concepts/applications","sidebar":"tutorialSidebar"},{"id":"learn/core-concepts/contexts","path":"/learn/core-concepts/contexts","sidebar":"tutorialSidebar"},{"id":"learn/core-concepts/identity","path":"/learn/core-concepts/identity","sidebar":"tutorialSidebar"},{"id":"learn/core-concepts/node/admin-client-api","path":"/learn/core-concepts/node/admin-client-api","sidebar":"tutorialSidebar"},{"id":"learn/core-concepts/node/client-node","path":"/learn/core-concepts/node/client-node","sidebar":"tutorialSidebar"},{"id":"learn/core-concepts/node/network","path":"/learn/core-concepts/node/network","sidebar":"tutorialSidebar"},{"id":"learn/core-concepts/node/runtime","path":"/learn/core-concepts/node/runtime","sidebar":"tutorialSidebar"},{"id":"learn/core-concepts/node/server","path":"/learn/core-concepts/node/server","sidebar":"tutorialSidebar"},{"id":"learn/core-concepts/node/storage","path":"/learn/core-concepts/node/storage","sidebar":"tutorialSidebar"},{"id":"learn/terminology","path":"/learn/terminology","sidebar":"tutorialSidebar"},{"id":"resources/community-and-support","path":"/resources/community-and-support","sidebar":"tutorialSidebar"},{"id":"resources/learning","path":"/resources/learning","sidebar":"tutorialSidebar"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/explore/intro","label":"explore/intro"}}}}],"breadcrumbs":true}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"}}}');var l=n(2654);const s=JSON.parse('{"docusaurusVersion":"3.4.0","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"3.4.0"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"3.4.0"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"3.4.0"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"3.4.0"},"docusaurus-theme-search-algolia":{"type":"package","name":"@docusaurus/theme-search-algolia","version":"3.4.0"},"docusaurus-plugin-sass":{"type":"package","name":"docusaurus-plugin-sass","version":"0.2.5"}}}');var c=n(6070);const u={siteConfig:a.default,siteMetadata:s,globalData:o,i18n:i,codeTranslations:l},d=r.createContext(u);function p(e){let{children:t}=e;return(0,c.jsx)(d.Provider,{value:u,children:t})}},2264:(e,t,n)=>{"use strict";n.d(t,{A:()=>m});var r=n(758),a=n(9902),o=n(5463),i=n(1887),l=n(8013),s=n(7281),c=n(6070);function u(e){let{error:t,tryAgain:n}=e;return(0,c.jsxs)("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"},children:[(0,c.jsx)("h1",{style:{fontSize:"3rem"},children:"This page crashed"}),(0,c.jsx)("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"},children:"Try again"}),(0,c.jsx)(d,{error:t})]})}function d(e){let{error:t}=e;const n=(0,i.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,c.jsx)("p",{style:{whiteSpace:"pre-wrap"},children:n})}function p(e){let{children:t}=e;return(0,c.jsx)(s.W,{value:{plugin:{name:"docusaurus-core-error-boundary",id:"default"}},children:t})}function f(e){let{error:t,tryAgain:n}=e;return(0,c.jsx)(p,{children:(0,c.jsxs)(m,{fallback:()=>(0,c.jsx)(u,{error:t,tryAgain:n}),children:[(0,c.jsx)(o.A,{children:(0,c.jsx)("title",{children:"Page Error"})}),(0,c.jsx)(l.A,{children:(0,c.jsx)(u,{error:t,tryAgain:n})})]})})}const h=e=>(0,c.jsx)(f,{...e});class m extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){a.A.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??h)(e)}return e??null}}},9902:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,a={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},5463:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});n(758);var r=n(932),a=n(6070);function o(e){return(0,a.jsx)(r.mg,{...e})}},8257:(e,t,n)=>{"use strict";n.d(t,{A:()=>f});var r=n(758),a=n(1742),o=n(1887),i=n(8765),l=n(8167),s=n(9902),c=n(1843),u=n(1958),d=n(6070);function p(e,t){let{isNavLink:n,to:p,href:f,activeClassName:h,isActive:m,"data-noBrokenLinkCheck":g,autoAddBaseUrl:y=!0,...b}=e;const{siteConfig:v}=(0,i.A)(),{trailingSlash:w,baseUrl:x}=v,k=v.future.experimental_router,{withBaseUrl:S}=(0,u.hH)(),E=(0,c.A)(),_=(0,r.useRef)(null);(0,r.useImperativeHandle)(t,(()=>_.current));const C=p||f;const T=(0,l.A)(C),A=C?.replace("pathname://","");let N=void 0!==A?(L=A,y&&(e=>e.startsWith("/"))(L)?S(L):L):void 0;var L;"hash"===k&&N?.startsWith("./")&&(N=N?.slice(1)),N&&T&&(N=(0,o.applyTrailingSlash)(N,{trailingSlash:w,baseUrl:x}));const O=(0,r.useRef)(!1),P=n?a.k2:a.N_,j=s.A.canUseIntersectionObserver,R=(0,r.useRef)(),I=()=>{O.current||null==N||(window.docusaurus.preload(N),O.current=!0)};(0,r.useEffect)((()=>(!j&&T&&null!=N&&window.docusaurus.prefetch(N),()=>{j&&R.current&&R.current.disconnect()})),[R,N,j,T]);const M=N?.startsWith("#")??!1,D=!b.target||"_self"===b.target,F=!N||!T||!D;return g||!M&&F||E.collectLink(N),b.id&&E.collectAnchor(b.id),F?(0,d.jsx)("a",{ref:_,href:N,...C&&!T&&{target:"_blank",rel:"noopener noreferrer"},...b}):(0,d.jsx)(P,{...b,onMouseEnter:I,onTouchStart:I,innerRef:e=>{_.current=e,j&&e&&T&&(R.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(R.current.unobserve(e),R.current.disconnect(),null!=N&&window.docusaurus.prefetch(N))}))})),R.current.observe(e))},to:N,...n&&{isActive:m,activeClassName:h}})}const f=r.forwardRef(p)},7706:(e,t,n)=>{"use strict";n.d(t,{A:()=>c,T:()=>s});var r=n(758),a=n(6070);function o(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,r.isValidElement)(e)))?n.map(((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var i=n(2654);function l(e){let{id:t,message:n}=e;if(void 0===t&&void 0===n)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return i[t??n]??n??t}function s(e,t){let{message:n,id:r}=e;return o(l({message:n,id:r}),t)}function c(e){let{children:t,id:n,values:r}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal children",t),new Error("The Docusaurus component only accept simple string values");const i=l({message:t,id:n});return(0,a.jsx)(a.Fragment,{children:o(i,r)})}},76:(e,t,n)=>{"use strict";n.d(t,{W:()=>r});const r="default"},8167:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function a(e){return void 0!==e&&!r(e)}n.d(t,{A:()=>a,z:()=>r})},1958:(e,t,n)=>{"use strict";n.d(t,{Ay:()=>l,hH:()=>i});var r=n(758),a=n(8765),o=n(8167);function i(){const{siteConfig:e}=(0,a.A)(),{baseUrl:t,url:n}=e,i=e.future.experimental_router,l=(0,r.useCallback)(((e,r)=>function(e){let{siteUrl:t,baseUrl:n,url:r,options:{forcePrependBaseUrl:a=!1,absolute:i=!1}={},router:l}=e;if(!r||r.startsWith("#")||(0,o.z)(r))return r;if("hash"===l)return r.startsWith("/")?`.${r}`:`./${r}`;if(a)return n+r.replace(/^\//,"");if(r===n.replace(/\/$/,""))return n;const s=r.startsWith(n)?r:n+r.replace(/^\//,"");return i?t+s:s}({siteUrl:n,baseUrl:t,url:e,options:r,router:i})),[n,t,i]);return{withBaseUrl:l}}function l(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},1843:(e,t,n)=>{"use strict";n.d(t,{A:()=>i});var r=n(758);n(6070);const a=r.createContext({collectAnchor:()=>{},collectLink:()=>{}}),o=()=>(0,r.useContext)(a);function i(){return o()}},8765:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(758),a=n(3792);function o(){return(0,r.useContext)(a.o)}},4272:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(758),a=n(3550);function o(){return(0,r.useContext)(a.o)}},9700:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(758);const a=n(9902).A.canUseDOM?r.useLayoutEffect:r.useEffect},7114:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});const r=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function a(e){const t={};return function e(n,a){Object.entries(n).forEach((n=>{let[o,i]=n;const l=a?`${a}.${o}`:o;r(i)?e(i,l):t[l]=i}))}(e),t}},7281:(e,t,n)=>{"use strict";n.d(t,{W:()=>i,o:()=>o});var r=n(758),a=n(6070);const o=r.createContext(null);function i(e){let{children:t,value:n}=e;const i=r.useContext(o),l=(0,r.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const r={...t.data,...n?.data};return{plugin:t.plugin,data:r}}({parent:i,value:n})),[i,n]);return(0,a.jsx)(o.Provider,{value:l,children:t})}},2907:(e,t,n)=>{"use strict";n.d(t,{zK:()=>y,vT:()=>f,gk:()=>h,Gy:()=>d,HW:()=>b,ht:()=>p,r7:()=>g,jh:()=>m});var r=n(5557),a=n(8765),o=n(76);function i(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,a.A)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}const l=e=>e.versions.find((e=>e.isLast));function s(e,t){const n=l(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,r.B6)(t,{path:e.path,exact:!1,strict:!1})))}function c(e,t){const n=s(e,t),a=n?.docs.find((e=>!!(0,r.B6)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:a,alternateDocVersions:a?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(a.id):{}}}const u={},d=()=>i("docusaurus-plugin-content-docs")??u,p=e=>{try{return function(e,t,n){void 0===t&&(t=o.W),void 0===n&&(n={});const r=i(e),a=r?.[t];if(!a&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return a}("docusaurus-plugin-content-docs",e,{failfast:!0})}catch(t){throw new Error("You are using a feature of the Docusaurus docs plugin, but this plugin does not seem to be enabled"+("Default"===e?"":` (pluginId=${e}`),{cause:t})}};function f(e){void 0===e&&(e={});const t=d(),{pathname:n}=(0,r.zy)();return function(e,t,n){void 0===n&&(n={});const a=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.B6)(t,{path:n.path,exact:!1,strict:!1})})),o=a?{pluginId:a[0],pluginData:a[1]}:void 0;if(!o&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map((e=>e.path)).join(", ")}`);return o}(t,n,e)}function h(e){void 0===e&&(e={});const t=f(e),{pathname:n}=(0,r.zy)();if(!t)return;return{activePlugin:t,activeVersion:s(t.pluginData,n)}}function m(e){return p(e).versions}function g(e){const t=p(e);return l(t)}function y(e){const t=p(e),{pathname:n}=(0,r.zy)();return c(t,n)}function b(e){const t=p(e),{pathname:n}=(0,r.zy)();return function(e,t){const n=l(e);return{latestDocSuggestion:c(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},2059:(e,t,n)=>{"use strict";function r(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.__proto__=t}function a(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(){return i=Object.assign||function(e){for(var t=1;t{"use strict";n.r(t),n.d(t,{default:()=>o});var r=n(8744),a=n.n(r);a().configure({showSpinner:!1});const o={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{a().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){a().done()}}},2409:(e,t,n)=>{"use strict";n.r(t);var r=n(3477),a=n(4784);!function(e){const{themeConfig:{prism:t}}=a.default,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{"php"===e&&n(1274),n(1721)(`./prism-${e}`)})),delete globalThis.Prism}(r.My)},9663:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});n(758);var r=n(3526),a=n(7706),o=n(8949),i=n(8257),l=n(1843);const s={anchorWithStickyNavbar:"anchorWithStickyNavbar_UcM0",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_J7iO"};var c=n(6070);function u(e){let{as:t,id:n,...u}=e;const d=(0,l.A)(),{navbar:{hideOnScroll:p}}=(0,o.p)();if("h1"===t||!n)return(0,c.jsx)(t,{...u,id:void 0});d.collectAnchor(n);const f=(0,a.T)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof u.children?u.children:n});return(0,c.jsxs)(t,{...u,className:(0,r.A)("anchor",p?s.anchorWithHideOnScrollNavbar:s.anchorWithStickyNavbar,u.className),id:n,children:[u.children,(0,c.jsx)(i.A,{className:"hash-link",to:`#${n}`,"aria-label":f,title:f,children:"\u200b"})]})}},7615:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});n(758);const r={iconExternalLink:"iconExternalLink_lhLb"};var a=n(6070);function o(e){let{width:t=13.5,height:n=13.5}=e;return(0,a.jsx)("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:r.iconExternalLink,children:(0,a.jsx)("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"})})}},8013:(e,t,n)=>{"use strict";n.d(t,{A:()=>jt});var r=n(758),a=n(3526),o=n(2264),i=n(2667),l=n(5557),s=n(7706),c=n(3403),u=n(6070);const d="__docusaurus_skipToContent_fallback";function p(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function f(){const e=(0,r.useRef)(null),{action:t}=(0,l.W6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&p(t)}),[]);return(0,c.$)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&p(e.current)})),{containerRef:e,onClick:n}}const h=(0,s.T)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function m(e){const t=e.children??h,{containerRef:n,onClick:r}=f();return(0,u.jsx)("div",{ref:n,role:"region","aria-label":h,children:(0,u.jsx)("a",{...e,href:`#${d}`,onClick:r,children:t})})}var g=n(2702),y=n(6860);const b={skipToContent:"skipToContent_fesW"};function v(){return(0,u.jsx)(m,{className:b.skipToContent})}var w=n(8949),x=n(42);function k(e){let{width:t=21,height:n=21,color:r="currentColor",strokeWidth:a=1.2,className:o,...i}=e;return(0,u.jsx)("svg",{viewBox:"0 0 15 15",width:t,height:n,...i,children:(0,u.jsx)("g",{stroke:r,strokeWidth:a,children:(0,u.jsx)("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})})})}const S={closeButton:"closeButton_xLEJ"};function E(e){return(0,u.jsx)("button",{type:"button","aria-label":(0,s.T)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"}),...e,className:(0,a.A)("clean-btn close",S.closeButton,e.className),children:(0,u.jsx)(k,{width:14,height:14,strokeWidth:3.1})})}const _={content:"content_BFwO"};function C(e){const{announcementBar:t}=(0,w.p)(),{content:n}=t;return(0,u.jsx)("div",{...e,className:(0,a.A)(_.content,e.className),dangerouslySetInnerHTML:{__html:n}})}const T={announcementBar:"announcementBar_iltt",announcementBarPlaceholder:"announcementBarPlaceholder_uEZi",announcementBarClose:"announcementBarClose__T52",announcementBarContent:"announcementBarContent_YFhr"};function A(){const{announcementBar:e}=(0,w.p)(),{isActive:t,close:n}=(0,x.M)();if(!t)return null;const{backgroundColor:r,textColor:a,isCloseable:o}=e;return(0,u.jsxs)("div",{className:T.announcementBar,style:{backgroundColor:r,color:a},role:"banner",children:[o&&(0,u.jsx)("div",{className:T.announcementBarPlaceholder}),(0,u.jsx)(C,{className:T.announcementBarContent}),o&&(0,u.jsx)(E,{onClick:n,className:T.announcementBarClose})]})}var N=n(8650),L=n(3709);var O=n(1495),P=n(6083);const j=r.createContext(null);function R(e){let{children:t}=e;const n=function(){const e=(0,N.M)(),t=(0,P.YL)(),[n,a]=(0,r.useState)(!1),o=null!==t.component,i=(0,O.ZC)(o);return(0,r.useEffect)((()=>{o&&!i&&a(!0)}),[o,i]),(0,r.useEffect)((()=>{o?e.shown||a(!0):a(!1)}),[e.shown,o]),(0,r.useMemo)((()=>[n,a]),[n])}();return(0,u.jsx)(j.Provider,{value:n,children:t})}function I(e){if(e.component){const t=e.component;return(0,u.jsx)(t,{...e.props})}}function M(){const e=(0,r.useContext)(j);if(!e)throw new O.dV("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,a=(0,r.useCallback)((()=>n(!1)),[n]),o=(0,P.YL)();return(0,r.useMemo)((()=>({shown:t,hide:a,content:I(o)})),[a,o,t])}function D(e){let{header:t,primaryMenu:n,secondaryMenu:r}=e;const{shown:o}=M();return(0,u.jsxs)("div",{className:"navbar-sidebar",children:[t,(0,u.jsxs)("div",{className:(0,a.A)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":o}),children:[(0,u.jsx)("div",{className:"navbar-sidebar__item menu",children:n}),(0,u.jsx)("div",{className:"navbar-sidebar__item menu",children:r})]})]})}var F=n(1382),z=n(4272);function B(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"})})}function $(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"})})}const U={toggle:"toggle_aafI",toggleButton:"toggleButton_Nz89",darkToggleIcon:"darkToggleIcon_F1FA",lightToggleIcon:"lightToggleIcon_kqLD",toggleButtonDisabled:"toggleButtonDisabled_T1FS"};function H(e){let{className:t,buttonClassName:n,value:r,onChange:o}=e;const i=(0,z.A)(),l=(0,s.T)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===r?(0,s.T)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,s.T)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return(0,u.jsx)("div",{className:(0,a.A)(U.toggle,t),children:(0,u.jsxs)("button",{className:(0,a.A)("clean-btn",U.toggleButton,!i&&U.toggleButtonDisabled,n),type:"button",onClick:()=>o("dark"===r?"light":"dark"),disabled:!i,title:l,"aria-label":l,"aria-live":"polite",children:[(0,u.jsx)(B,{className:(0,a.A)(U.toggleIcon,U.lightToggleIcon)}),(0,u.jsx)($,{className:(0,a.A)(U.toggleIcon,U.darkToggleIcon)})]})})}const W=r.memo(H),V={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_eWwK"};function q(e){let{className:t}=e;const n=(0,w.p)().navbar.style,r=(0,w.p)().colorMode.disableSwitch,{colorMode:a,setColorMode:o}=(0,F.G)();return r?null:(0,u.jsx)(W,{className:t,buttonClassName:"dark"===n?V.darkNavbarColorModeToggle:void 0,value:a,onChange:o})}var G=n(1240);function K(){return(0,u.jsx)(G.A,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function Y(){const e=(0,N.M)();return(0,u.jsx)("button",{type:"button","aria-label":(0,s.T)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle(),children:(0,u.jsx)(k,{color:"var(--ifm-color-emphasis-600)"})})}function Q(){return(0,u.jsxs)("div",{className:"navbar-sidebar__brand",children:[(0,u.jsx)(K,{}),(0,u.jsx)(q,{className:"margin-right--md"}),(0,u.jsx)(Y,{})]})}var Z=n(8257),X=n(1958),J=n(8167),ee=n(9409),te=n(7615);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:r,href:a,label:o,html:i,isDropdownLink:l,prependBaseUrlToHref:s,...c}=e;const d=(0,X.Ay)(r),p=(0,X.Ay)(t),f=(0,X.Ay)(a,{forcePrependBaseUrl:!0}),h=o&&a&&!(0,J.A)(a),m=i?{dangerouslySetInnerHTML:{__html:i}}:{children:(0,u.jsxs)(u.Fragment,{children:[o,h&&(0,u.jsx)(te.A,{...l&&{width:12,height:12}})]})};return a?(0,u.jsx)(Z.A,{href:s?f:a,...c,...m}):(0,u.jsx)(Z.A,{to:d,isNavLink:!0,...(t||n)&&{isActive:(e,t)=>n?(0,ee.G)(n,t.pathname):t.pathname.startsWith(p)},...c,...m})}function re(e){let{className:t,isDropdownItem:n=!1,...r}=e;const o=(0,u.jsx)(ne,{className:(0,a.A)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n,...r});return n?(0,u.jsx)("li",{children:o}):o}function ae(e){let{className:t,isDropdownItem:n,...r}=e;return(0,u.jsx)("li",{className:"menu__list-item",children:(0,u.jsx)(ne,{className:(0,a.A)("menu__link",t),...r})})}function oe(e){let{mobile:t=!1,position:n,...r}=e;const a=t?ae:re;return(0,u.jsx)(a,{...r,activeClassName:r.activeClassName??(t?"menu__link--active":"navbar__link--active")})}var ie=n(1661),le=n(428),se=n(8765);const ce={dropdownNavbarItemMobile:"dropdownNavbarItemMobile_xkDW"};function ue(e,t){return e.some((e=>function(e,t){return!!(0,le.ys)(e.to,t)||!!(0,ee.G)(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function de(e){let{items:t,position:n,className:o,onClick:i,...l}=e;const s=(0,r.useRef)(null),[c,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{s.current&&!s.current.contains(e.target)&&d(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),document.addEventListener("focusin",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e),document.removeEventListener("focusin",e)}}),[s]),(0,u.jsxs)("div",{ref:s,className:(0,a.A)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":c}),children:[(0,u.jsx)(ne,{"aria-haspopup":"true","aria-expanded":c,role:"button",href:l.to?void 0:"#",className:(0,a.A)("navbar__link",o),...l,onClick:l.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!c))},children:l.children??l.label}),(0,u.jsx)("ul",{className:"dropdown__menu",children:t.map(((e,t)=>(0,r.createElement)(Ve,{isDropdownItem:!0,activeClassName:"dropdown__link--active",...e,key:t})))})]})}function pe(e){let{items:t,className:n,position:o,onClick:i,...s}=e;const c=function(){const{siteConfig:{baseUrl:e}}=(0,se.A)(),{pathname:t}=(0,l.zy)();return t.replace(e,"/")}(),d=ue(t,c),{collapsed:p,toggleCollapsed:f,setCollapsed:h}=(0,ie.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&h(!d)}),[c,d,h]),(0,u.jsxs)("li",{className:(0,a.A)("menu__list-item",{"menu__list-item--collapsed":p}),children:[(0,u.jsx)(ne,{role:"button",className:(0,a.A)(ce.dropdownNavbarItemMobile,"menu__link menu__link--sublist menu__link--sublist-caret",n),...s,onClick:e=>{e.preventDefault(),f()},children:s.children??s.label}),(0,u.jsx)(ie.N,{lazy:!0,as:"ul",className:"menu__list",collapsed:p,children:t.map(((e,t)=>(0,r.createElement)(Ve,{mobile:!0,isDropdownItem:!0,onClick:i,activeClassName:"menu__link--active",...e,key:t})))})]})}function fe(e){let{mobile:t=!1,...n}=e;const r=t?pe:de;return(0,u.jsx)(r,{...n})}var he=n(5514);function me(e){let{width:t=20,height:n=20,...r}=e;return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0,...r,children:(0,u.jsx)("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"})})}const ge="iconLanguage__rYD";var ye=n(8143);function be(){return r.createElement("svg",{width:"15",height:"15",className:"DocSearch-Control-Key-Icon"},r.createElement("path",{d:"M4.505 4.496h2M5.505 5.496v5M8.216 4.496l.055 5.993M10 7.5c.333.333.5.667.5 1v2M12.326 4.5v5.996M8.384 4.496c1.674 0 2.116 0 2.116 1.5s-.442 1.5-2.116 1.5M3.205 9.303c-.09.448-.277 1.21-1.241 1.203C1 10.5.5 9.513.5 8V7c0-1.57.5-2.5 1.464-2.494.964.006 1.134.598 1.24 1.342M12.553 10.5h1.953",strokeWidth:"1.2",stroke:"currentColor",fill:"none",strokeLinecap:"square"}))}var ve=n(8788),we=["translations"];function xe(){return xe=Object.assign||function(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var _e="Ctrl";var Ce=r.forwardRef((function(e,t){var n=e.translations,a=void 0===n?{}:n,o=Ee(e,we),i=a.buttonText,l=void 0===i?"Search":i,s=a.buttonAriaLabel,c=void 0===s?"Search":s,u=ke((0,r.useState)(null),2),d=u[0],p=u[1];return(0,r.useEffect)((function(){"undefined"!=typeof navigator&&(/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)?p("\u2318"):p(_e))}),[]),r.createElement("button",xe({type:"button",className:"DocSearch DocSearch-Button","aria-label":c},o,{ref:t}),r.createElement("span",{className:"DocSearch-Button-Container"},r.createElement(ve.W,null),r.createElement("span",{className:"DocSearch-Button-Placeholder"},l)),r.createElement("span",{className:"DocSearch-Button-Keys"},null!==d&&r.createElement(r.Fragment,null,r.createElement(Te,{reactsToKey:d===_e?_e:"Meta"},d===_e?r.createElement(be,null):d),r.createElement(Te,{reactsToKey:"k"},"K"))))}));function Te(e){var t=e.reactsToKey,n=e.children,a=ke((0,r.useState)(!1),2),o=a[0],i=a[1];return(0,r.useEffect)((function(){if(t)return window.addEventListener("keydown",e),window.addEventListener("keyup",n),function(){window.removeEventListener("keydown",e),window.removeEventListener("keyup",n)};function e(e){e.key===t&&i(!0)}function n(e){e.key!==t&&"Meta"!==e.key||i(!1)}}),[t]),r.createElement("kbd",{className:o?"DocSearch-Button-Key DocSearch-Button-Key--pressed":"DocSearch-Button-Key"},n)}var Ae=n(5463),Ne=n(2062),Le=n(9447),Oe=n(5266);const Pe={button:{buttonText:(0,s.T)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"}),buttonAriaLabel:(0,s.T)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"})},modal:{searchBox:{resetButtonTitle:(0,s.T)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),resetButtonAriaLabel:(0,s.T)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),cancelButtonText:(0,s.T)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"}),cancelButtonAriaLabel:(0,s.T)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"})},startScreen:{recentSearchesTitle:(0,s.T)({id:"theme.SearchModal.startScreen.recentSearchesTitle",message:"Recent",description:"The title for recent searches"}),noRecentSearchesText:(0,s.T)({id:"theme.SearchModal.startScreen.noRecentSearchesText",message:"No recent searches",description:"The text when no recent searches"}),saveRecentSearchButtonTitle:(0,s.T)({id:"theme.SearchModal.startScreen.saveRecentSearchButtonTitle",message:"Save this search",description:"The label for save recent search button"}),removeRecentSearchButtonTitle:(0,s.T)({id:"theme.SearchModal.startScreen.removeRecentSearchButtonTitle",message:"Remove this search from history",description:"The label for remove recent search button"}),favoriteSearchesTitle:(0,s.T)({id:"theme.SearchModal.startScreen.favoriteSearchesTitle",message:"Favorite",description:"The title for favorite searches"}),removeFavoriteSearchButtonTitle:(0,s.T)({id:"theme.SearchModal.startScreen.removeFavoriteSearchButtonTitle",message:"Remove this search from favorites",description:"The label for remove favorite search button"})},errorScreen:{titleText:(0,s.T)({id:"theme.SearchModal.errorScreen.titleText",message:"Unable to fetch results",description:"The title for error screen of search modal"}),helpText:(0,s.T)({id:"theme.SearchModal.errorScreen.helpText",message:"You might want to check your network connection.",description:"The help text for error screen of search modal"})},footer:{selectText:(0,s.T)({id:"theme.SearchModal.footer.selectText",message:"to select",description:"The explanatory text of the action for the enter key"}),selectKeyAriaLabel:(0,s.T)({id:"theme.SearchModal.footer.selectKeyAriaLabel",message:"Enter key",description:"The ARIA label for the Enter key button that makes the selection"}),navigateText:(0,s.T)({id:"theme.SearchModal.footer.navigateText",message:"to navigate",description:"The explanatory text of the action for the Arrow up and Arrow down key"}),navigateUpKeyAriaLabel:(0,s.T)({id:"theme.SearchModal.footer.navigateUpKeyAriaLabel",message:"Arrow up",description:"The ARIA label for the Arrow up key button that makes the navigation"}),navigateDownKeyAriaLabel:(0,s.T)({id:"theme.SearchModal.footer.navigateDownKeyAriaLabel",message:"Arrow down",description:"The ARIA label for the Arrow down key button that makes the navigation"}),closeText:(0,s.T)({id:"theme.SearchModal.footer.closeText",message:"to close",description:"The explanatory text of the action for Escape key"}),closeKeyAriaLabel:(0,s.T)({id:"theme.SearchModal.footer.closeKeyAriaLabel",message:"Escape key",description:"The ARIA label for the Escape key button that close the modal"}),searchByText:(0,s.T)({id:"theme.SearchModal.footer.searchByText",message:"Search by",description:"The text explain that the search is making by Algolia"})},noResultsScreen:{noResultsText:(0,s.T)({id:"theme.SearchModal.noResultsScreen.noResultsText",message:"No results for",description:"The text explains that there are no results for the following search"}),suggestedQueryText:(0,s.T)({id:"theme.SearchModal.noResultsScreen.suggestedQueryText",message:"Try searching for",description:"The text for the suggested query when no results are found for the following search"}),reportMissingResultsText:(0,s.T)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsText",message:"Believe this query should return results?",description:"The text for the question where the user thinks there are missing results"}),reportMissingResultsLinkText:(0,s.T)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsLinkText",message:"Let us know.",description:"The text for the link to report missing results"})}},placeholder:(0,s.T)({id:"theme.SearchModal.placeholder",message:"Search docs",description:"The placeholder of the input of the DocSearch pop-up modal"})};let je=null;function Re(e){let{hit:t,children:n}=e;return(0,u.jsx)(Z.A,{to:t.url,children:n})}function Ie(e){let{state:t,onClose:n}=e;const r=(0,Ne.w)();return(0,u.jsx)(Z.A,{to:r(t.query),onClick:n,children:(0,u.jsx)(s.A,{id:"theme.SearchBar.seeAll",values:{count:t.context.nbHits},children:"See all {count} results"})})}function Me(e){let{contextualSearch:t,externalUrlRegex:a,...o}=e;const{siteMetadata:i}=(0,se.A)(),s=(0,Le.C)(),c=function(){const{locale:e,tags:t}=(0,Oe.af)();return[`language:${e}`,t.map((e=>`docusaurus_tag:${e}`))]}(),d=o.searchParameters?.facetFilters??[],p=t?function(e,t){const n=e=>"string"==typeof e?[e]:e;return[...n(e),...n(t)]}(c,d):d,f={...o.searchParameters,facetFilters:p},h=(0,l.W6)(),m=(0,r.useRef)(null),g=(0,r.useRef)(null),[y,b]=(0,r.useState)(!1),[v,w]=(0,r.useState)(void 0),x=(0,r.useCallback)((()=>je?Promise.resolve():Promise.all([n.e(9460).then(n.bind(n,9460)),Promise.all([n.e(1869),n.e(2833)]).then(n.bind(n,2833)),Promise.all([n.e(1869),n.e(2235)]).then(n.bind(n,2235))]).then((e=>{let[{DocSearchModal:t}]=e;je=t}))),[]),k=(0,r.useCallback)((()=>{if(!m.current){const e=document.createElement("div");m.current=e,document.body.insertBefore(e,document.body.firstChild)}}),[]),S=(0,r.useCallback)((()=>{k(),x().then((()=>b(!0)))}),[x,k]),E=(0,r.useCallback)((()=>{b(!1),g.current?.focus()}),[]),_=(0,r.useCallback)((e=>{e.preventDefault(),w(e.key),S()}),[S]),C=(0,r.useRef)({navigate(e){let{itemUrl:t}=e;(0,ee.G)(a,t)?window.location.href=t:h.push(t)}}).current,T=(0,r.useRef)((e=>o.transformItems?o.transformItems(e):e.map((e=>({...e,url:s(e.url)}))))).current,A=(0,r.useMemo)((()=>e=>(0,u.jsx)(Ie,{...e,onClose:E})),[E]),N=(0,r.useCallback)((e=>(e.addAlgoliaAgent("docusaurus",i.docusaurusVersion),e)),[i.docusaurusVersion]);return function(e){var t=e.isOpen,n=e.onOpen,a=e.onClose,o=e.onInput,i=e.searchButtonRef;r.useEffect((function(){function e(e){var r;(27===e.keyCode&&t||"k"===(null===(r=e.key)||void 0===r?void 0:r.toLowerCase())&&(e.metaKey||e.ctrlKey)||!function(e){var t=e.target,n=t.tagName;return t.isContentEditable||"INPUT"===n||"SELECT"===n||"TEXTAREA"===n}(e)&&"/"===e.key&&!t)&&(e.preventDefault(),t?a():document.body.classList.contains("DocSearch--active")||document.body.classList.contains("DocSearch--active")||n()),i&&i.current===document.activeElement&&o&&/[a-zA-Z0-9]/.test(String.fromCharCode(e.keyCode))&&o(e)}return window.addEventListener("keydown",e),function(){window.removeEventListener("keydown",e)}}),[t,n,a,o,i])}({isOpen:y,onOpen:S,onClose:E,onInput:_,searchButtonRef:g}),(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(Ae.A,{children:(0,u.jsx)("link",{rel:"preconnect",href:`https://${o.appId}-dsn.algolia.net`,crossOrigin:"anonymous"})}),(0,u.jsx)(Ce,{onTouchStart:x,onFocus:x,onMouseOver:x,onClick:S,ref:g,translations:Pe.button}),y&&je&&m.current&&(0,ye.createPortal)((0,u.jsx)(je,{onClose:E,initialScrollY:window.scrollY,initialQuery:v,navigator:C,transformItems:T,hitComponent:Re,transformSearchClient:N,...o.searchPagePath&&{resultsFooterComponent:A},...o,searchParameters:f,placeholder:Pe.placeholder,translations:Pe.modal}),m.current)]})}function De(){const{siteConfig:e}=(0,se.A)();return(0,u.jsx)(Me,{...e.themeConfig.algolia})}const Fe={navbarSearchContainer:"navbarSearchContainer_VT3I"};function ze(e){let{children:t,className:n}=e;return(0,u.jsx)("div",{className:(0,a.A)(n,Fe.navbarSearchContainer),children:t})}var Be=n(2907),$e=n(3766);var Ue=n(6804);const He=e=>e.docs.find((t=>t.id===e.mainDocId));const We={default:oe,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:r,queryString:a="",...o}=e;const{i18n:{currentLocale:i,locales:c,localeConfigs:d}}=(0,se.A)(),p=(0,he.o)(),{search:f,hash:h}=(0,l.zy)(),m=[...n,...c.map((e=>{const n=`${`pathname://${p.createUrl({locale:e,fullyQualified:!1})}`}${f}${h}${a}`;return{label:d[e].label,lang:d[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...r],g=t?(0,s.T)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[i].label;return(0,u.jsx)(fe,{...o,mobile:t,label:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(me,{className:ge}),g]}),items:m})},search:function(e){let{mobile:t,className:n}=e;return t?null:(0,u.jsx)(ze,{className:n,children:(0,u.jsx)(De,{})})},dropdown:fe,html:function(e){let{value:t,className:n,mobile:r=!1,isDropdownItem:o=!1}=e;const i=o?"li":"div";return(0,u.jsx)(i,{className:(0,a.A)({navbar__item:!r&&!o,"menu__list-item":r},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:r,...a}=e;const{activeDoc:o}=(0,Be.zK)(r),i=(0,$e.QB)(t,r),l=o?.path===i?.path;return null===i||i.unlisted&&!l?null:(0,u.jsx)(oe,{exact:!0,...a,isActive:()=>l||!!o?.sidebar&&o.sidebar===i.sidebar,label:n??i.id,to:i.path})},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:r,...a}=e;const{activeDoc:o}=(0,Be.zK)(r),i=(0,$e.fW)(t,r).link;if(!i)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return(0,u.jsx)(oe,{exact:!0,...a,isActive:()=>o?.sidebar===t,label:n??i.label,to:i.path})},docsVersion:function(e){let{label:t,to:n,docsPluginId:r,...a}=e;const o=(0,$e.Vd)(r)[0],i=t??o.label,l=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(o).path;return(0,u.jsx)(oe,{...a,label:i,to:l})},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:r,dropdownItemsBefore:a,dropdownItemsAfter:o,...i}=e;const{search:c,hash:d}=(0,l.zy)(),p=(0,Be.zK)(n),f=(0,Be.jh)(n),{savePreferredVersionName:h}=(0,Ue.g1)(n),m=[...a,...f.map((e=>{const t=p.alternateDocVersions[e.name]??He(e);return{label:e.label,to:`${t.path}${c}${d}`,isActive:()=>e===p.activeVersion,onClick:()=>h(e.name)}})),...o],g=(0,$e.Vd)(n)[0],y=t&&m.length>1?(0,s.T)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):g.label,b=t&&m.length>1?void 0:He(g).path;return m.length<=1?(0,u.jsx)(oe,{...i,mobile:t,label:y,to:b,isActive:r?()=>!1:void 0}):(0,u.jsx)(fe,{...i,mobile:t,label:y,to:b,items:m,isActive:r?()=>!1:void 0})}};function Ve(e){let{type:t,...n}=e;const r=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),a=We[r];if(!a)throw new Error(`No NavbarItem component found for type "${t}".`);return(0,u.jsx)(a,{...n})}function qe(){const e=(0,N.M)(),t=(0,w.p)().navbar.items;return(0,u.jsx)("ul",{className:"menu__list",children:t.map(((t,n)=>(0,r.createElement)(Ve,{mobile:!0,...t,onClick:()=>e.toggle(),key:n})))})}function Ge(e){return(0,u.jsx)("button",{...e,type:"button",className:"clean-btn navbar-sidebar__back",children:(0,u.jsx)(s.A,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)",children:"\u2190 Back to main menu"})})}function Ke(){const e=0===(0,w.p)().navbar.items.length,t=M();return(0,u.jsxs)(u.Fragment,{children:[!e&&(0,u.jsx)(Ge,{onClick:()=>t.hide()}),t.content]})}function Ye(){const e=(0,N.M)();var t;return void 0===(t=e.shown)&&(t=!0),(0,r.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?(0,u.jsx)(D,{header:(0,u.jsx)(Q,{}),primaryMenu:(0,u.jsx)(qe,{}),secondaryMenu:(0,u.jsx)(Ke,{})}):null}const Qe={navbarHideable:"navbarHideable_Bm2L",navbarHidden:"navbarHidden_e6Mv"};function Ze(e){return(0,u.jsx)("div",{role:"presentation",...e,className:(0,a.A)("navbar-sidebar__backdrop",e.className)})}function Xe(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:o}}=(0,w.p)(),i=(0,N.M)(),{navbarRef:l,isNavbarVisible:d}=function(e){const[t,n]=(0,r.useState)(e),a=(0,r.useRef)(!1),o=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(o.current=e.getBoundingClientRect().height)}),[]);return(0,L.Mq)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i=l?n(!1):i+c{if(!e)return;const r=t.location.hash;if(r?document.getElementById(r.substring(1)):void 0)return a.current=!0,void n(!1);n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return(0,u.jsxs)("nav",{ref:l,"aria-label":(0,s.T)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,a.A)("navbar","navbar--fixed-top",n&&[Qe.navbarHideable,!d&&Qe.navbarHidden],{"navbar--dark":"dark"===o,"navbar--primary":"primary"===o,"navbar-sidebar--show":i.shown}),children:[t,(0,u.jsx)(Ze,{onClick:i.toggle}),(0,u.jsx)(Ye,{})]})}var Je=n(1887);const et={errorBoundaryError:"errorBoundaryError_PDGB",errorBoundaryFallback:"errorBoundaryFallback_CQoQ"};function tt(e){return(0,u.jsx)("button",{type:"button",...e,children:(0,u.jsx)(s.A,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again rendering when the React error boundary captures an error",children:"Try again"})})}function nt(e){let{error:t}=e;const n=(0,Je.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,u.jsx)("p",{className:et.errorBoundaryError,children:n})}class rt extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const at="right";function ot(e){let{width:t=30,height:n=30,className:r,...a}=e;return(0,u.jsx)("svg",{className:r,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true",...a,children:(0,u.jsx)("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"})})}function it(){const{toggle:e,shown:t}=(0,N.M)();return(0,u.jsx)("button",{onClick:e,"aria-label":(0,s.T)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button",children:(0,u.jsx)(ot,{})})}const lt={colorModeToggle:"colorModeToggle_LBc1"};function st(e){let{items:t}=e;return(0,u.jsx)(u.Fragment,{children:t.map(((e,t)=>(0,u.jsx)(rt,{onError:t=>new Error(`A theme navbar item failed to render.\nPlease double-check the following navbar item (themeConfig.navbar.items) of your Docusaurus config:\n${JSON.stringify(e,null,2)}`,{cause:t}),children:(0,u.jsx)(Ve,{...e})},t)))})}function ct(e){let{left:t,right:n}=e;return(0,u.jsxs)("div",{className:"navbar__inner",children:[(0,u.jsx)("div",{className:"navbar__items",children:t}),(0,u.jsx)("div",{className:"navbar__items navbar__items--right",children:n})]})}function ut(){const e=(0,N.M)(),t=(0,w.p)().navbar.items,[n,r]=function(e){function t(e){return"left"===(e.position??at)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),a=t.find((e=>"search"===e.type));return(0,u.jsx)(ct,{left:(0,u.jsxs)(u.Fragment,{children:[!e.disabled&&(0,u.jsx)(it,{}),(0,u.jsx)(K,{}),(0,u.jsx)(st,{items:n})]}),right:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(st,{items:r}),(0,u.jsx)(q,{className:lt.colorModeToggle}),!a&&(0,u.jsx)(ze,{children:(0,u.jsx)(De,{})})]})})}function dt(){return(0,u.jsx)(Xe,{children:(0,u.jsx)(ut,{})})}function pt(e){let{item:t}=e;const{to:n,href:r,label:a,prependBaseUrlToHref:o,...i}=t,l=(0,X.Ay)(n),s=(0,X.Ay)(r,{forcePrependBaseUrl:!0});return(0,u.jsxs)(Z.A,{className:"footer__link-item",...r?{href:o?s:r}:{to:l},...i,children:[a,r&&!(0,J.A)(r)&&(0,u.jsx)(te.A,{})]})}function ft(e){let{item:t}=e;return t.html?(0,u.jsx)("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):(0,u.jsx)("li",{className:"footer__item",children:(0,u.jsx)(pt,{item:t})},t.href??t.to)}function ht(e){let{column:t}=e;return(0,u.jsxs)("div",{className:"col footer__col",children:[(0,u.jsx)("div",{className:"footer__title",children:t.title}),(0,u.jsx)("ul",{className:"footer__items clean-list",children:t.items.map(((e,t)=>(0,u.jsx)(ft,{item:e},t)))})]})}function mt(e){let{columns:t}=e;return(0,u.jsx)("div",{className:"row footer__links",children:t.map(((e,t)=>(0,u.jsx)(ht,{column:e},t)))})}function gt(){return(0,u.jsx)("span",{className:"footer__link-separator",children:"\xb7"})}function yt(e){let{item:t}=e;return t.html?(0,u.jsx)("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):(0,u.jsx)(pt,{item:t})}function bt(e){let{links:t}=e;return(0,u.jsx)("div",{className:"footer__links text--center",children:(0,u.jsx)("div",{className:"footer__links",children:t.map(((e,n)=>(0,u.jsxs)(r.Fragment,{children:[(0,u.jsx)(yt,{item:e}),t.length!==n+1&&(0,u.jsx)(gt,{})]},n)))})})}function vt(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?(0,u.jsx)(mt,{columns:t}):(0,u.jsx)(bt,{links:t})}var wt=n(1715);const xt={footerLogoLink:"footerLogoLink_H73O"};function kt(e){let{logo:t}=e;const{withBaseUrl:n}=(0,X.hH)(),r={light:n(t.src),dark:n(t.srcDark??t.src)};return(0,u.jsx)(wt.A,{className:(0,a.A)("footer__logo",t.className),alt:t.alt,sources:r,width:t.width,height:t.height,style:t.style})}function St(e){let{logo:t}=e;return t.href?(0,u.jsx)(Z.A,{href:t.href,className:xt.footerLogoLink,target:t.target,children:(0,u.jsx)(kt,{logo:t})}):(0,u.jsx)(kt,{logo:t})}function Et(e){let{copyright:t}=e;return(0,u.jsx)("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function _t(e){let{style:t,links:n,logo:r,copyright:o}=e;return(0,u.jsx)("footer",{className:(0,a.A)("footer",{"footer--dark":"dark"===t}),children:(0,u.jsxs)("div",{className:"container container-fluid",children:[n,(r||o)&&(0,u.jsxs)("div",{className:"footer__bottom text--center",children:[r&&(0,u.jsx)("div",{className:"margin-bottom--sm",children:r}),o]})]})})}function Ct(){const{footer:e}=(0,w.p)();if(!e)return null;const{copyright:t,links:n,logo:r,style:a}=e;return(0,u.jsx)(_t,{style:a,links:n&&n.length>0&&(0,u.jsx)(vt,{links:n}),logo:r&&(0,u.jsx)(St,{logo:r}),copyright:t&&(0,u.jsx)(Et,{copyright:t})})}const Tt=r.memo(Ct),At=(0,O.fM)([F.a,x.o,L.Tv,Ue.VQ,i.Jx,function(e){let{children:t}=e;return(0,u.jsx)(P.y_,{children:(0,u.jsx)(N.e,{children:(0,u.jsx)(R,{children:t})})})}]);function Nt(e){let{children:t}=e;return(0,u.jsx)(At,{children:t})}var Lt=n(9663);function Ot(e){let{error:t,tryAgain:n}=e;return(0,u.jsx)("main",{className:"container margin-vert--xl",children:(0,u.jsx)("div",{className:"row",children:(0,u.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,u.jsx)(Lt.A,{as:"h1",className:"hero__title",children:(0,u.jsx)(s.A,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed",children:"This page crashed."})}),(0,u.jsx)("div",{className:"margin-vert--lg",children:(0,u.jsx)(tt,{onClick:n,className:"button button--primary shadow--lw"})}),(0,u.jsx)("hr",{}),(0,u.jsx)("div",{className:"margin-vert--md",children:(0,u.jsx)(nt,{error:t})})]})})})}const Pt={mainWrapper:"mainWrapper_SYWr"};function jt(e){const{children:t,noFooter:n,wrapperClassName:r,title:l,description:s}=e;return(0,y.J)(),(0,u.jsxs)(Nt,{children:[(0,u.jsx)(i.be,{title:l,description:s}),(0,u.jsx)(v,{}),(0,u.jsx)(A,{}),(0,u.jsx)(dt,{}),(0,u.jsx)("div",{id:d,className:(0,a.A)(g.G.wrapper.main,Pt.mainWrapper,r),children:(0,u.jsx)(o.A,{fallback:e=>(0,u.jsx)(Ot,{...e}),children:t})}),!n&&(0,u.jsx)(Tt,{})]})}},1240:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});n(758);var r=n(8257),a=n(1958),o=n(8765),i=n(8949),l=n(1715),s=n(6070);function c(e){let{logo:t,alt:n,imageClassName:r}=e;const o={light:(0,a.Ay)(t.src),dark:(0,a.Ay)(t.srcDark||t.src)},i=(0,s.jsx)(l.A,{className:t.className,sources:o,height:t.height,width:t.width,alt:n,style:t.style});return r?(0,s.jsx)("div",{className:r,children:i}):i}function u(e){const{siteConfig:{title:t}}=(0,o.A)(),{navbar:{title:n,logo:l}}=(0,i.p)(),{imageClassName:u,titleClassName:d,...p}=e,f=(0,a.Ay)(l?.href||"/"),h=n?"":t,m=l?.alt??h;return(0,s.jsxs)(r.A,{to:f,...p,...l?.target&&{target:l.target},children:[l&&(0,s.jsx)(c,{logo:l,alt:m,imageClassName:u}),null!=n&&(0,s.jsx)("b",{className:d,children:n})]})}},2622:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});n(758);var r=n(5463),a=n(6070);function o(e){let{locale:t,version:n,tag:o}=e;const i=t;return(0,a.jsxs)(r.A,{children:[t&&(0,a.jsx)("meta",{name:"docusaurus_locale",content:t}),n&&(0,a.jsx)("meta",{name:"docusaurus_version",content:n}),o&&(0,a.jsx)("meta",{name:"docusaurus_tag",content:o}),i&&(0,a.jsx)("meta",{name:"docsearch:language",content:i}),n&&(0,a.jsx)("meta",{name:"docsearch:version",content:n}),o&&(0,a.jsx)("meta",{name:"docsearch:docusaurus_tag",content:o})]})}},1715:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});var r=n(758),a=n(3526),o=n(4272),i=n(1382);const l={themedComponent:"themedComponent_oBnk","themedComponent--light":"themedComponent--light_mXU6","themedComponent--dark":"themedComponent--dark_prkl"};var s=n(6070);function c(e){let{className:t,children:n}=e;const c=(0,o.A)(),{colorMode:u}=(0,i.G)();return(0,s.jsx)(s.Fragment,{children:(c?"dark"===u?["dark"]:["light"]:["light","dark"]).map((e=>{const o=n({theme:e,className:(0,a.A)(t,l.themedComponent,l[`themedComponent--${e}`])});return(0,s.jsx)(r.Fragment,{children:o},e)}))})}function u(e){const{sources:t,className:n,alt:r,...a}=e;return(0,s.jsx)(c,{className:n,children:e=>{let{theme:n,className:o}=e;return(0,s.jsx)("img",{src:t[n],alt:r,className:o,...a})}})}},1661:(e,t,n)=>{"use strict";n.d(t,{N:()=>y,u:()=>c});var r=n(758),a=n(9902),o=n(9700),i=n(2838),l=n(6070);const s="ease-in-out";function c(e){let{initialState:t}=e;const[n,a]=(0,r.useState)(t??!1),o=(0,r.useCallback)((()=>{a((e=>!e))}),[]);return{collapsed:n,setCollapsed:a,toggleCollapsed:o}}const u={display:"none",overflow:"hidden",height:"0px"},d={display:"block",overflow:"visible",height:"auto"};function p(e,t){const n=t?u:d;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function f(e){let{collapsibleRef:t,collapsed:n,animation:a}=e;const o=(0,r.useRef)(!1);(0,r.useEffect)((()=>{const e=t.current;function r(){const t=e.scrollHeight,n=a?.duration??function(e){if((0,i.O)())return 1;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${a?.easing??s}`,height:`${t}px`}}function l(){const t=r();e.style.transition=t.transition,e.style.height=t.height}if(!o.current)return p(e,n),void(o.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(l(),requestAnimationFrame((()=>{e.style.height=u.height,e.style.overflow=u.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{l()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,a])}function h(e){if(!a.A.canUseDOM)return e?u:d}function m(e){let{as:t="div",collapsed:n,children:a,animation:o,onCollapseTransitionEnd:i,className:s,disableSSRStyle:c}=e;const u=(0,r.useRef)(null);return f({collapsibleRef:u,collapsed:n,animation:o}),(0,l.jsx)(t,{ref:u,style:c?void 0:h(n),onTransitionEnd:e=>{"height"===e.propertyName&&(p(u.current,n),i?.(n))},className:s,children:a})}function g(e){let{collapsed:t,...n}=e;const[a,i]=(0,r.useState)(!t),[s,c]=(0,r.useState)(t);return(0,o.A)((()=>{t||i(!0)}),[t]),(0,o.A)((()=>{a&&c(t)}),[a,t]),a?(0,l.jsx)(m,{...n,collapsed:s}):null}function y(e){let{lazy:t,...n}=e;const r=t?g:m;return(0,l.jsx)(r,{...n})}},42:(e,t,n)=>{"use strict";n.d(t,{M:()=>m,o:()=>h});var r=n(758),a=n(4272),o=n(2180),i=n(1495),l=n(8949),s=n(6070);const c=(0,o.Wf)("docusaurus.announcement.dismiss"),u=(0,o.Wf)("docusaurus.announcement.id"),d=()=>"true"===c.get(),p=e=>c.set(String(e)),f=r.createContext(null);function h(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,l.p)(),t=(0,a.A)(),[n,o]=(0,r.useState)((()=>!!t&&d()));(0,r.useEffect)((()=>{o(d())}),[]);const i=(0,r.useCallback)((()=>{p(!0),o(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=u.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;u.set(t),r&&p(!1),!r&&d()||o(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return(0,s.jsx)(f.Provider,{value:n,children:t})}function m(){const e=(0,r.useContext)(f);if(!e)throw new i.dV("AnnouncementBarProvider");return e}},1382:(e,t,n)=>{"use strict";n.d(t,{G:()=>y,a:()=>g});var r=n(758),a=n(9902),o=n(1495),i=n(2180),l=n(8949),s=n(6070);const c=r.createContext(void 0),u="theme",d=(0,i.Wf)(u),p={light:"light",dark:"dark"},f=e=>e===p.dark?p.dark:p.light,h=e=>a.A.canUseDOM?f(document.documentElement.getAttribute("data-theme")):f(e),m=e=>{d.set(f(e))};function g(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,l.p)(),[a,o]=(0,r.useState)(h(e));(0,r.useEffect)((()=>{t&&d.del()}),[t]);const i=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:a=!0}=r;t?(o(t),a&&m(t)):(o(n?window.matchMedia("(prefers-color-scheme: dark)").matches?p.dark:p.light:e),d.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",f(a))}),[a]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==u)return;const t=d.get();null!==t&&i(f(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,i]);const s=(0,r.useRef)(!1);return(0,r.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),r=()=>{window.matchMedia("print").matches||s.current?s.current=window.matchMedia("print").matches:i(null)};return e.addListener(r),()=>e.removeListener(r)}),[i,t,n]),(0,r.useMemo)((()=>({colorMode:a,setColorMode:i,get isDarkTheme(){return a===p.dark},setLightTheme(){i(p.light)},setDarkTheme(){i(p.dark)}})),[a,i])}();return(0,s.jsx)(c.Provider,{value:n,children:t})}function y(){const e=(0,r.useContext)(c);if(null==e)throw new o.dV("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},6804:(e,t,n)=>{"use strict";n.d(t,{VQ:()=>y,XK:()=>w,g1:()=>v});var r=n(758),a=n(2907),o=n(76),i=n(8949),l=n(3766),s=n(1495),c=n(2180),u=n(6070);const d=e=>`docs-preferred-version-${e}`,p={save:(e,t,n)=>{(0,c.Wf)(d(e),{persistence:t}).set(n)},read:(e,t)=>(0,c.Wf)(d(e),{persistence:t}).get(),clear:(e,t)=>{(0,c.Wf)(d(e),{persistence:t}).del()}},f=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const h=r.createContext(null);function m(){const e=(0,a.Gy)(),t=(0,i.p)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[o,l]=(0,r.useState)((()=>f(n)));(0,r.useEffect)((()=>{l(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function a(e){const t=p.read(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(p.clear(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,a(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[o,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){p.save(e,t,n),l((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function g(e){let{children:t}=e;const n=m();return(0,u.jsx)(h.Provider,{value:n,children:t})}function y(e){let{children:t}=e;return l.C5?(0,u.jsx)(g,{children:t}):(0,u.jsx)(u.Fragment,{children:t})}function b(){const e=(0,r.useContext)(h);if(!e)throw new s.dV("DocsPreferredVersionContextProvider");return e}function v(e){void 0===e&&(e=o.W);const t=(0,a.ht)(e),[n,i]=b(),{preferredVersionName:l}=n[e];return{preferredVersion:t.versions.find((e=>e.name===l))??null,savePreferredVersionName:(0,r.useCallback)((t=>{i.savePreferredVersion(e,t)}),[i,e])}}function w(){const e=(0,a.Gy)(),[t]=b();function n(n){const r=e[n],{preferredVersionName:a}=t[n];return r.versions.find((e=>e.name===a))??null}const r=Object.keys(e);return Object.fromEntries(r.map((e=>[e,n(e)])))}},2987:(e,t,n)=>{"use strict";n.d(t,{V:()=>s,t:()=>c});var r=n(758),a=n(1495),o=n(6070);const i=Symbol("EmptyContext"),l=r.createContext(i);function s(e){let{children:t,name:n,items:a}=e;const i=(0,r.useMemo)((()=>n&&a?{name:n,items:a}:null),[n,a]);return(0,o.jsx)(l.Provider,{value:i,children:t})}function c(){const e=(0,r.useContext)(l);if(e===i)throw new a.dV("DocsSidebarProvider");return e}},8051:(e,t,n)=>{"use strict";n.d(t,{n:()=>l,r:()=>s});var r=n(758),a=n(1495),o=n(6070);const i=r.createContext(null);function l(e){let{children:t,version:n}=e;return(0,o.jsx)(i.Provider,{value:n,children:t})}function s(){const e=(0,r.useContext)(i);if(null===e)throw new a.dV("DocsVersionProvider");return e}},8650:(e,t,n)=>{"use strict";n.d(t,{M:()=>f,e:()=>p});var r=n(758),a=n(6083),o=n(3104),i=n(9782),l=n(8949),s=n(1495),c=n(6070);const u=r.createContext(void 0);function d(){const e=function(){const e=(0,a.YL)(),{items:t}=(0,l.p)().navbar;return 0===t.length&&!e.component}(),t=(0,o.l)(),n=!e&&"mobile"===t,[s,c]=(0,r.useState)(!1);(0,i.$Z)((()=>{if(s)return c(!1),!1}));const u=(0,r.useCallback)((()=>{c((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&c(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:u,shown:s})),[e,n,u,s])}function p(e){let{children:t}=e;const n=d();return(0,c.jsx)(u.Provider,{value:n,children:t})}function f(){const e=r.useContext(u);if(void 0===e)throw new s.dV("NavbarMobileSidebarProvider");return e}},6083:(e,t,n)=>{"use strict";n.d(t,{GX:()=>c,YL:()=>s,y_:()=>l});var r=n(758),a=n(1495),o=n(6070);const i=r.createContext(null);function l(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return(0,o.jsx)(i.Provider,{value:n,children:t})}function s(){const e=(0,r.useContext)(i);if(!e)throw new a.dV("NavbarSecondaryMenuContentProvider");return e[0]}function c(e){let{component:t,props:n}=e;const o=(0,r.useContext)(i);if(!o)throw new a.dV("NavbarSecondaryMenuContentProvider");const[,l]=o,s=(0,a.Be)(n);return(0,r.useEffect)((()=>{l({component:t,props:s})}),[l,t,s]),(0,r.useEffect)((()=>()=>l({component:null,props:null})),[l]),null}},6860:(e,t,n)=>{"use strict";n.d(t,{w:()=>a,J:()=>o});var r=n(758);const a="navigation-with-keyboard";function o(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(a),"mousedown"===e.type&&document.body.classList.remove(a)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(a),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},2062:(e,t,n)=>{"use strict";n.d(t,{b:()=>l,w:()=>s});var r=n(758),a=n(8765),o=n(9782);const i="q";function l(){return(0,o.l)(i)}function s(){const{siteConfig:{baseUrl:e,themeConfig:t}}=(0,a.A)(),{algolia:{searchPagePath:n}}=t;return(0,r.useCallback)((t=>`${e}${n}?${i}=${encodeURIComponent(t)}`),[e,n])}},3104:(e,t,n)=>{"use strict";n.d(t,{l:()=>l});var r=n(758),a=n(9902);const o={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function l(e){let{desktopBreakpoint:t=i}=void 0===e?{}:e;const[n,l]=(0,r.useState)((()=>"ssr"));return(0,r.useEffect)((()=>{function e(){l(function(e){if(!a.A.canUseDOM)throw new Error("getWindowSize() should only be called after React hydration");return window.innerWidth>e?o.desktop:o.mobile}(t))}return e(),window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}}),[t]),n}},2702:(e,t,n)=>{"use strict";n.d(t,{G:()=>r});const r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",unlistedBanner:"theme-unlisted-banner",admonitionType:e=>`theme-admonition-${e}`},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>`theme-doc-sidebar-item-category-level-${e}`,docSidebarItemLinkLevel:e=>`theme-doc-sidebar-item-link-level-${e}`},blog:{blogFooterTagsRow:"theme-blog-footer-tags-row",blogFooterEditMetaRow:"theme-blog-footer-edit-meta-row"},pages:{pageFooterEditMetaRow:"theme-pages-footer-edit-meta-row"}}},2838:(e,t,n)=>{"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{O:()=>r})},3766:(e,t,n)=>{"use strict";n.d(t,{Nr:()=>f,w8:()=>g,C5:()=>p,B5:()=>E,Vd:()=>x,QB:()=>S,fW:()=>k,OF:()=>w,Y:()=>b});var r=n(758),a=n(5557),o=n(1977),i=n(2907),l=n(6804),s=n(8051),c=n(2987);function u(e){return Array.from(new Set(e))}var d=n(428);const p=!!i.Gy;function f(e){return"link"!==e.type||e.unlisted?"category"===e.type?function(e){if(e.href&&!e.linkUnlisted)return e.href;for(const t of e.items){const e=f(t);if(e)return e}}(e):void 0:e.href}const h=(e,t)=>void 0!==e&&(0,d.ys)(e,t),m=(e,t)=>e.some((e=>g(e,t)));function g(e,t){return"link"===e.type?h(e.href,t):"category"===e.type&&(h(e.href,t)||m(e.items,t))}function y(e,t){switch(e.type){case"category":return g(e,t)||e.items.some((e=>y(e,t)));case"link":return!e.unlisted||g(e,t);default:return!0}}function b(e,t){return(0,r.useMemo)((()=>e.filter((e=>y(e,t)))),[e,t])}function v(e){let{sidebarItems:t,pathname:n,onlyCategories:r=!1}=e;const a=[];return function e(t){for(const o of t)if("category"===o.type&&((0,d.ys)(o.href,n)||e(o.items))||"link"===o.type&&(0,d.ys)(o.href,n)){return r&&"category"!==o.type||a.unshift(o),!0}return!1}(t),a}function w(){const e=(0,c.t)(),{pathname:t}=(0,a.zy)(),n=(0,i.vT)()?.pluginData.breadcrumbs;return!1!==n&&e?v({sidebarItems:e.items,pathname:t}):null}function x(e){const{activeVersion:t}=(0,i.zK)(e),{preferredVersion:n}=(0,l.g1)(e),a=(0,i.r7)(e);return(0,r.useMemo)((()=>u([t,n,a].filter(Boolean))),[t,n,a])}function k(e,t){const n=x(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),r=t.find((t=>t[0]===e));if(!r)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\nAvailable sidebar ids are:\n- ${t.map((e=>e[0])).join("\n- ")}`);return r[1]}),[e,n])}function S(e,t){const n=x(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),r=t.find((t=>t.id===e));if(!r){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error(`Couldn't find any doc with id "${e}" in version${n.length>1?"s":""} "${n.map((e=>e.name)).join(", ")}".\nAvailable doc ids are:\n- ${u(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function E(e){let{route:t}=e;const n=(0,a.zy)(),r=(0,s.r)(),i=t.routes,l=i.find((e=>(0,a.B6)(n.pathname,e)));if(!l)return null;const c=l.sidebar,u=c?r.docsSidebars[c]:void 0;return{docElement:(0,o.v)(i),sidebarName:c,sidebarItems:u}}},4574:(e,t,n)=>{"use strict";n.d(t,{s:()=>a});var r=n(8765);function a(e){const{siteConfig:t}=(0,r.A)(),{title:n,titleDelimiter:a}=t;return e?.trim().length?`${e.trim()} ${a} ${n}`:n}},9782:(e,t,n)=>{"use strict";n.d(t,{$Z:()=>i,l:()=>s});var r=n(758),a=n(5557),o=n(1495);function i(e){!function(e){const t=(0,a.W6)(),n=(0,o._q)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}function l(e){const t=(0,a.W6)();return(0,r.useSyncExternalStore)(t.listen,(()=>e(t)),(()=>e(t)))}function s(e){const t=function(e){return l((t=>null===e?null:new URLSearchParams(t.location.search).get(e)))}(e)??"",n=function(e){const t=(0,a.W6)();return(0,r.useCallback)(((n,r)=>{const a=new URLSearchParams(t.location.search);n?a.set(e,n):a.delete(e),(r?.push?t.push:t.replace)({search:a.toString()})}),[e,t])}(e);return[t,n]}},2667:(e,t,n)=>{"use strict";n.d(t,{e3:()=>f,be:()=>d,Jx:()=>h});var r=n(758),a=n(3526),o=n(5463),i=n(7281);function l(){const e=r.useContext(i.o);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var s=n(1958),c=n(4574),u=n(6070);function d(e){let{title:t,description:n,keywords:r,image:a,children:i}=e;const l=(0,c.s)(t),{withBaseUrl:d}=(0,s.hH)(),p=a?d(a,{absolute:!0}):void 0;return(0,u.jsxs)(o.A,{children:[t&&(0,u.jsx)("title",{children:l}),t&&(0,u.jsx)("meta",{property:"og:title",content:l}),n&&(0,u.jsx)("meta",{name:"description",content:n}),n&&(0,u.jsx)("meta",{property:"og:description",content:n}),r&&(0,u.jsx)("meta",{name:"keywords",content:Array.isArray(r)?r.join(","):r}),p&&(0,u.jsx)("meta",{property:"og:image",content:p}),p&&(0,u.jsx)("meta",{name:"twitter:image",content:p}),i]})}const p=r.createContext(void 0);function f(e){let{className:t,children:n}=e;const i=r.useContext(p),l=(0,a.A)(i,t);return(0,u.jsxs)(p.Provider,{value:l,children:[(0,u.jsx)(o.A,{children:(0,u.jsx)("html",{className:l})}),n]})}function h(e){let{children:t}=e;const n=l(),r=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const o=`plugin-id-${n.plugin.id}`;return(0,u.jsx)(f,{className:(0,a.A)(r,o),children:t})}},1495:(e,t,n)=>{"use strict";n.d(t,{Be:()=>c,ZC:()=>l,_q:()=>i,dV:()=>s,fM:()=>u});var r=n(758),a=n(9700),o=n(6070);function i(e){const t=(0,r.useRef)(e);return(0,a.A)((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function l(e){const t=(0,r.useRef)();return(0,a.A)((()=>{t.current=e})),t.current}class s extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?\w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function c(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function u(e){return t=>{let{children:n}=t;return(0,o.jsx)(o.Fragment,{children:e.reduceRight(((e,t)=>(0,o.jsx)(t,{children:e})),n)})}}},9409:(e,t,n)=>{"use strict";function r(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}n.d(t,{G:()=>r})},428:(e,t,n)=>{"use strict";n.d(t,{Dt:()=>l,ys:()=>i});var r=n(758),a=n(8218),o=n(8765);function i(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function l(){const{baseUrl:e}=(0,o.A)().siteConfig;return(0,r.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function r(e){return e.path===t&&!0===e.exact}function a(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(a).flatMap((e=>e.routes??[])))}(n)}({routes:a.A,baseUrl:e})),[e])}},3709:(e,t,n)=>{"use strict";n.d(t,{Mq:()=>p,Tv:()=>c,gk:()=>f});var r=n(758),a=n(9902),o=n(4272),i=(n(9700),n(1495)),l=n(6070);const s=r.createContext(void 0);function c(e){let{children:t}=e;const n=function(){const e=(0,r.useRef)(!0);return(0,r.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return(0,l.jsx)(s.Provider,{value:n,children:t})}function u(){const e=(0,r.useContext)(s);if(null==e)throw new i.dV("ScrollControllerProvider");return e}const d=()=>a.A.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function p(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=u(),a=(0,r.useRef)(d()),o=(0,i._q)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=d();o(e,a.current),a.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[o,n,...t])}function f(){const e=(0,r.useRef)(null),t=(0,o.A)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function r(){const a=document.documentElement.scrollTop;(n&&a>e||!n&&at&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},5266:(e,t,n)=>{"use strict";n.d(t,{Cy:()=>i,af:()=>s,tU:()=>l});var r=n(2907),a=n(8765),o=n(6804);const i="default";function l(e,t){return`docs-${e}-${t}`}function s(){const{i18n:e}=(0,a.A)(),t=(0,r.Gy)(),n=(0,r.gk)(),s=(0,o.XK)();const c=[i,...Object.keys(t).map((function(e){const r=n?.activePlugin.pluginId===e?n.activeVersion:void 0,a=s[e],o=t[e].versions.find((e=>e.isLast));return l(e,(r??a??o).name)}))];return{locale:e.currentLocale,tags:c}}},2180:(e,t,n)=>{"use strict";n.d(t,{Wf:()=>c});n(758);const r=JSON.parse('{"N":"localStorage","M":""}'),a=r.N;function o(e){let{key:t,oldValue:n,newValue:r,storage:a}=e;if(n===r)return;const o=document.createEvent("StorageEvent");o.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,a),window.dispatchEvent(o)}function i(e){if(void 0===e&&(e=a),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,l||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),l=!0),null}var t}let l=!1;const s={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function c(e,t){const n=`${e}${r.M}`;if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t,listen:t}}(n);const a=i(t?.persistence);return null===a?s:{get:()=>{try{return a.getItem(n)}catch(e){return console.error(`Docusaurus storage error, can't get key=${n}`,e),null}},set:e=>{try{const t=a.getItem(n);a.setItem(n,e),o({key:n,oldValue:t,newValue:e,storage:a})}catch(t){console.error(`Docusaurus storage error, can't set ${n}=${e}`,t)}},del:()=>{try{const e=a.getItem(n);a.removeItem(n),o({key:n,oldValue:e,newValue:null,storage:a})}catch(e){console.error(`Docusaurus storage error, can't delete key=${n}`,e)}},listen:e=>{try{const t=t=>{t.storageArea===a&&t.key===n&&e(t)};return window.addEventListener("storage",t),()=>window.removeEventListener("storage",t)}catch(t){return console.error(`Docusaurus storage error, can't listen for changes of key=${n}`,t),()=>{}}}}}},5514:(e,t,n)=>{"use strict";n.d(t,{o:()=>i});var r=n(8765),a=n(5557),o=n(1887);function i(){const{siteConfig:{baseUrl:e,url:t,trailingSlash:n},i18n:{defaultLocale:i,currentLocale:l}}=(0,r.A)(),{pathname:s}=(0,a.zy)(),c=(0,o.applyTrailingSlash)(s,{trailingSlash:n,baseUrl:e}),u=l===i?e:e.replace(`/${l}/`,"/"),d=c.replace(e,"");return{createUrl:function(e){let{locale:n,fullyQualified:r}=e;return`${r?t:""}${function(e){return e===i?`${u}`:`${u}${e}/`}(n)}${d}`}}}},3403:(e,t,n)=>{"use strict";n.d(t,{$:()=>i});var r=n(758),a=n(5557),o=n(1495);function i(e){const t=(0,a.zy)(),n=(0,o.ZC)(t),i=(0,o._q)(e);(0,r.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},8949:(e,t,n)=>{"use strict";n.d(t,{p:()=>a});var r=n(8765);function a(){return(0,r.A)().siteConfig.themeConfig}},8923:(e,t,n)=>{"use strict";n.d(t,{c:()=>a});var r=n(8765);function a(){const{siteConfig:{themeConfig:e}}=(0,r.A)();return e}},9447:(e,t,n)=>{"use strict";n.d(t,{C:()=>l});var r=n(758),a=n(9409),o=n(1958),i=n(8923);function l(){const{withBaseUrl:e}=(0,o.hH)(),{algolia:{externalUrlRegex:t,replaceSearchResultPathname:n}}=(0,i.c)();return(0,r.useCallback)((r=>{const o=new URL(r);if((0,a.G)(t,o.href))return r;const i=`${o.pathname+o.hash}`;return e(function(e,t){return t?e.replaceAll(new RegExp(t.from,"g"),t.to):e}(i,n))}),[e,t,n])}},3214:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.removeTrailingSlash=t.addLeadingSlash=t.addTrailingSlash=void 0;const r=n(5329);function a(e){return e.endsWith("/")?e:`${e}/`}function o(e){return(0,r.removeSuffix)(e,"/")}t.addTrailingSlash=a,t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[i]=e.split(/[#?]/),l="/"===i||i===r?i:(s=i,n?a(s):o(s));var s;return e.replace(i,l)},t.addLeadingSlash=function(e){return(0,r.addPrefix)(e,"/")},t.removeTrailingSlash=o},820:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=void 0,t.getErrorCausalChain=function e(t){return t.cause?[t,...e(t.cause)]:[t]}},1887:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=t.removePrefix=t.addSuffix=t.removeSuffix=t.addPrefix=t.removeTrailingSlash=t.addLeadingSlash=t.addTrailingSlash=t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="__blog-post-container";var a=n(3214);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r(a).default}}),Object.defineProperty(t,"addTrailingSlash",{enumerable:!0,get:function(){return a.addTrailingSlash}}),Object.defineProperty(t,"addLeadingSlash",{enumerable:!0,get:function(){return a.addLeadingSlash}}),Object.defineProperty(t,"removeTrailingSlash",{enumerable:!0,get:function(){return a.removeTrailingSlash}});var o=n(5329);Object.defineProperty(t,"addPrefix",{enumerable:!0,get:function(){return o.addPrefix}}),Object.defineProperty(t,"removeSuffix",{enumerable:!0,get:function(){return o.removeSuffix}}),Object.defineProperty(t,"addSuffix",{enumerable:!0,get:function(){return o.addSuffix}}),Object.defineProperty(t,"removePrefix",{enumerable:!0,get:function(){return o.removePrefix}});var i=n(820);Object.defineProperty(t,"getErrorCausalChain",{enumerable:!0,get:function(){return i.getErrorCausalChain}})},5329:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.removePrefix=t.addSuffix=t.removeSuffix=t.addPrefix=void 0,t.addPrefix=function(e,t){return e.startsWith(t)?e:`${t}${e}`},t.removeSuffix=function(e,t){return""===t?e:e.endsWith(t)?e.slice(0,-t.length):e},t.addSuffix=function(e,t){return e.endsWith(t)?e:`${e}${t}`},t.removePrefix=function(e,t){return e.startsWith(t)?e.slice(t.length):e}},3332:(e,t,n)=>{"use strict";n.d(t,{zR:()=>w,TM:()=>C,yJ:()=>f,sC:()=>A,AO:()=>p});var r=n(5265);function a(e){return"/"===e.charAt(0)}function o(e,t){for(var n=t,r=n+1,a=e.length;r=0;p--){var f=i[p];"."===f?o(i,p):".."===f?(o(i,p),d++):d&&(o(i,p),d--)}if(!c)for(;d--;d)i.unshift("..");!c||""===i[0]||i[0]&&a(i[0])||i.unshift("");var h=i.join("/");return n&&"/"!==h.substr(-1)&&(h+="/"),h};var l=n(5385);function s(e){return"/"===e.charAt(0)?e:"/"+e}function c(e){return"/"===e.charAt(0)?e.substr(1):e}function u(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function d(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function p(e){var t=e.pathname,n=e.search,r=e.hash,a=t||"/";return n&&"?"!==n&&(a+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(a+="#"===r.charAt(0)?r:"#"+r),a}function f(e,t,n,a){var o;"string"==typeof e?(o=function(e){var t=e||"/",n="",r="",a=t.indexOf("#");-1!==a&&(r=t.substr(a),t=t.substr(0,a));var o=t.indexOf("?");return-1!==o&&(n=t.substr(o),t=t.substr(0,o)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),o.state=t):(void 0===(o=(0,r.A)({},e)).pathname&&(o.pathname=""),o.search?"?"!==o.search.charAt(0)&&(o.search="?"+o.search):o.search="",o.hash?"#"!==o.hash.charAt(0)&&(o.hash="#"+o.hash):o.hash="",void 0!==t&&void 0===o.state&&(o.state=t));try{o.pathname=decodeURI(o.pathname)}catch(l){throw l instanceof URIError?new URIError('Pathname "'+o.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):l}return n&&(o.key=n),a?o.pathname?"/"!==o.pathname.charAt(0)&&(o.pathname=i(o.pathname,a.pathname)):o.pathname=a.pathname:o.pathname||(o.pathname="/"),o}function h(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,a){if(null!=e){var o="function"==typeof e?e(t,n):e;"string"==typeof o?"function"==typeof r?r(o,a):a(!0):a(!1!==o)}else a(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;rt?n.splice(t,n.length-t,a):n.push(a),d({action:r,location:a,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",a=f(e,t,m(),w.location);u.confirmTransitionTo(a,r,n,(function(e){e&&(w.entries[w.index]=a,d({action:r,location:a}))}))},go:v,goBack:function(){v(-1)},goForward:function(){v(1)},canGo:function(e){var t=w.index+e;return t>=0&&t{"use strict";var r=n(5959),a={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},o={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},l={};function s(e){return r.isMemo(e)?i:l[e.$$typeof]||a}l[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},l[r.Memo]=i;var c=Object.defineProperty,u=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,p=Object.getOwnPropertyDescriptor,f=Object.getPrototypeOf,h=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(h){var a=f(n);a&&a!==h&&e(t,a,r)}var i=u(n);d&&(i=i.concat(d(n)));for(var l=s(t),m=s(n),g=0;g{"use strict";e.exports=function(e,t,n,r,a,o,i,l){if(!e){var s;if(void 0===t)s=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var c=[n,r,a,o,i,l],u=0;(s=new Error(t.replace(/%s/g,(function(){return c[u++]})))).name="Invariant Violation"}throw s.framesToPop=1,s}}},5526:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},6267:(e,t,n)=>{"use strict";n.r(t)},3533:(e,t,n)=>{"use strict";n.r(t)},8744:function(e,t,n){var r,a;r=function(){var e,t,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'
'};function a(e,t,n){return en?n:e}function o(e){return 100*(-1+e)}function i(e,t,n){var a;return(a="translate3d"===r.positionUsing?{transform:"translate3d("+o(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+o(e)+"%,0)"}:{"margin-left":o(e)+"%"}).transition="all "+t+"ms "+n,a}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=a(e,r.minimum,1),n.status=1===e?null:e;var o=n.render(!t),c=o.querySelector(r.barSelector),u=r.speed,d=r.easing;return o.offsetWidth,l((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),s(c,i(e,u,d)),1===e?(s(o,{transition:"none",opacity:1}),o.offsetWidth,setTimeout((function(){s(o,{transition:"all "+u+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),u)}),u)):setTimeout(t,u)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*a(Math.random()*t,.1,.95)),t=a(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");u(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var a,i=t.querySelector(r.barSelector),l=e?"-100":o(n.status||0),c=document.querySelector(r.parent);return s(i,{transition:"all 0 linear",transform:"translate3d("+l+"%,0,0)"}),r.showSpinner||(a=t.querySelector(r.spinnerSelector))&&f(a),c!=document.body&&u(c,"nprogress-custom-parent"),c.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&f(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var l=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),s=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,a=e.length,o=t.charAt(0).toUpperCase()+t.slice(1);a--;)if((r=e[a]+o)in n)return r;return t}function a(e){return e=n(e),t[e]||(t[e]=r(e))}function o(e,t,n){t=a(t),e.style[t]=n}return function(e,t){var n,r,a=arguments;if(2==a.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&o(e,n,r);else o(e,a[1],a[2])}}();function c(e,t){return("string"==typeof e?e:p(e)).indexOf(" "+t+" ")>=0}function u(e,t){var n=p(e),r=n+t;c(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=p(e);c(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function p(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function f(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(a="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=a)},6150:(e,t,n)=>{var r=n(5526);e.exports=f,e.exports.parse=o,e.exports.compile=function(e,t){return l(o(e,t),t)},e.exports.tokensToFunction=l,e.exports.tokensToRegExp=p;var a=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function o(e,t){for(var n,r=[],o=0,i=0,l="",u=t&&t.delimiter||"/";null!=(n=a.exec(e));){var d=n[0],p=n[1],f=n.index;if(l+=e.slice(i,f),i=f+d.length,p)l+=p[1];else{var h=e[i],m=n[2],g=n[3],y=n[4],b=n[5],v=n[6],w=n[7];l&&(r.push(l),l="");var x=null!=m&&null!=h&&h!==m,k="+"===v||"*"===v,S="?"===v||"*"===v,E=n[2]||u,_=y||b;r.push({name:g||o++,prefix:m||"",delimiter:E,optional:S,repeat:k,partial:x,asterisk:!!w,pattern:_?c(_):w?".*":"[^"+s(E)+"]+?"})}}return i{!function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},r={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?:\.\w+)*(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},parameter:{pattern:/(^|\s)-{1,2}(?:\w+:[+-]?)?\w+(?:\.\w+)*(?=[=\s]|$)/,alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:r},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:r},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:r.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:r.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cargo|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|java|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|sysctl|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var a=["comment","function-name","for-or-select","assign-left","parameter","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=r.variable[1].inside,i=0;i{!function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,a,o){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(a,(function(e){if("function"==typeof o&&!o(e))return e;for(var a,l=i.length;-1!==n.code.indexOf(a=t(r,l));)++l;return i[l]=e,a})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var a=0,o=Object.keys(n.tokenStack);!function i(l){for(var s=0;s=o.length);s++){var c=l[s];if("string"==typeof c||c.content&&"string"==typeof c.content){var u=o[a],d=n.tokenStack[u],p="string"==typeof c?c:c.content,f=t(r,u),h=p.indexOf(f);if(h>-1){++a;var m=p.substring(0,h),g=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),y=p.substring(h+f.length),b=[];m&&b.push.apply(b,i([m])),b.push(g),y&&b.push.apply(b,i([y])),"string"==typeof c?l.splice.apply(l,[s,1].concat(b)):c.content=b}}else c.content&&i(c.content)}return l}(n.tokens)}}}})}(Prism)},6290:()=>{!function(e){var t=/(?:[\w-]+|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*")/.source;function n(e){return e.replace(/__/g,(function(){return t}))}e.languages.toml={comment:{pattern:/#.*/,greedy:!0},table:{pattern:RegExp(n(/(^[\t ]*\[\s*(?:\[\s*)?)__(?:\s*\.\s*__)*(?=\s*\])/.source),"m"),lookbehind:!0,greedy:!0,alias:"class-name"},key:{pattern:RegExp(n(/(^[\t ]*|[{,]\s*)__(?:\s*\.\s*__)*(?=\s*=)/.source),"m"),lookbehind:!0,greedy:!0,alias:"property"},string:{pattern:/"""(?:\\[\s\S]|[^\\])*?"""|'''[\s\S]*?'''|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},date:[{pattern:/\b\d{4}-\d{2}-\d{2}(?:[T\s]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?)?\b/i,alias:"number"},{pattern:/\b\d{2}:\d{2}:\d{2}(?:\.\d+)?\b/,alias:"number"}],number:/(?:\b0(?:x[\da-zA-Z]+(?:_[\da-zA-Z]+)*|o[0-7]+(?:_[0-7]+)*|b[10]+(?:_[10]+)*))\b|[-+]?\b\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?\b|[-+]?\b(?:inf|nan)\b/,boolean:/\b(?:false|true)\b/,punctuation:/[.,=[\]{}]/}}(Prism)},6186:(e,t,n)=>{"use strict";var r=n(2985);function a(){}function o(){}o.resetWarningCache=a,e.exports=function(){function e(e,t,n,a,o,i){if(i!==r){var l=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw l.name="Invariant Violation",l}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:o,resetWarningCache:a};return n.PropTypes=n,n}},2736:(e,t,n)=>{e.exports=n(6186)()},2985:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},9481:(e,t,n)=>{"use strict";var r=n(758),a=n(1896);function o(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n