From 4559de5eb613d5bc85946a900b4a8719a17d543f Mon Sep 17 00:00:00 2001 From: michaelquigley Date: Thu, 25 Jul 2024 17:54:33 +0000 Subject: [PATCH] deploy: 73c46759d7a39766880ed9b90a570621bc6690f6 --- 404.html | 4 +- ...zvous-18053866f55c9d823e96f76f39c20555.png | Bin 0 -> 28840 bytes assets/js/7452427d.29fd1dda.js | 1 + assets/js/7452427d.a21c5833.js | 1 - assets/js/9939c4f4.f1f5b859.js | 1 + ...8dc0f.37e1f8f9.js => d768dc0f.8e1de618.js} | 2 +- assets/js/ea84f538.c90ec1c3.js | 1 - assets/js/ea84f538.d5db2b03.js | 1 + assets/js/ef8afbfd.0ccb2eb2.js | 1 + assets/js/ef8afbfd.3326e0f0.js | 1 - assets/js/main.919bd9e8.js | 2 + ...CENSE.txt => main.919bd9e8.js.LICENSE.txt} | 0 assets/js/main.eed2f346.js | 2 - assets/js/runtime~main.12002ba1.js | 1 - assets/js/runtime~main.ae010639.js | 1 + docs/category/guides/index.html | 6 +-- docs/category/metrics-and-limits/index.html | 6 +-- docs/category/oauth/index.html | 6 +-- docs/category/self-hosting/index.html | 6 +-- docs/concepts/files/index.html | 4 +- docs/concepts/hosting/index.html | 4 +- docs/concepts/http/index.html | 4 +- docs/concepts/index.html | 4 +- docs/concepts/opensource/index.html | 4 +- docs/concepts/sharing-private/index.html | 4 +- docs/concepts/sharing-public/index.html | 4 +- docs/concepts/sharing-reserved/index.html | 4 +- docs/concepts/tunnels/index.html | 4 +- docs/getting-started/index.html | 4 +- .../docker_private_share_guide/index.html | 4 +- .../docker_public_share_guide/index.html | 4 +- docs/guides/docker-share/index.html | 4 +- docs/guides/drives/cli/index.html | 4 +- docs/guides/frontdoor/index.html | 4 +- docs/guides/install/index.html | 4 +- docs/guides/install/linux/index.html | 4 +- docs/guides/install/macos/index.html | 4 +- docs/guides/install/windows/index.html | 4 +- docs/guides/permission-modes/index.html | 4 +- docs/guides/self-hosting/docker/index.html | 6 +-- .../instance-configuration/index.html | 6 +-- .../self-hosting/interstitial-page/index.html | 37 ++++++++++++++++++ docs/guides/self-hosting/linux/index.html | 6 +-- .../self-hosting/linux/nginx/index.html | 8 ++-- .../configuring-limits/index.html | 6 +-- .../configuring-metrics/index.html | 6 +-- .../oauth/configuring-oauth/index.html | 6 +-- .../personalized-frontend/index.html | 8 ++-- docs/guides/vpn/index.html | 4 +- index.html | 4 +- search/index.html | 4 +- sitemap.xml | 2 +- zrok_interstitial_rendezvous.png | Bin 0 -> 28840 bytes 53 files changed, 132 insertions(+), 94 deletions(-) create mode 100644 assets/images/zrok_interstitial_rendezvous-18053866f55c9d823e96f76f39c20555.png create mode 100644 assets/js/7452427d.29fd1dda.js delete mode 100644 assets/js/7452427d.a21c5833.js create mode 100644 assets/js/9939c4f4.f1f5b859.js rename assets/js/{d768dc0f.37e1f8f9.js => d768dc0f.8e1de618.js} (99%) delete mode 100644 assets/js/ea84f538.c90ec1c3.js create mode 100644 assets/js/ea84f538.d5db2b03.js create mode 100644 assets/js/ef8afbfd.0ccb2eb2.js delete mode 100644 assets/js/ef8afbfd.3326e0f0.js create mode 100644 assets/js/main.919bd9e8.js rename assets/js/{main.eed2f346.js.LICENSE.txt => main.919bd9e8.js.LICENSE.txt} (100%) delete mode 100644 assets/js/main.eed2f346.js delete mode 100644 assets/js/runtime~main.12002ba1.js create mode 100644 assets/js/runtime~main.ae010639.js create mode 100644 docs/guides/self-hosting/interstitial-page/index.html create mode 100644 zrok_interstitial_rendezvous.png diff --git a/404.html b/404.html index d294409f..13235ea4 100644 --- a/404.html +++ b/404.html @@ -9,8 +9,8 @@ - - + + diff --git a/assets/images/zrok_interstitial_rendezvous-18053866f55c9d823e96f76f39c20555.png b/assets/images/zrok_interstitial_rendezvous-18053866f55c9d823e96f76f39c20555.png new file mode 100644 index 0000000000000000000000000000000000000000..4830af0d22def81aff5281c0c9b2884462b78021 GIT binary patch literal 28840 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 literal 0 HcmV?d00001 diff --git a/assets/js/7452427d.29fd1dda.js b/assets/js/7452427d.29fd1dda.js new file mode 100644 index 00000000..c584ea2e --- /dev/null +++ b/assets/js/7452427d.29fd1dda.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[4920],{722:(e,o,r)=>{r.r(o),r.d(o,{assets:()=>d,contentTitle:()=>t,default:()=>l,frontMatter:()=>i,metadata:()=>a,toc:()=>c});var n=r(5893),s=r(1151);const i={title:"Personalized Frontend",sidebar_label:"Personalized Frontend",sidebar_position:19},t=void 0,a={id:"guides/self-hosting/personalized-frontend",title:"Personalized Frontend",description:"This guide describes an approach that enables a zrok user to use a hosted, shared instance (zrok.io) and configure their own personalized frontend, which enables custom DNS and TLS for their shares.",source:"@site/../docs/guides/self-hosting/personalized-frontend.md",sourceDirName:"guides/self-hosting",slug:"/guides/self-hosting/personalized-frontend",permalink:"/docs/guides/self-hosting/personalized-frontend",draft:!1,unlisted:!1,editUrl:"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/self-hosting/personalized-frontend.md",tags:[],version:"current",sidebarPosition:19,frontMatter:{title:"Personalized Frontend",sidebar_label:"Personalized Frontend",sidebar_position:19},sidebar:"tutorialSidebar",previous:{title:"Interstitial Pages",permalink:"/docs/guides/self-hosting/interstitial-page"},next:{title:"Docker",permalink:"/docs/guides/self-hosting/docker"}},d={},c=[{value:"Overview",id:"overview",level:2},{value:"Privacy",id:"privacy",level:2}];function h(e){const o={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",img:"img",p:"p",pre:"pre",...(0,s.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.p,{children:"This guide describes an approach that enables a zrok user to use a hosted, shared instance (zrok.io) and configure their own personalized frontend, which enables custom DNS and TLS for their shares."}),"\n",(0,n.jsx)(o.p,{children:"In order to accomplish this, the user will need to provide their own minimal VPS instance, or container hosting. The size and capacity of these resources will be entirely dependent on the workload that they will be used to service. But generally, for most modest workloads, the most inexpensive VPS option will suffice."}),"\n",(0,n.jsx)(o.p,{children:"This approach gives you complete control over the way that your shares are exposed publicly. This approach works for HTTPS shares, and also for TCP and UDP ports, allowing you to put all of these things onto the public internet, while maintaining strong security for your protected resources."}),"\n",(0,n.jsxs)(o.p,{children:["This guide isn't a detailed ",(0,n.jsx)(o.em,{children:"how to"})," with specific steps to follow. This is more of a description of the overall concept. You'll want to figure out your own specific steps to implement this style of deployment in your own environment."]}),"\n",(0,n.jsx)(o.h2,{id:"overview",children:"Overview"}),"\n",(0,n.jsxs)(o.p,{children:["Let's imagine a hypothetical scenario where you've got 3 different resources shared using zrok. We'll refer to these as ",(0,n.jsx)(o.code,{children:"A"}),", ",(0,n.jsx)(o.code,{children:"B"}),", and ",(0,n.jsx)(o.code,{children:"C"}),". Both ",(0,n.jsx)(o.code,{children:"A"})," and ",(0,n.jsx)(o.code,{children:"B"})," are shares using the ",(0,n.jsx)(o.code,{children:"proxy"})," backend mode, which are used to share private HTTPS resources. Share ",(0,n.jsx)(o.code,{children:"C"})," uses the ",(0,n.jsx)(o.code,{children:"tcpTunnel"})," backend to expose a listening port from a private server (like a game server, or a message queue)."]}),"\n",(0,n.jsx)(o.p,{children:"We're using the shared zrok instance at zrok.io to provide our secure sharing infrastructure."}),"\n",(0,n.jsx)(o.p,{children:"Our deployment will end up looking like this:"}),"\n",(0,n.jsx)(o.p,{children:(0,n.jsx)(o.img,{alt:"personalized-frontend-1",src:r(4320).Z+"",width:"716",height:"357"})}),"\n",(0,n.jsxs)(o.p,{children:["We're using ",(0,n.jsx)(o.code,{children:"zrok reserve"})," to create the ",(0,n.jsx)(o.code,{children:"A"}),", ",(0,n.jsx)(o.code,{children:"B"}),", and ",(0,n.jsx)(o.code,{children:"C"})," shares as reserved shares (using the ",(0,n.jsx)(o.code,{children:"--unique-name"})," option to give them specific names). These shares could be located together in a single environment on a single host, or can be located at completely different spots on the planet on completely different hosts. You could want to use significantly more shares than 3, or less. The secure sharing fabric allows seamless secure connectivity for these shared resources. This implementation will scale up or down as needed (use multiple hosts behind a load balancer for really big workloads)."]}),"\n",(0,n.jsxs)(o.p,{children:["Because we're using ",(0,n.jsx)(o.code,{children:"private"})," zrok shares, they'll need to be accessed using a corresponding ",(0,n.jsx)(o.code,{children:"zrok access"})," private command. The ",(0,n.jsx)(o.code,{children:"zrok access private"}),' command binds a "network listener" where the share can be accessed on an address and port on the host where the command is executed. You can use ',(0,n.jsx)(o.code,{children:"zrok access private"})," to bind a network listener for a share in as many places as you want (up to the limit configuration of the service)."]}),"\n",(0,n.jsx)(o.admonition,{type:"note",children:(0,n.jsxs)(o.p,{children:["When you use ",(0,n.jsx)(o.code,{children:"zrok share public"}),", you are allowing your shared resources to be accessed using the shared, public frontend provided by the service instance (zrok.io). ",(0,n.jsx)(o.code,{children:"zrok share private"})," (or ",(0,n.jsx)(o.code,{children:"zrok reserve"}),"/",(0,n.jsx)(o.code,{children:"zrok share reserved"}),") creates the same kind of share, but does not provision the shared public frontend, and you'll need to use ",(0,n.jsx)(o.code,{children:"zrok access private"})," in order to ",(0,n.jsx)(o.em,{children:"bind"})," that share to a network address where it can be accessed."]})}),"\n",(0,n.jsxs)(o.p,{children:["Imagine that we own the domain ",(0,n.jsx)(o.code,{children:"example.com"}),". In our example, we want to expose our HTTPS shares ",(0,n.jsx)(o.code,{children:"A"})," and ",(0,n.jsx)(o.code,{children:"B"})," as ",(0,n.jsx)(o.code,{children:"a.example.com"})," and ",(0,n.jsx)(o.code,{children:"b.example.com"}),". And maybe our ",(0,n.jsx)(o.code,{children:"C"})," share represents a gaming server that we want to expose as ",(0,n.jsx)(o.code,{children:"gaming.example.com:25565"}),"."]}),"\n",(0,n.jsxs)(o.p,{children:["We can accomplish this easily with cheap VPS instance. You could also do it with containers through a container hosting service. The VPS will need an IP address exposed to the internet. You'll also need to be able to create DNS entries for the ",(0,n.jsx)(o.code,{children:"example.com"})," domain."]}),"\n",(0,n.jsxs)(o.p,{children:["To accomplish this, we're going to run 3 separate ",(0,n.jsx)(o.code,{children:"zrok access private"})," commands on our VPS (see the ",(0,n.jsx)(o.a,{href:"../../frontdoor/",children:"frontdoor guide"}),", or ",(0,n.jsx)(o.a,{href:"../../docker-share/docker_private_share_guide/#access-the-private-share",children:"zrok-private-access Docker Compose guide"})," for details on an approach for setting this up). One command each for shares ",(0,n.jsx)(o.code,{children:"A"}),", ",(0,n.jsx)(o.code,{children:"B"}),", and ",(0,n.jsx)(o.code,{children:"C"}),". The ",(0,n.jsx)(o.code,{children:"zrok access private"})," command works like this:"]}),"\n",(0,n.jsx)(o.pre,{children:(0,n.jsx)(o.code,{children:'$ zrok access private\nError: accepts 1 arg(s), received 0\nUsage:\n zrok access private [flags]\n\nFlags:\n -b, --bind string The address to bind the private frontend (default "127.0.0.1:9191")\n --headless Disable TUI and run headless\n -h, --help help for private\n\nGlobal Flags:\n -p, --panic Panic instead of showing pretty errors\n -v, --verbose Enable verbose logging\n'})}),"\n",(0,n.jsxs)(o.p,{children:["Notice the ",(0,n.jsx)(o.code,{children:"--bind"})," flag. That flag is used to bind a network listener to a specific IP address and port on the host we're accessing the shares from. In this case, imagine our VPS node has a public IP address of ",(0,n.jsx)(o.code,{children:"1.2.3.4"})," and a loopback (",(0,n.jsx)(o.code,{children:"127.0.0.1"}),")."]}),"\n",(0,n.jsxs)(o.p,{children:["To expose our HTTPS shares, we're going to use a reverse proxy like nginx. The reverse proxy will be exposed to the internet, terminating TLS and reverse proxying ",(0,n.jsx)(o.code,{children:"a.example.com"})," and ",(0,n.jsx)(o.code,{children:"b.example.com"})," to the network listeners for shares ",(0,n.jsx)(o.code,{children:"A"})," and ",(0,n.jsx)(o.code,{children:"B"}),"."]}),"\n",(0,n.jsxs)(o.p,{children:["So, we'll configure our VPS to persistently launch a ",(0,n.jsx)(o.code,{children:"zrok access private"})," for both of these shares. We'll use the ",(0,n.jsx)(o.code,{children:"--bind"})," flag to bind ",(0,n.jsx)(o.code,{children:"A"})," to ",(0,n.jsx)(o.code,{children:"127.0.0.1:9191"})," and ",(0,n.jsx)(o.code,{children:"B"})," to ",(0,n.jsx)(o.code,{children:"127.0.0.1:9192"}),"."]}),"\n",(0,n.jsxs)(o.p,{children:["We'll then configure nginx to have a virtual host for ",(0,n.jsx)(o.code,{children:"a.example.com"}),", proxying that to ",(0,n.jsx)(o.code,{children:"127.0.0.1:9191"})," and ",(0,n.jsx)(o.code,{children:"b.example.com"}),", proxying that to ",(0,n.jsx)(o.code,{children:"127.0.0.1:9192"}),"."]}),"\n",(0,n.jsxs)(o.p,{children:["Exposing our TCP port for ",(0,n.jsx)(o.code,{children:"gaming.example.com"})," is simply a matter of running a third ",(0,n.jsx)(o.code,{children:"zrok access private"})," with a ",(0,n.jsx)(o.code,{children:"--bind"})," flag configured to point to ",(0,n.jsx)(o.code,{children:"1.2.3.4:25565"}),"."]}),"\n",(0,n.jsxs)(o.p,{children:["Once you've created the appropriate DNS entries for ",(0,n.jsx)(o.code,{children:"a.example.com"}),", ",(0,n.jsx)(o.code,{children:"b.example.com"}),", and ",(0,n.jsx)(o.code,{children:"gaming.example.com"})," and worked through the TLS configuration (letsencrypt is your friend here), you'll have a fully functional personalized frontend for your zrok shares that you control."]}),"\n",(0,n.jsx)(o.p,{children:"Your protected resources remain disconnected from the internet and are only reachable through your personalized endpoint."}),"\n",(0,n.jsx)(o.h2,{id:"privacy",children:"Privacy"}),"\n",(0,n.jsxs)(o.p,{children:["When you use a public frontend (with a simple ",(0,n.jsx)(o.code,{children:"zrok share public"}),") at a hosted zrok instance (like zrok.io), the operators of that service have some amount of visibility into what traffic you're sending to your shares. The load balancers in front of the public frontend maintain logs describing all of the URLs that were accessed, as well as other information (headers, etc.) that contain information about the resource you're sharing."]}),"\n",(0,n.jsxs)(o.p,{children:["If you create private shares using ",(0,n.jsx)(o.code,{children:"zrok share private"})," and then run your own ",(0,n.jsx)(o.code,{children:"zrok access private"})," from some other location, the operators of the zrok service instance only know that some amount of data moved between the environment running the ",(0,n.jsx)(o.code,{children:"zrok share private"})," and the ",(0,n.jsx)(o.code,{children:"zrok access private"}),". There is no other information available."]})]})}function l(e={}){const{wrapper:o}={...(0,s.a)(),...e.components};return o?(0,n.jsx)(o,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},4320:(e,o,r)=>{r.d(o,{Z:()=>n});const n=r.p+"assets/images/personalized-frontend-1-4a8782774dbbdff2247871d2064f51f9.png"},1151:(e,o,r)=>{r.d(o,{Z:()=>a,a:()=>t});var n=r(7294);const s={},i=n.createContext(s);function t(e){const o=n.useContext(i);return n.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(s):e.components||s:t(e.components),n.createElement(i.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7452427d.a21c5833.js b/assets/js/7452427d.a21c5833.js deleted file mode 100644 index efe65033..00000000 --- a/assets/js/7452427d.a21c5833.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[4920],{722:(e,o,n)=>{n.r(o),n.d(o,{assets:()=>d,contentTitle:()=>t,default:()=>l,frontMatter:()=>i,metadata:()=>a,toc:()=>c});var r=n(5893),s=n(1151);const i={title:"Personalized Frontend",sidebar_label:"Personalized Frontend",sidebar_position:19},t=void 0,a={id:"guides/self-hosting/personalized-frontend",title:"Personalized Frontend",description:"This guide describes an approach that enables a zrok user to use a hosted, shared instance (zrok.io) and configure their own personalized frontend, which enables custom DNS and TLS for their shares.",source:"@site/../docs/guides/self-hosting/personalized-frontend.md",sourceDirName:"guides/self-hosting",slug:"/guides/self-hosting/personalized-frontend",permalink:"/docs/guides/self-hosting/personalized-frontend",draft:!1,unlisted:!1,editUrl:"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/self-hosting/personalized-frontend.md",tags:[],version:"current",sidebarPosition:19,frontMatter:{title:"Personalized Frontend",sidebar_label:"Personalized Frontend",sidebar_position:19},sidebar:"tutorialSidebar",previous:{title:"NGINX TLS",permalink:"/docs/guides/self-hosting/linux/nginx"},next:{title:"Docker",permalink:"/docs/guides/self-hosting/docker"}},d={},c=[{value:"Overview",id:"overview",level:2},{value:"Privacy",id:"privacy",level:2}];function h(e){const o={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",img:"img",p:"p",pre:"pre",...(0,s.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(o.p,{children:"This guide describes an approach that enables a zrok user to use a hosted, shared instance (zrok.io) and configure their own personalized frontend, which enables custom DNS and TLS for their shares."}),"\n",(0,r.jsx)(o.p,{children:"In order to accomplish this, the user will need to provide their own minimal VPS instance, or container hosting. The size and capacity of these resources will be entirely dependent on the workload that they will be used to service. But generally, for most modest workloads, the most inexpensive VPS option will suffice."}),"\n",(0,r.jsx)(o.p,{children:"This approach gives you complete control over the way that your shares are exposed publicly. This approach works for HTTPS shares, and also for TCP and UDP ports, allowing you to put all of these things onto the public internet, while maintaining strong security for your protected resources."}),"\n",(0,r.jsxs)(o.p,{children:["This guide isn't a detailed ",(0,r.jsx)(o.em,{children:"how to"})," with specific steps to follow. This is more of a description of the overall concept. You'll want to figure out your own specific steps to implement this style of deployment in your own environment."]}),"\n",(0,r.jsx)(o.h2,{id:"overview",children:"Overview"}),"\n",(0,r.jsxs)(o.p,{children:["Let's imagine a hypothetical scenario where you've got 3 different resources shared using zrok. We'll refer to these as ",(0,r.jsx)(o.code,{children:"A"}),", ",(0,r.jsx)(o.code,{children:"B"}),", and ",(0,r.jsx)(o.code,{children:"C"}),". Both ",(0,r.jsx)(o.code,{children:"A"})," and ",(0,r.jsx)(o.code,{children:"B"})," are shares using the ",(0,r.jsx)(o.code,{children:"proxy"})," backend mode, which are used to share private HTTPS resources. Share ",(0,r.jsx)(o.code,{children:"C"})," uses the ",(0,r.jsx)(o.code,{children:"tcpTunnel"})," backend to expose a listening port from a private server (like a game server, or a message queue)."]}),"\n",(0,r.jsx)(o.p,{children:"We're using the shared zrok instance at zrok.io to provide our secure sharing infrastructure."}),"\n",(0,r.jsx)(o.p,{children:"Our deployment will end up looking like this:"}),"\n",(0,r.jsx)(o.p,{children:(0,r.jsx)(o.img,{alt:"personalized-frontend-1",src:n(4320).Z+"",width:"716",height:"357"})}),"\n",(0,r.jsxs)(o.p,{children:["We're using ",(0,r.jsx)(o.code,{children:"zrok reserve"})," to create the ",(0,r.jsx)(o.code,{children:"A"}),", ",(0,r.jsx)(o.code,{children:"B"}),", and ",(0,r.jsx)(o.code,{children:"C"})," shares as reserved shares (using the ",(0,r.jsx)(o.code,{children:"--unique-name"})," option to give them specific names). These shares could be located together in a single environment on a single host, or can be located at completely different spots on the planet on completely different hosts. You could want to use significantly more shares than 3, or less. The secure sharing fabric allows seamless secure connectivity for these shared resources. This implementation will scale up or down as needed (use multiple hosts behind a load balancer for really big workloads)."]}),"\n",(0,r.jsxs)(o.p,{children:["Because we're using ",(0,r.jsx)(o.code,{children:"private"})," zrok shares, they'll need to be accessed using a corresponding ",(0,r.jsx)(o.code,{children:"zrok access"})," private command. The ",(0,r.jsx)(o.code,{children:"zrok access private"}),' command binds a "network listener" where the share can be accessed on an address and port on the host where the command is executed. You can use ',(0,r.jsx)(o.code,{children:"zrok access private"})," to bind a network listener for a share in as many places as you want (up to the limit configuration of the service)."]}),"\n",(0,r.jsx)(o.admonition,{type:"note",children:(0,r.jsxs)(o.p,{children:["When you use ",(0,r.jsx)(o.code,{children:"zrok share public"}),", you are allowing your shared resources to be accessed using the shared, public frontend provided by the service instance (zrok.io). ",(0,r.jsx)(o.code,{children:"zrok share private"})," (or ",(0,r.jsx)(o.code,{children:"zrok reserve"}),"/",(0,r.jsx)(o.code,{children:"zrok share reserved"}),") creates the same kind of share, but does not provision the shared public frontend, and you'll need to use ",(0,r.jsx)(o.code,{children:"zrok access private"})," in order to ",(0,r.jsx)(o.em,{children:"bind"})," that share to a network address where it can be accessed."]})}),"\n",(0,r.jsxs)(o.p,{children:["Imagine that we own the domain ",(0,r.jsx)(o.code,{children:"example.com"}),". In our example, we want to expose our HTTPS shares ",(0,r.jsx)(o.code,{children:"A"})," and ",(0,r.jsx)(o.code,{children:"B"})," as ",(0,r.jsx)(o.code,{children:"a.example.com"})," and ",(0,r.jsx)(o.code,{children:"b.example.com"}),". And maybe our ",(0,r.jsx)(o.code,{children:"C"})," share represents a gaming server that we want to expose as ",(0,r.jsx)(o.code,{children:"gaming.example.com:25565"}),"."]}),"\n",(0,r.jsxs)(o.p,{children:["We can accomplish this easily with cheap VPS instance. You could also do it with containers through a container hosting service. The VPS will need an IP address exposed to the internet. You'll also need to be able to create DNS entries for the ",(0,r.jsx)(o.code,{children:"example.com"})," domain."]}),"\n",(0,r.jsxs)(o.p,{children:["To accomplish this, we're going to run 3 separate ",(0,r.jsx)(o.code,{children:"zrok access private"})," commands on our VPS (see the ",(0,r.jsx)(o.a,{href:"../../frontdoor/",children:"frontdoor guide"}),", or ",(0,r.jsx)(o.a,{href:"../../docker-share/docker_private_share_guide/#access-the-private-share",children:"zrok-private-access Docker Compose guide"})," for details on an approach for setting this up). One command each for shares ",(0,r.jsx)(o.code,{children:"A"}),", ",(0,r.jsx)(o.code,{children:"B"}),", and ",(0,r.jsx)(o.code,{children:"C"}),". The ",(0,r.jsx)(o.code,{children:"zrok access private"})," command works like this:"]}),"\n",(0,r.jsx)(o.pre,{children:(0,r.jsx)(o.code,{children:'$ zrok access private\nError: accepts 1 arg(s), received 0\nUsage:\n zrok access private [flags]\n\nFlags:\n -b, --bind string The address to bind the private frontend (default "127.0.0.1:9191")\n --headless Disable TUI and run headless\n -h, --help help for private\n\nGlobal Flags:\n -p, --panic Panic instead of showing pretty errors\n -v, --verbose Enable verbose logging\n'})}),"\n",(0,r.jsxs)(o.p,{children:["Notice the ",(0,r.jsx)(o.code,{children:"--bind"})," flag. That flag is used to bind a network listener to a specific IP address and port on the host we're accessing the shares from. In this case, imagine our VPS node has a public IP address of ",(0,r.jsx)(o.code,{children:"1.2.3.4"})," and a loopback (",(0,r.jsx)(o.code,{children:"127.0.0.1"}),")."]}),"\n",(0,r.jsxs)(o.p,{children:["To expose our HTTPS shares, we're going to use a reverse proxy like nginx. The reverse proxy will be exposed to the internet, terminating TLS and reverse proxying ",(0,r.jsx)(o.code,{children:"a.example.com"})," and ",(0,r.jsx)(o.code,{children:"b.example.com"})," to the network listeners for shares ",(0,r.jsx)(o.code,{children:"A"})," and ",(0,r.jsx)(o.code,{children:"B"}),"."]}),"\n",(0,r.jsxs)(o.p,{children:["So, we'll configure our VPS to persistently launch a ",(0,r.jsx)(o.code,{children:"zrok access private"})," for both of these shares. We'll use the ",(0,r.jsx)(o.code,{children:"--bind"})," flag to bind ",(0,r.jsx)(o.code,{children:"A"})," to ",(0,r.jsx)(o.code,{children:"127.0.0.1:9191"})," and ",(0,r.jsx)(o.code,{children:"B"})," to ",(0,r.jsx)(o.code,{children:"127.0.0.1:9192"}),"."]}),"\n",(0,r.jsxs)(o.p,{children:["We'll then configure nginx to have a virtual host for ",(0,r.jsx)(o.code,{children:"a.example.com"}),", proxying that to ",(0,r.jsx)(o.code,{children:"127.0.0.1:9191"})," and ",(0,r.jsx)(o.code,{children:"b.example.com"}),", proxying that to ",(0,r.jsx)(o.code,{children:"127.0.0.1:9192"}),"."]}),"\n",(0,r.jsxs)(o.p,{children:["Exposing our TCP port for ",(0,r.jsx)(o.code,{children:"gaming.example.com"})," is simply a matter of running a third ",(0,r.jsx)(o.code,{children:"zrok access private"})," with a ",(0,r.jsx)(o.code,{children:"--bind"})," flag configured to point to ",(0,r.jsx)(o.code,{children:"1.2.3.4:25565"}),"."]}),"\n",(0,r.jsxs)(o.p,{children:["Once you've created the appropriate DNS entries for ",(0,r.jsx)(o.code,{children:"a.example.com"}),", ",(0,r.jsx)(o.code,{children:"b.example.com"}),", and ",(0,r.jsx)(o.code,{children:"gaming.example.com"})," and worked through the TLS configuration (letsencrypt is your friend here), you'll have a fully functional personalized frontend for your zrok shares that you control."]}),"\n",(0,r.jsx)(o.p,{children:"Your protected resources remain disconnected from the internet and are only reachable through your personalized endpoint."}),"\n",(0,r.jsx)(o.h2,{id:"privacy",children:"Privacy"}),"\n",(0,r.jsxs)(o.p,{children:["When you use a public frontend (with a simple ",(0,r.jsx)(o.code,{children:"zrok share public"}),") at a hosted zrok instance (like zrok.io), the operators of that service have some amount of visibility into what traffic you're sending to your shares. The load balancers in front of the public frontend maintain logs describing all of the URLs that were accessed, as well as other information (headers, etc.) that contain information about the resource you're sharing."]}),"\n",(0,r.jsxs)(o.p,{children:["If you create private shares using ",(0,r.jsx)(o.code,{children:"zrok share private"})," and then run your own ",(0,r.jsx)(o.code,{children:"zrok access private"})," from some other location, the operators of the zrok service instance only know that some amount of data moved between the environment running the ",(0,r.jsx)(o.code,{children:"zrok share private"})," and the ",(0,r.jsx)(o.code,{children:"zrok access private"}),". There is no other information available."]})]})}function l(e={}){const{wrapper:o}={...(0,s.a)(),...e.components};return o?(0,r.jsx)(o,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},4320:(e,o,n)=>{n.d(o,{Z:()=>r});const r=n.p+"assets/images/personalized-frontend-1-4a8782774dbbdff2247871d2064f51f9.png"},1151:(e,o,n)=>{n.d(o,{Z:()=>a,a:()=>t});var r=n(7294);const s={},i=r.createContext(s);function t(e){const o=r.useContext(i);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(s):e.components||s:t(e.components),r.createElement(i.Provider,{value:o},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9939c4f4.f1f5b859.js b/assets/js/9939c4f4.f1f5b859.js new file mode 100644 index 00000000..fa5acb01 --- /dev/null +++ b/assets/js/9939c4f4.f1f5b859.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[7273],{1855:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>d,frontMatter:()=>r,metadata:()=>o,toc:()=>h});var n=i(5893),s=i(1151);const r={title:"Interstitial Pages",sidebar_label:"Interstitial Pages",sidebar_position:18},a=void 0,o={id:"guides/self-hosting/interstitial-page",title:"Interstitial Pages",description:"On large zrok installations that support open registration and shared public frontends, abuse can become an issue. In order to mitigate phishing and other similar forms of abuse, zrok offers an interstitial page that announces to the visiting user that the share is hosted through zrok, and probably isn't their financial institution.",source:"@site/../docs/guides/self-hosting/interstitial-page.md",sourceDirName:"guides/self-hosting",slug:"/guides/self-hosting/interstitial-page",permalink:"/docs/guides/self-hosting/interstitial-page",draft:!1,unlisted:!1,editUrl:"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/self-hosting/interstitial-page.md",tags:[],version:"current",sidebarPosition:18,frontMatter:{title:"Interstitial Pages",sidebar_label:"Interstitial Pages",sidebar_position:18},sidebar:"tutorialSidebar",previous:{title:"NGINX TLS",permalink:"/docs/guides/self-hosting/linux/nginx"},next:{title:"Personalized Frontend",permalink:"/docs/guides/self-hosting/personalized-frontend"}},l={},h=[{value:"Bypassing the Interstitial",id:"bypassing-the-interstitial",level:2}];function c(e){const t={code:"code",em:"em",h2:"h2",img:"img",p:"p",pre:"pre",...(0,s.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.p,{children:"On large zrok installations that support open registration and shared public frontends, abuse can become an issue. In order to mitigate phishing and other similar forms of abuse, zrok offers an interstitial page that announces to the visiting user that the share is hosted through zrok, and probably isn't their financial institution."}),"\n",(0,n.jsx)(t.p,{children:"Interstitial pages can be enabled on a per-frontend basis. This allows the interstitial to be enabled on open public frontends but not closed public frontends (closed public frontends require a grant to use)."}),"\n",(0,n.jsx)(t.p,{children:"The interstitial page requirement can also be overridden on a per-account basis, allowing shares created by specific accounts to bypass the interstitial requirement on frontends that enable it. This facilitates building infrastructure that grants trusted users additional privileges."}),"\n",(0,n.jsx)(t.p,{children:"By default, if you do not specifically enable interstitial pages on a public frontend, then your self-hosted service instance will not offer them."}),"\n",(0,n.jsx)(t.p,{children:"Let's take a look at how the interstitial pages mechanism works. The following diagram shows the share configuration rendezvous made between the zrok controller and a zrok frontend:"}),"\n",(0,n.jsx)(t.p,{children:(0,n.jsx)(t.img,{alt:"zrok_interstitial_rendezvous",src:i(5390).Z+"",width:"631",height:"362"})}),"\n",(0,n.jsxs)(t.p,{children:["Every zrok share has a ",(0,n.jsx)(t.em,{children:"config"})," recorded in the underlying OpenZiti network. The config is of type ",(0,n.jsx)(t.code,{children:"zrok.proxy.v1"}),". The frontend uses the information in this config to understand the disposition of the share. The config can contain an ",(0,n.jsx)(t.code,{children:"interstitial: true"})," setting. If the config has this setting, and the frontend is configured to enable interstitial pages, then end users accessing the share will receive the interstitial page on first visit."]}),"\n",(0,n.jsxs)(t.p,{children:["By default the zrok controller will record ",(0,n.jsx)(t.code,{children:"interstitial: true"})," in the share config ",(0,n.jsx)(t.em,{children:"unless"})," a row is present in the ",(0,n.jsx)(t.code,{children:"skip_interstitial_grants"})," table in the underlying database for the account creating the share. The ",(0,n.jsx)(t.code,{children:"skip_interstitial_grants"})," table is a basic SQL structure that allows inserting a row per account."]}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{children:"create table skip_interstitial_grants (\n id serial primary key,\n\n account_id integer references accounts (id) not null,\n\n created_at timestamptz not null default(current_timestamp),\n updated_at timestamptz not null default(current_timestamp),\n deleted boolean not null default(false)\n);\n"})}),"\n",(0,n.jsxs)(t.p,{children:["If an account has a row present in this table when creating a share, then the controller will write ",(0,n.jsx)(t.code,{children:"interstitial: false"})," into the config for the share, which will bypass the interstitial regardless of frontend configuration. The ",(0,n.jsx)(t.code,{children:"skip_interstitial_grants"})," controls what the zrok controller will store in the share config when creating the share."]}),"\n",(0,n.jsx)(t.p,{children:"The frontend configuration controls what the frontend will do with the share config it finds in OpenZiti. The new stanza looks like this:"}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{children:"# Setting the `interstitial` setting to `true` will allow this frontend \n# to offer interstitial pages if they are configured on the share by the \n# controller.\n#\n#interstitial: true\n"})}),"\n",(0,n.jsxs)(t.p,{children:["Simply setting ",(0,n.jsx)(t.code,{children:"interstitial: true"})," in the frontend config will allow the configured frontend to offer an interstitial page if the share config enables the interstitial page for that share."]}),"\n",(0,n.jsx)(t.h2,{id:"bypassing-the-interstitial",children:"Bypassing the Interstitial"}),"\n",(0,n.jsxs)(t.p,{children:["The interstitial page will be presented unless the client shows up with a ",(0,n.jsx)(t.code,{children:"zrok_interstitial"})," cookie. When the user is presented with the interstitial page, there is a button they can click which sets the necessary cookie and allows them to visit the site. The cookie is set to expire in one week."]}),"\n",(0,n.jsxs)(t.p,{children:["End users can offer an HTTP header of ",(0,n.jsx)(t.code,{children:"skip_zrok_interstitial"}),", set to any value to bypass the interstitial page. Setting this header means that the user most likely understands what a zrok share is and will hopefully not fall for a phishing attack."]}),"\n",(0,n.jsxs)(t.p,{children:["The ",(0,n.jsx)(t.code,{children:"skip_zrok_interstitial"})," header is especially useful for API clients (like ",(0,n.jsx)(t.code,{children:"curl"}),") and other types of non-interactive clients."]}),"\n",(0,n.jsxs)(t.p,{children:["The ",(0,n.jsx)(t.code,{children:"drive"})," backend mode does not currently support ",(0,n.jsx)(t.code,{children:"GET"})," requests and cannot be accessed with a conventional web browser, so it bypasses the interstitial page requirement."]})]})}function d(e={}){const{wrapper:t}={...(0,s.a)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(c,{...e})}):c(e)}},5390:(e,t,i)=>{i.d(t,{Z:()=>n});const n=i.p+"assets/images/zrok_interstitial_rendezvous-18053866f55c9d823e96f76f39c20555.png"},1151:(e,t,i)=>{i.d(t,{Z:()=>o,a:()=>a});var n=i(7294);const s={},r=n.createContext(s);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(s):e.components||s:a(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d768dc0f.37e1f8f9.js b/assets/js/d768dc0f.8e1de618.js similarity index 99% rename from assets/js/d768dc0f.37e1f8f9.js rename to assets/js/d768dc0f.8e1de618.js index 7b3699f2..54919be7 100644 --- a/assets/js/d768dc0f.37e1f8f9.js +++ b/assets/js/d768dc0f.8e1de618.js @@ -1 +1 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[5882],{475:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>c,contentTitle:()=>s,default:()=>h,frontMatter:()=>i,metadata:()=>l,toc:()=>d});var o=r(5893),t=r(1151);const i={sidebar_position:40,title:"Self-Hosting Guide for Linux",sidebar_label:"Linux"},s=void 0,l={id:"guides/self-hosting/linux/index",title:"Self-Hosting Guide for Linux",description:"Walkthrough Video",source:"@site/../docs/guides/self-hosting/linux/index.mdx",sourceDirName:"guides/self-hosting/linux",slug:"/guides/self-hosting/linux/",permalink:"/docs/guides/self-hosting/linux/",draft:!1,unlisted:!1,editUrl:"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/self-hosting/linux/index.mdx",tags:[],version:"current",sidebarPosition:40,frontMatter:{sidebar_position:40,title:"Self-Hosting Guide for Linux",sidebar_label:"Linux"},sidebar:"tutorialSidebar",previous:{title:"Self Hosting",permalink:"/docs/category/self-hosting"},next:{title:"NGINX TLS",permalink:"/docs/guides/self-hosting/linux/nginx"}},c={},d=[{value:"Walkthrough Video",id:"walkthrough-video",level:2},{value:"Before you Begin",id:"before-you-begin",level:2},{value:"OpenZiti",id:"openziti",level:2},{value:"Install zrok",id:"install-zrok",level:2},{value:"Configure the Controller",id:"configure-the-controller",level:2},{value:"Environment Variables",id:"environment-variables",level:2},{value:"Bootstrap OpenZiti for zrok",id:"bootstrap-openziti-for-zrok",level:2},{value:"Run zrok Controller",id:"run-zrok-controller",level:2},{value:"Create zrok Frontend",id:"create-zrok-frontend",level:2},{value:"Configure the Public Frontend",id:"configure-the-public-frontend",level:2},{value:"Start Public Frontend",id:"start-public-frontend",level:2},{value:"Create a User Account",id:"create-a-user-account",level:2},{value:"Invite Additional Users",id:"invite-additional-users",level:2},{value:"Enable Your Environment",id:"enable-your-environment",level:2}];function a(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,t.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h2,{id:"walkthrough-video",children:"Walkthrough Video"}),"\n",(0,o.jsx)("iframe",{width:"100%",height:"315",src:"https://www.youtube.com/embed/870A5dke_u4",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowfullscreen:!0}),"\n",(0,o.jsx)(n.h2,{id:"before-you-begin",children:"Before you Begin"}),"\n",(0,o.jsxs)(n.p,{children:["This will get you up and running with a self-hosted instance of ",(0,o.jsx)(n.code,{children:"zrok"}),". I'll assume you have the following:"]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"a Linux server with a public IP"}),"\n",(0,o.jsxs)(n.li,{children:["a wildcard DNS record like ",(0,o.jsx)(n.code,{children:"*.zrok.quigley.com"})," that resolves to the server IP"]}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"openziti",children:"OpenZiti"}),"\n",(0,o.jsxs)(n.p,{children:['OpenZiti (a.k.a. "Ziti") provides secure network backhaul for ',(0,o.jsx)(n.code,{children:"zrok"})," public and private shares. You need a Ziti Controller and a Ziti Router. You can run everything on the same Linux VPS."]}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Install the Ziti Controller package by following the ",(0,o.jsx)(n.a,{href:"https://openziti.io/docs/category/deployments",children:"Linux controller deployment guide"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Ensure your answer file (",(0,o.jsx)(n.code,{children:"/opt/openziti/etc/controller/bootstrap.env"}),") has the FQDN of your Linux server and an admin password defined."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Ensure your firewall allows the controller port from the answer file."}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Start the controller service (",(0,o.jsx)(n.code,{children:"ziti-controller.service"}),") and check the status."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Log in to the Ziti Controller"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"ziti edge login localhost:1280 -u admin -p \n"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Administratively Create a Ziti Router"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:'ziti edge create edge-router "router1" -o /tmp/router1.jwt\n'})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Install the Ziti Router package by following ",(0,o.jsx)(n.a,{href:"https://openziti.io/docs/category/deployments",children:"the Linux router deployment guide"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Ensure your answer file (",(0,o.jsx)(n.code,{children:"/opt/openziti/etc/router/bootstrap.env"}),") has the FQDN of your Linux server for both controller and router addresses and the enrollment token from the previous step."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Ensure your firewall allows the router port from the answer file."}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Start the router service (",(0,o.jsx)(n.code,{children:"ziti-router.service"}),") and check the status."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Verify the new router is online."}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"ziti edge list edge-routers\n"})}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"install-zrok",children:"Install zrok"}),"\n",(0,o.jsxs)(n.p,{children:["Debian and RPM packages are available for ",(0,o.jsx)(n.code,{children:"zrok"}),"."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"sudo apt install zrok\n"})}),"\n",(0,o.jsxs)(n.p,{children:["Follow ",(0,o.jsx)(n.a,{href:"/docs/guides/install/linux",children:"the Linux installation guide"})," to install the ",(0,o.jsx)(n.code,{children:"zrok"})," package from the repository or manually install the binary for your platform."]}),"\n",(0,o.jsx)(n.h2,{id:"configure-the-controller",children:"Configure the Controller"}),"\n",(0,o.jsxs)(n.p,{children:["Create a ",(0,o.jsx)(n.code,{children:"zrok"})," controller configuration file in ",(0,o.jsx)(n.code,{children:"etc/ctrl.yml"}),". The controller can terminate TLS or you may front the server with a reverse proxy that continually renews the necessary wildcard certificate (e.g., Caddy w/ a DNS provider plugin). This example will expose the non-TLS listener for the controller."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:'# _____ __ ___ | | __\n# |_ / \'__/ _ \\| |/ /\n# / /| | | (_) | <\n# /___|_| \\___/|_|\\_\\\n# controller configuration\n\nv: 3\n\nadmin:\n # generate these admin tokens from a source of randomness, e.g. \n # LC_ALL=C tr -dc _A-Z-a-z-0-9 < /dev/urandom | head -c32\n secrets:\n - Q8V0LqnNb5wNX9kE1fgQ0H6VlcvJybB1 # be sure to change this!\n\nendpoint:\n host: 0.0.0.0\n port: 18080\n\ninvites:\n invites_open: true\n\nstore:\n path: zrok.db\n type: sqlite3\n\nziti:\n api_endpoint: "https://127.0.0.1:1280"\n username: admin\n password: "XO0xHp75uuyeireO2xmmVlK91T7B9fpD"\n\n# you can use certbot to renew the wildcard cert for the controller with a DNS provider API token or front this `zrok` # controller with Caddy\n#tls:\n# cert_path: "/Path/To/Cert/zrok.crt"\n# key_path: "/Path/To/Cert/zrok.key"\n\n'})}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"admin"})," section defines privileged administrative credentials and must be set in the ",(0,o.jsx)(n.code,{children:"ZROK_ADMIN_TOKEN"})," environment variable in shells where you want to run ",(0,o.jsx)(n.code,{children:"zrok admin"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"endpoint"})," section defines where your ",(0,o.jsx)(n.code,{children:"zrok"})," controller will listen."]}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"store"})," section defines the local ",(0,o.jsx)(n.code,{children:"sqlite3"})," database used by the controller."]}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"ziti"})," section defines how the ",(0,o.jsx)(n.code,{children:"zrok"})," controller should communicate with your OpenZiti installation. When using the OpenZiti quickstart, an administrative password will be generated; the ",(0,o.jsx)(n.code,{children:"password"})," in the ",(0,o.jsx)(n.code,{children:"ziti"})," stanza should reflect this password."]}),"\n",(0,o.jsxs)(n.admonition,{type:"note",children:[(0,o.jsxs)(n.p,{children:["Be sure to see the ",(0,o.jsxs)(n.a,{target:"_blank","data-noBrokenLinkCheck":!0,href:r(1855).Z+"",children:["reference configuration at ",(0,o.jsx)(n.code,{children:"etc/ctrl.yml"})]})," for the complete documentation of the current configuration file format for the ",(0,o.jsx)(n.code,{children:"zrok"})," controller and service instance components."]}),(0,o.jsxs)(n.p,{children:["See the separate guides on ",(0,o.jsx)(n.a,{href:"/docs/guides/self-hosting/metrics-and-limits/configuring-metrics",children:"configuring metrics"})," and ",(0,o.jsx)(n.a,{href:"/docs/guides/self-hosting/metrics-and-limits/configuring-limits",children:"configuring limits"})," for details about both of these specialized areas of service instance configuration."]})]}),"\n",(0,o.jsx)(n.h2,{id:"environment-variables",children:"Environment Variables"}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"zrok"})," binaries are configured to work with the global ",(0,o.jsx)(n.code,{children:"zrok.io"})," service, and default to using ",(0,o.jsx)(n.code,{children:"api.zrok.io"})," as the endpoint for communicating with the service."]}),"\n",(0,o.jsxs)(n.p,{children:["To work with a self-hosted ",(0,o.jsx)(n.code,{children:"zrok"})," deployment, you'll need to set the ",(0,o.jsx)(n.code,{children:"ZROK_API_ENDPOINT"})," environment variable to point to the address where your ",(0,o.jsx)(n.code,{children:"zrok"})," controller will be listening, according to ",(0,o.jsx)(n.code,{children:"endpoint"})," in the configuration file above."]}),"\n",(0,o.jsx)(n.p,{children:"In my case, I've set:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"export ZROK_API_ENDPOINT=http://127.0.0.1:18080\n"})}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsxs)(n.a,{href:"/docs/guides/self-hosting/instance-configuration",children:["Read more about configuring your self-hosted ",(0,o.jsx)(n.code,{children:"zrok"})," instance"]}),"."]}),"\n",(0,o.jsx)(n.h2,{id:"bootstrap-openziti-for-zrok",children:"Bootstrap OpenZiti for zrok"}),"\n",(0,o.jsxs)(n.p,{children:["With your OpenZiti network running and your configuration saved to a local file (I refer to mine as ",(0,o.jsx)(n.code,{children:"etc/ctrl.yml"})," in these examples), you're ready to bootstrap the Ziti network."]}),"\n",(0,o.jsxs)(n.p,{children:["Use the ",(0,o.jsx)(n.code,{children:"zrok admin bootstrap"})," command to bootstrap like this:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"$ zrok admin bootstrap etc/ctrl.yml\n[ 0.002] INFO main.(*adminBootstrap).run: {\n\t...\n}\n[ 0.002] INFO zrok/controller/store.Open: database connected\n[ 0.006] INFO zrok/controller/store.(*Store).migrate: applied 0 migrations\n[ 0.006] INFO zrok/controller.Bootstrap: connecting to the ziti edge management api\n[ 0.039] INFO zrok/controller.Bootstrap: creating identity for controller ziti access\n[ 0.071] INFO zrok/controller.Bootstrap: controller identity: jKd8AINSz\n[ 0.082] INFO zrok/controller.assertIdentity: asserted identity 'jKd8AINSz'\n[ 0.085] INFO zrok/controller.assertErpForIdentity: asserted erps for 'ctrl' (jKd8AINSz)\n[ 0.085] INFO zrok/controller.Bootstrap: creating identity for frontend ziti access\n[ 0.118] INFO zrok/controller.Bootstrap: frontend identity: sqJRAINSiB\n[ 0.119] INFO zrok/controller.assertIdentity: asserted identity 'sqJRAINSiB'\n[ 0.120] INFO zrok/controller.assertErpForIdentity: asserted erps for 'frontend' (sqJRAINSiB)\n[ 0.120] WARNING zrok/controller.Bootstrap: missing public frontend for ziti id 'sqJRAINSiB'; please use 'zrok admin create frontend sqJRAINSiB public https://{token}.your.dns.name' to create a frontend instance\n[ 0.123] INFO zrok/controller.assertZrokProxyConfigType: found 'zrok.proxy.v1' config type with id '33CyjNbIepkXHN5VzGDA8L'\n[ 0.124] INFO zrok/controller.assertMetricsService: creating 'metrics' service\n[ 0.126] INFO zrok/controller.assertMetricsService: asserted 'metrics' service (5RpPZZ7T8bZf1ENjwGiPc3)\n[ 0.128] INFO zrok/controller.assertMetricsSerp: creating 'metrics' serp\n[ 0.130] INFO zrok/controller.assertMetricsSerp: asserted 'metrics' serp\n[ 0.134] INFO zrok/controller.assertCtrlMetricsBind: creating 'ctrl-metrics-bind' service policy\n[ 0.135] INFO zrok/controller.assertCtrlMetricsBind: asserted 'ctrl-metrics-bind' service policy\n[ 0.138] INFO zrok/controller.assertFrontendMetricsDial: creating 'frontend-metrics-dial' service policy\n[ 0.140] INFO zrok/controller.assertFrontendMetricsDial: asserted 'frontend-metrics-dial' service policy\n[ 0.140] INFO main.(*adminBootstrap).run: bootstrap complete!\n"})}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"zrok admin bootstrap"})," command configures the ",(0,o.jsx)(n.code,{children:"zrok"})," database, the necessary OpenZiti identities, and all of the OpenZiti policies required to run a ",(0,o.jsx)(n.code,{children:"zrok"})," service."]}),"\n",(0,o.jsx)(n.p,{children:"Notice this warning:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"[ 0.120] WARNING zrok/controller.Bootstrap: missing public frontend for ziti id 'sqJRAINSiB'; please use 'zrok admin create frontend sqJRAINSiB public https://{token}.your.dns.name' to create a frontend instance\n"})}),"\n",(0,o.jsxs)(n.p,{children:["If you find it necessary to re-run the ",(0,o.jsx)(n.code,{children:"zrok admin bootstrap"})," command, you may need to add the ",(0,o.jsx)(n.code,{children:"--skip-frontend"})," flag to avoid re-creating the default ",(0,o.jsx)(n.code,{children:"public"})," frontend's Ziti identity and router policy."]}),"\n",(0,o.jsx)(n.h2,{id:"run-zrok-controller",children:"Run zrok Controller"}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"zrok"}),' bootstrap process wants us to create a "public frontend" for our service. ',(0,o.jsx)(n.code,{children:"zrok"})," uses public frontends to allow users to specify where they would like public traffic to ingress from."]}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"zrok admin create frontend"})," command requires a running ",(0,o.jsx)(n.code,{children:"zrok"})," controller, so let's start that up first:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"$ zrok controller etc/ctrl.yml \n[ 0.003] INFO main.(*controllerCommand).run: {\n\t...\n}\n[ 0.016] INFO zrok/controller.inspectZiti: inspecting ziti controller configuration\n[ 0.048] INFO zrok/controller.findZrokProxyConfigType: found 'zrok.proxy.v1' config type with id '33CyjNbIepkXHN5VzGDA8L'\n[ 0.048] INFO zrok/controller/store.Open: database connected\n[ 0.048] INFO zrok/controller/store.(*Store).migrate: applied 0 migrations\n[ 0.049] INFO zrok/controller.(*metricsAgent).run: starting\n[ 0.064] INFO zrok/rest_server_zrok.setupGlobalMiddleware: configuring\n[ 0.064] INFO zrok/ui.StaticBuilder: building\n[ 0.065] INFO zrok/rest_server_zrok.(*Server).Logf: Serving zrok at http://[::]:18080\n[ 0.085] INFO zrok/controller.(*metricsAgent).listen: started\n"})}),"\n",(0,o.jsx)(n.h2,{id:"create-zrok-frontend",children:"Create zrok Frontend"}),"\n",(0,o.jsxs)(n.p,{children:["With our ",(0,o.jsx)(n.code,{children:"ZROK_ADMIN_TOKEN"})," and ",(0,o.jsx)(n.code,{children:"ZROK_API_ENDPOINT"})," environment variables set, we can create our public frontend like this:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"$ zrok admin create frontend sqJRAINSiB public http://{token}.zrok.quigley.com:8080\n[ 0.037] INFO main.(*adminCreateFrontendCommand).run: created global public frontend 'WEirJNHVlcW9'\n"})}),"\n",(0,o.jsxs)(n.p,{children:["The id of the frontend was emitted earlier in by the ",(0,o.jsx)(n.code,{children:"zrok"})," controller when we ran the bootstrap command. If you don't have that log message the you can find the id again with the ",(0,o.jsx)(n.code,{children:"ziti"})," CLI like this:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"# log in as admin (example)\nziti edge login localhost:1280 -u admin -p XO0xHp75uuyeireO2xmmVlK91T7B9fpD\n\n# list Ziti identities created by the quickstart and bootstrap\nziti edge list identities\n"})}),"\n",(0,o.jsx)(n.p,{children:'The id is shown for the frontend identity named "public."'}),"\n",(0,o.jsxs)(n.p,{children:["Nice work! The ",(0,o.jsx)(n.code,{children:"zrok"})," controller is fully configured now that you have created the ",(0,o.jsx)(n.code,{children:"zrok"})," frontend."]}),"\n",(0,o.jsx)(n.h2,{id:"configure-the-public-frontend",children:"Configure the Public Frontend"}),"\n",(0,o.jsxs)(n.p,{children:["Create an http frontend configuration file in ",(0,o.jsx)(n.code,{children:"etc/http-frontend.yml"}),"."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:"v: 3\nhost_match: zrok.quigley.com\naddress: 0.0.0.0:8080\n"})}),"\n",(0,o.jsxs)(n.p,{children:["This frontend config file has a ",(0,o.jsx)(n.code,{children:"host_match"})," pattern that represents the DNS zone you're using with this instance of ",(0,o.jsx)(n.code,{children:"zrok"}),". Incoming HTTP requests with a matching ",(0,o.jsx)(n.code,{children:"Host"})," header will be handled by this frontend. You may also specify the interface address where the frontend will listen for public access requests."]}),"\n",(0,o.jsxs)(n.p,{children:["The frontend does not provide server TLS, but you may front the server with a reverse proxy. It is essential the reverse proxy forwards the ",(0,o.jsx)(n.code,{children:"Host"})," header supplied by the viewer. This example will expose the non-TLS listener for the frontend."]}),"\n",(0,o.jsxs)(n.p,{children:["You can also specify an ",(0,o.jsx)(n.code,{children:"oauth"})," configuration in this file, full details of are found in ",(0,o.jsx)(n.a,{href:"/docs/guides/self-hosting/oauth/configuring-oauth#configuring-your-public-frontend",children:"OAuth Public Frontend Configuration"}),"."]}),"\n",(0,o.jsx)(n.h2,{id:"start-public-frontend",children:"Start Public Frontend"}),"\n",(0,o.jsx)(n.p,{children:"In another terminal window, run:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"$ zrok access public etc/http-frontend.yml\n[ 0.002] INFO main.(*accessPublicCommand).run: {\n\t...\n}\n[ 0.002] INFO zrok/endpoints/public_frontend.newMetricsAgent: loaded 'public' identity\n"})}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"zrok"})," frontend uses the ",(0,o.jsx)(n.code,{children:"public"})," identity created during the bootstrap process to securely access zrok backends. to provide public access for the ",(0,o.jsx)(n.code,{children:"zrok"})," deployment. It is expected that the configured listener for this frontend corresponds to the DNS template specified when creating the public frontend record above."]}),"\n",(0,o.jsx)(n.h2,{id:"create-a-user-account",children:"Create a User Account"}),"\n",(0,o.jsxs)(n.p,{children:["With our ",(0,o.jsx)(n.code,{children:"ZROK_ADMIN_TOKEN"})," and ",(0,o.jsx)(n.code,{children:"ZROK_API_ENDPOINT"})," environment variables set, we can create our first user account."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"zrok admin create account etc/ctrl.yml \n"})}),"\n",(0,o.jsx)(n.p,{children:"The output is the account token you will use to enable each device's zrok environment."}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-buttonless",metastring:'title="Example output"',children:"SuGzRPjVDIcF\n"})}),"\n",(0,o.jsx)(n.h2,{id:"invite-additional-users",children:"Invite Additional Users"}),"\n",(0,o.jsxs)(n.p,{children:["Offer this onboarding method to your users if you have configured an email-sending service in your ",(0,o.jsx)(n.code,{children:"zrok"})," controller configuration."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"$ zrok invite\nNew Email: user@domain.com\nConfirm Email: user@domain.com\ninvitation sent to 'user@domain.com'!\n"})}),"\n",(0,o.jsxs)(n.p,{children:["If you look at the console output from your ",(0,o.jsx)(n.code,{children:"zrok"})," controller, you'll see a message like this:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"[ 238.168] INFO zrok/controller.(*inviteHandler).Handle: account request for 'user@domain.com' has registration token 'U2Ewt1UCn3ql'\n"})}),"\n",(0,o.jsxs)(n.p,{children:["You can access your ",(0,o.jsx)(n.code,{children:"zrok"})," controller's registration UI by pointing a web browser at:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"http://localhost:18080/register/U2Ewt1UCn3ql\n"})}),"\n",(0,o.jsx)(n.p,{children:"The UI will ask you to set a password for your new account. Go ahead and do that."}),"\n",(0,o.jsx)(n.p,{children:"After doing that, I see the following output in my controller console:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"[ 516.778] INFO zrok/controller.(*registerHandler).Handle: created account 'user@domain.com' with token 'SuGzRPjVDIcF'\n"})}),"\n",(0,o.jsxs)(n.p,{children:["Keep track of the token listed above (",(0,o.jsx)(n.code,{children:"SuGzRPjVDIcF"}),"). We'll use this to enable our shell for this ",(0,o.jsx)(n.code,{children:"zrok"})," deployment."]}),"\n",(0,o.jsx)(n.h2,{id:"enable-your-environment",children:"Enable Your Environment"}),"\n",(0,o.jsx)(n.p,{children:"On another device that can reach your Linux server by FQDN, configure the API endpoint and enable the environment with the account token you received when you created the first user account."}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"export ZROK_API_ENDPOINT=https://zrok.quigley.com\n# or\nzrok config set apiEndpoint https://zrok.quigley.com\n"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"zrok enable SuGzRPjVDIcF\n"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-buttonless",metastring:'title="Example output"',children:"zrok environment '2AS1WZ3Sz' enabled for 'SuGzRPjVDIcF'\n"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"zrok status --secrets\n"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-buttonless",metastring:'title="Example output"',children:"Config:\n\n CONFIG VALUE SOURCE\n apiEndpoint https://zrok.quigley.com env\n\nEnvironment:\n\n PROPERTY VALUE\n Secret Token SuGzRPjVDIcF\n Ziti Identity 2AS1WZ3Sz\n"})}),"\n",(0,o.jsxs)(n.p,{children:["Congratulations. You have a working ",(0,o.jsx)(n.code,{children:"zrok"})," environment!"]})]})}function h(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(a,{...e})}):a(e)}},1855:(e,n,r)=>{r.d(n,{Z:()=>o});const o=r.p+"assets/files/ctrl-8468281a3bbdbc5852c252b0af86a113.yml"},1151:(e,n,r)=>{r.d(n,{Z:()=>l,a:()=>s});var o=r(7294);const t={},i=o.createContext(t);function s(e){const n=o.useContext(i);return o.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(t):e.components||t:s(e.components),o.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[5882],{475:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>c,contentTitle:()=>s,default:()=>h,frontMatter:()=>i,metadata:()=>l,toc:()=>d});var o=r(5893),t=r(1151);const i={sidebar_position:40,title:"Self-Hosting Guide for Linux",sidebar_label:"Linux"},s=void 0,l={id:"guides/self-hosting/linux/index",title:"Self-Hosting Guide for Linux",description:"Walkthrough Video",source:"@site/../docs/guides/self-hosting/linux/index.mdx",sourceDirName:"guides/self-hosting/linux",slug:"/guides/self-hosting/linux/",permalink:"/docs/guides/self-hosting/linux/",draft:!1,unlisted:!1,editUrl:"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/self-hosting/linux/index.mdx",tags:[],version:"current",sidebarPosition:40,frontMatter:{sidebar_position:40,title:"Self-Hosting Guide for Linux",sidebar_label:"Linux"},sidebar:"tutorialSidebar",previous:{title:"Self Hosting",permalink:"/docs/category/self-hosting"},next:{title:"NGINX TLS",permalink:"/docs/guides/self-hosting/linux/nginx"}},c={},d=[{value:"Walkthrough Video",id:"walkthrough-video",level:2},{value:"Before you Begin",id:"before-you-begin",level:2},{value:"OpenZiti",id:"openziti",level:2},{value:"Install zrok",id:"install-zrok",level:2},{value:"Configure the Controller",id:"configure-the-controller",level:2},{value:"Environment Variables",id:"environment-variables",level:2},{value:"Bootstrap OpenZiti for zrok",id:"bootstrap-openziti-for-zrok",level:2},{value:"Run zrok Controller",id:"run-zrok-controller",level:2},{value:"Create zrok Frontend",id:"create-zrok-frontend",level:2},{value:"Configure the Public Frontend",id:"configure-the-public-frontend",level:2},{value:"Start Public Frontend",id:"start-public-frontend",level:2},{value:"Create a User Account",id:"create-a-user-account",level:2},{value:"Invite Additional Users",id:"invite-additional-users",level:2},{value:"Enable Your Environment",id:"enable-your-environment",level:2}];function a(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",ul:"ul",...(0,t.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.h2,{id:"walkthrough-video",children:"Walkthrough Video"}),"\n",(0,o.jsx)("iframe",{width:"100%",height:"315",src:"https://www.youtube.com/embed/870A5dke_u4",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowfullscreen:!0}),"\n",(0,o.jsx)(n.h2,{id:"before-you-begin",children:"Before you Begin"}),"\n",(0,o.jsxs)(n.p,{children:["This will get you up and running with a self-hosted instance of ",(0,o.jsx)(n.code,{children:"zrok"}),". I'll assume you have the following:"]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"a Linux server with a public IP"}),"\n",(0,o.jsxs)(n.li,{children:["a wildcard DNS record like ",(0,o.jsx)(n.code,{children:"*.zrok.quigley.com"})," that resolves to the server IP"]}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"openziti",children:"OpenZiti"}),"\n",(0,o.jsxs)(n.p,{children:['OpenZiti (a.k.a. "Ziti") provides secure network backhaul for ',(0,o.jsx)(n.code,{children:"zrok"})," public and private shares. You need a Ziti Controller and a Ziti Router. You can run everything on the same Linux VPS."]}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Install the Ziti Controller package by following the ",(0,o.jsx)(n.a,{href:"https://openziti.io/docs/category/deployments",children:"Linux controller deployment guide"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Ensure your answer file (",(0,o.jsx)(n.code,{children:"/opt/openziti/etc/controller/bootstrap.env"}),") has the FQDN of your Linux server and an admin password defined."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Ensure your firewall allows the controller port from the answer file."}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Start the controller service (",(0,o.jsx)(n.code,{children:"ziti-controller.service"}),") and check the status."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Log in to the Ziti Controller"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"ziti edge login localhost:1280 -u admin -p \n"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Administratively Create a Ziti Router"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:'ziti edge create edge-router "router1" -o /tmp/router1.jwt\n'})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Install the Ziti Router package by following ",(0,o.jsx)(n.a,{href:"https://openziti.io/docs/category/deployments",children:"the Linux router deployment guide"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Ensure your answer file (",(0,o.jsx)(n.code,{children:"/opt/openziti/etc/router/bootstrap.env"}),") has the FQDN of your Linux server for both controller and router addresses and the enrollment token from the previous step."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Ensure your firewall allows the router port from the answer file."}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Start the router service (",(0,o.jsx)(n.code,{children:"ziti-router.service"}),") and check the status."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Verify the new router is online."}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"ziti edge list edge-routers\n"})}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"install-zrok",children:"Install zrok"}),"\n",(0,o.jsxs)(n.p,{children:["Debian and RPM packages are available for ",(0,o.jsx)(n.code,{children:"zrok"}),"."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"sudo apt install zrok\n"})}),"\n",(0,o.jsxs)(n.p,{children:["Follow ",(0,o.jsx)(n.a,{href:"/docs/guides/install/linux",children:"the Linux installation guide"})," to install the ",(0,o.jsx)(n.code,{children:"zrok"})," package from the repository or manually install the binary for your platform."]}),"\n",(0,o.jsx)(n.h2,{id:"configure-the-controller",children:"Configure the Controller"}),"\n",(0,o.jsxs)(n.p,{children:["Create a ",(0,o.jsx)(n.code,{children:"zrok"})," controller configuration file in ",(0,o.jsx)(n.code,{children:"etc/ctrl.yml"}),". The controller can terminate TLS or you may front the server with a reverse proxy that continually renews the necessary wildcard certificate (e.g., Caddy w/ a DNS provider plugin). This example will expose the non-TLS listener for the controller."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:'# _____ __ ___ | | __\n# |_ / \'__/ _ \\| |/ /\n# / /| | | (_) | <\n# /___|_| \\___/|_|\\_\\\n# controller configuration\n\nv: 3\n\nadmin:\n # generate these admin tokens from a source of randomness, e.g. \n # LC_ALL=C tr -dc _A-Z-a-z-0-9 < /dev/urandom | head -c32\n secrets:\n - Q8V0LqnNb5wNX9kE1fgQ0H6VlcvJybB1 # be sure to change this!\n\nendpoint:\n host: 0.0.0.0\n port: 18080\n\ninvites:\n invites_open: true\n\nstore:\n path: zrok.db\n type: sqlite3\n\nziti:\n api_endpoint: "https://127.0.0.1:1280"\n username: admin\n password: "XO0xHp75uuyeireO2xmmVlK91T7B9fpD"\n\n# you can use certbot to renew the wildcard cert for the controller with a DNS provider API token or front this `zrok` # controller with Caddy\n#tls:\n# cert_path: "/Path/To/Cert/zrok.crt"\n# key_path: "/Path/To/Cert/zrok.key"\n\n'})}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"admin"})," section defines privileged administrative credentials and must be set in the ",(0,o.jsx)(n.code,{children:"ZROK_ADMIN_TOKEN"})," environment variable in shells where you want to run ",(0,o.jsx)(n.code,{children:"zrok admin"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"endpoint"})," section defines where your ",(0,o.jsx)(n.code,{children:"zrok"})," controller will listen."]}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"store"})," section defines the local ",(0,o.jsx)(n.code,{children:"sqlite3"})," database used by the controller."]}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"ziti"})," section defines how the ",(0,o.jsx)(n.code,{children:"zrok"})," controller should communicate with your OpenZiti installation. When using the OpenZiti quickstart, an administrative password will be generated; the ",(0,o.jsx)(n.code,{children:"password"})," in the ",(0,o.jsx)(n.code,{children:"ziti"})," stanza should reflect this password."]}),"\n",(0,o.jsxs)(n.admonition,{type:"note",children:[(0,o.jsxs)(n.p,{children:["Be sure to see the ",(0,o.jsxs)(n.a,{target:"_blank","data-noBrokenLinkCheck":!0,href:r(7996).Z+"",children:["reference configuration at ",(0,o.jsx)(n.code,{children:"etc/ctrl.yml"})]})," for the complete documentation of the current configuration file format for the ",(0,o.jsx)(n.code,{children:"zrok"})," controller and service instance components."]}),(0,o.jsxs)(n.p,{children:["See the separate guides on ",(0,o.jsx)(n.a,{href:"/docs/guides/self-hosting/metrics-and-limits/configuring-metrics",children:"configuring metrics"})," and ",(0,o.jsx)(n.a,{href:"/docs/guides/self-hosting/metrics-and-limits/configuring-limits",children:"configuring limits"})," for details about both of these specialized areas of service instance configuration."]})]}),"\n",(0,o.jsx)(n.h2,{id:"environment-variables",children:"Environment Variables"}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"zrok"})," binaries are configured to work with the global ",(0,o.jsx)(n.code,{children:"zrok.io"})," service, and default to using ",(0,o.jsx)(n.code,{children:"api.zrok.io"})," as the endpoint for communicating with the service."]}),"\n",(0,o.jsxs)(n.p,{children:["To work with a self-hosted ",(0,o.jsx)(n.code,{children:"zrok"})," deployment, you'll need to set the ",(0,o.jsx)(n.code,{children:"ZROK_API_ENDPOINT"})," environment variable to point to the address where your ",(0,o.jsx)(n.code,{children:"zrok"})," controller will be listening, according to ",(0,o.jsx)(n.code,{children:"endpoint"})," in the configuration file above."]}),"\n",(0,o.jsx)(n.p,{children:"In my case, I've set:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"export ZROK_API_ENDPOINT=http://127.0.0.1:18080\n"})}),"\n",(0,o.jsxs)(n.p,{children:[(0,o.jsxs)(n.a,{href:"/docs/guides/self-hosting/instance-configuration",children:["Read more about configuring your self-hosted ",(0,o.jsx)(n.code,{children:"zrok"})," instance"]}),"."]}),"\n",(0,o.jsx)(n.h2,{id:"bootstrap-openziti-for-zrok",children:"Bootstrap OpenZiti for zrok"}),"\n",(0,o.jsxs)(n.p,{children:["With your OpenZiti network running and your configuration saved to a local file (I refer to mine as ",(0,o.jsx)(n.code,{children:"etc/ctrl.yml"})," in these examples), you're ready to bootstrap the Ziti network."]}),"\n",(0,o.jsxs)(n.p,{children:["Use the ",(0,o.jsx)(n.code,{children:"zrok admin bootstrap"})," command to bootstrap like this:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"$ zrok admin bootstrap etc/ctrl.yml\n[ 0.002] INFO main.(*adminBootstrap).run: {\n\t...\n}\n[ 0.002] INFO zrok/controller/store.Open: database connected\n[ 0.006] INFO zrok/controller/store.(*Store).migrate: applied 0 migrations\n[ 0.006] INFO zrok/controller.Bootstrap: connecting to the ziti edge management api\n[ 0.039] INFO zrok/controller.Bootstrap: creating identity for controller ziti access\n[ 0.071] INFO zrok/controller.Bootstrap: controller identity: jKd8AINSz\n[ 0.082] INFO zrok/controller.assertIdentity: asserted identity 'jKd8AINSz'\n[ 0.085] INFO zrok/controller.assertErpForIdentity: asserted erps for 'ctrl' (jKd8AINSz)\n[ 0.085] INFO zrok/controller.Bootstrap: creating identity for frontend ziti access\n[ 0.118] INFO zrok/controller.Bootstrap: frontend identity: sqJRAINSiB\n[ 0.119] INFO zrok/controller.assertIdentity: asserted identity 'sqJRAINSiB'\n[ 0.120] INFO zrok/controller.assertErpForIdentity: asserted erps for 'frontend' (sqJRAINSiB)\n[ 0.120] WARNING zrok/controller.Bootstrap: missing public frontend for ziti id 'sqJRAINSiB'; please use 'zrok admin create frontend sqJRAINSiB public https://{token}.your.dns.name' to create a frontend instance\n[ 0.123] INFO zrok/controller.assertZrokProxyConfigType: found 'zrok.proxy.v1' config type with id '33CyjNbIepkXHN5VzGDA8L'\n[ 0.124] INFO zrok/controller.assertMetricsService: creating 'metrics' service\n[ 0.126] INFO zrok/controller.assertMetricsService: asserted 'metrics' service (5RpPZZ7T8bZf1ENjwGiPc3)\n[ 0.128] INFO zrok/controller.assertMetricsSerp: creating 'metrics' serp\n[ 0.130] INFO zrok/controller.assertMetricsSerp: asserted 'metrics' serp\n[ 0.134] INFO zrok/controller.assertCtrlMetricsBind: creating 'ctrl-metrics-bind' service policy\n[ 0.135] INFO zrok/controller.assertCtrlMetricsBind: asserted 'ctrl-metrics-bind' service policy\n[ 0.138] INFO zrok/controller.assertFrontendMetricsDial: creating 'frontend-metrics-dial' service policy\n[ 0.140] INFO zrok/controller.assertFrontendMetricsDial: asserted 'frontend-metrics-dial' service policy\n[ 0.140] INFO main.(*adminBootstrap).run: bootstrap complete!\n"})}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"zrok admin bootstrap"})," command configures the ",(0,o.jsx)(n.code,{children:"zrok"})," database, the necessary OpenZiti identities, and all of the OpenZiti policies required to run a ",(0,o.jsx)(n.code,{children:"zrok"})," service."]}),"\n",(0,o.jsx)(n.p,{children:"Notice this warning:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"[ 0.120] WARNING zrok/controller.Bootstrap: missing public frontend for ziti id 'sqJRAINSiB'; please use 'zrok admin create frontend sqJRAINSiB public https://{token}.your.dns.name' to create a frontend instance\n"})}),"\n",(0,o.jsxs)(n.p,{children:["If you find it necessary to re-run the ",(0,o.jsx)(n.code,{children:"zrok admin bootstrap"})," command, you may need to add the ",(0,o.jsx)(n.code,{children:"--skip-frontend"})," flag to avoid re-creating the default ",(0,o.jsx)(n.code,{children:"public"})," frontend's Ziti identity and router policy."]}),"\n",(0,o.jsx)(n.h2,{id:"run-zrok-controller",children:"Run zrok Controller"}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"zrok"}),' bootstrap process wants us to create a "public frontend" for our service. ',(0,o.jsx)(n.code,{children:"zrok"})," uses public frontends to allow users to specify where they would like public traffic to ingress from."]}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"zrok admin create frontend"})," command requires a running ",(0,o.jsx)(n.code,{children:"zrok"})," controller, so let's start that up first:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"$ zrok controller etc/ctrl.yml \n[ 0.003] INFO main.(*controllerCommand).run: {\n\t...\n}\n[ 0.016] INFO zrok/controller.inspectZiti: inspecting ziti controller configuration\n[ 0.048] INFO zrok/controller.findZrokProxyConfigType: found 'zrok.proxy.v1' config type with id '33CyjNbIepkXHN5VzGDA8L'\n[ 0.048] INFO zrok/controller/store.Open: database connected\n[ 0.048] INFO zrok/controller/store.(*Store).migrate: applied 0 migrations\n[ 0.049] INFO zrok/controller.(*metricsAgent).run: starting\n[ 0.064] INFO zrok/rest_server_zrok.setupGlobalMiddleware: configuring\n[ 0.064] INFO zrok/ui.StaticBuilder: building\n[ 0.065] INFO zrok/rest_server_zrok.(*Server).Logf: Serving zrok at http://[::]:18080\n[ 0.085] INFO zrok/controller.(*metricsAgent).listen: started\n"})}),"\n",(0,o.jsx)(n.h2,{id:"create-zrok-frontend",children:"Create zrok Frontend"}),"\n",(0,o.jsxs)(n.p,{children:["With our ",(0,o.jsx)(n.code,{children:"ZROK_ADMIN_TOKEN"})," and ",(0,o.jsx)(n.code,{children:"ZROK_API_ENDPOINT"})," environment variables set, we can create our public frontend like this:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"$ zrok admin create frontend sqJRAINSiB public http://{token}.zrok.quigley.com:8080\n[ 0.037] INFO main.(*adminCreateFrontendCommand).run: created global public frontend 'WEirJNHVlcW9'\n"})}),"\n",(0,o.jsxs)(n.p,{children:["The id of the frontend was emitted earlier in by the ",(0,o.jsx)(n.code,{children:"zrok"})," controller when we ran the bootstrap command. If you don't have that log message the you can find the id again with the ",(0,o.jsx)(n.code,{children:"ziti"})," CLI like this:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"# log in as admin (example)\nziti edge login localhost:1280 -u admin -p XO0xHp75uuyeireO2xmmVlK91T7B9fpD\n\n# list Ziti identities created by the quickstart and bootstrap\nziti edge list identities\n"})}),"\n",(0,o.jsx)(n.p,{children:'The id is shown for the frontend identity named "public."'}),"\n",(0,o.jsxs)(n.p,{children:["Nice work! The ",(0,o.jsx)(n.code,{children:"zrok"})," controller is fully configured now that you have created the ",(0,o.jsx)(n.code,{children:"zrok"})," frontend."]}),"\n",(0,o.jsx)(n.h2,{id:"configure-the-public-frontend",children:"Configure the Public Frontend"}),"\n",(0,o.jsxs)(n.p,{children:["Create an http frontend configuration file in ",(0,o.jsx)(n.code,{children:"etc/http-frontend.yml"}),"."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-yaml",children:"v: 3\nhost_match: zrok.quigley.com\naddress: 0.0.0.0:8080\n"})}),"\n",(0,o.jsxs)(n.p,{children:["This frontend config file has a ",(0,o.jsx)(n.code,{children:"host_match"})," pattern that represents the DNS zone you're using with this instance of ",(0,o.jsx)(n.code,{children:"zrok"}),". Incoming HTTP requests with a matching ",(0,o.jsx)(n.code,{children:"Host"})," header will be handled by this frontend. You may also specify the interface address where the frontend will listen for public access requests."]}),"\n",(0,o.jsxs)(n.p,{children:["The frontend does not provide server TLS, but you may front the server with a reverse proxy. It is essential the reverse proxy forwards the ",(0,o.jsx)(n.code,{children:"Host"})," header supplied by the viewer. This example will expose the non-TLS listener for the frontend."]}),"\n",(0,o.jsxs)(n.p,{children:["You can also specify an ",(0,o.jsx)(n.code,{children:"oauth"})," configuration in this file, full details of are found in ",(0,o.jsx)(n.a,{href:"/docs/guides/self-hosting/oauth/configuring-oauth#configuring-your-public-frontend",children:"OAuth Public Frontend Configuration"}),"."]}),"\n",(0,o.jsx)(n.h2,{id:"start-public-frontend",children:"Start Public Frontend"}),"\n",(0,o.jsx)(n.p,{children:"In another terminal window, run:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"$ zrok access public etc/http-frontend.yml\n[ 0.002] INFO main.(*accessPublicCommand).run: {\n\t...\n}\n[ 0.002] INFO zrok/endpoints/public_frontend.newMetricsAgent: loaded 'public' identity\n"})}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"zrok"})," frontend uses the ",(0,o.jsx)(n.code,{children:"public"})," identity created during the bootstrap process to securely access zrok backends. to provide public access for the ",(0,o.jsx)(n.code,{children:"zrok"})," deployment. It is expected that the configured listener for this frontend corresponds to the DNS template specified when creating the public frontend record above."]}),"\n",(0,o.jsx)(n.h2,{id:"create-a-user-account",children:"Create a User Account"}),"\n",(0,o.jsxs)(n.p,{children:["With our ",(0,o.jsx)(n.code,{children:"ZROK_ADMIN_TOKEN"})," and ",(0,o.jsx)(n.code,{children:"ZROK_API_ENDPOINT"})," environment variables set, we can create our first user account."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"zrok admin create account etc/ctrl.yml \n"})}),"\n",(0,o.jsx)(n.p,{children:"The output is the account token you will use to enable each device's zrok environment."}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-buttonless",metastring:'title="Example output"',children:"SuGzRPjVDIcF\n"})}),"\n",(0,o.jsx)(n.h2,{id:"invite-additional-users",children:"Invite Additional Users"}),"\n",(0,o.jsxs)(n.p,{children:["Offer this onboarding method to your users if you have configured an email-sending service in your ",(0,o.jsx)(n.code,{children:"zrok"})," controller configuration."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"$ zrok invite\nNew Email: user@domain.com\nConfirm Email: user@domain.com\ninvitation sent to 'user@domain.com'!\n"})}),"\n",(0,o.jsxs)(n.p,{children:["If you look at the console output from your ",(0,o.jsx)(n.code,{children:"zrok"})," controller, you'll see a message like this:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"[ 238.168] INFO zrok/controller.(*inviteHandler).Handle: account request for 'user@domain.com' has registration token 'U2Ewt1UCn3ql'\n"})}),"\n",(0,o.jsxs)(n.p,{children:["You can access your ",(0,o.jsx)(n.code,{children:"zrok"})," controller's registration UI by pointing a web browser at:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"http://localhost:18080/register/U2Ewt1UCn3ql\n"})}),"\n",(0,o.jsx)(n.p,{children:"The UI will ask you to set a password for your new account. Go ahead and do that."}),"\n",(0,o.jsx)(n.p,{children:"After doing that, I see the following output in my controller console:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"[ 516.778] INFO zrok/controller.(*registerHandler).Handle: created account 'user@domain.com' with token 'SuGzRPjVDIcF'\n"})}),"\n",(0,o.jsxs)(n.p,{children:["Keep track of the token listed above (",(0,o.jsx)(n.code,{children:"SuGzRPjVDIcF"}),"). We'll use this to enable our shell for this ",(0,o.jsx)(n.code,{children:"zrok"})," deployment."]}),"\n",(0,o.jsx)(n.h2,{id:"enable-your-environment",children:"Enable Your Environment"}),"\n",(0,o.jsx)(n.p,{children:"On another device that can reach your Linux server by FQDN, configure the API endpoint and enable the environment with the account token you received when you created the first user account."}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"export ZROK_API_ENDPOINT=https://zrok.quigley.com\n# or\nzrok config set apiEndpoint https://zrok.quigley.com\n"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"zrok enable SuGzRPjVDIcF\n"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-buttonless",metastring:'title="Example output"',children:"zrok environment '2AS1WZ3Sz' enabled for 'SuGzRPjVDIcF'\n"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",children:"zrok status --secrets\n"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-buttonless",metastring:'title="Example output"',children:"Config:\n\n CONFIG VALUE SOURCE\n apiEndpoint https://zrok.quigley.com env\n\nEnvironment:\n\n PROPERTY VALUE\n Secret Token SuGzRPjVDIcF\n Ziti Identity 2AS1WZ3Sz\n"})}),"\n",(0,o.jsxs)(n.p,{children:["Congratulations. You have a working ",(0,o.jsx)(n.code,{children:"zrok"})," environment!"]})]})}function h(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(a,{...e})}):a(e)}},7996:(e,n,r)=>{r.d(n,{Z:()=>o});const o=r.p+"assets/files/ctrl-8468281a3bbdbc5852c252b0af86a113.yml"},1151:(e,n,r)=>{r.d(n,{Z:()=>l,a:()=>s});var o=r(7294);const t={},i=o.createContext(t);function s(e){const n=o.useContext(i);return o.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(t):e.components||t:s(e.components),o.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ea84f538.c90ec1c3.js b/assets/js/ea84f538.c90ec1c3.js deleted file mode 100644 index 31cd0f80..00000000 --- a/assets/js/ea84f538.c90ec1c3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[9944],{7105:e=>{e.exports=JSON.parse('{"version":{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"Getting Started","href":"/docs/getting-started","docId":"getting-started","unlisted":false},{"type":"category","label":"Concepts","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Private Shares","href":"/docs/concepts/sharing-private","docId":"concepts/sharing-private","unlisted":false},{"type":"link","label":"Public Shares","href":"/docs/concepts/sharing-public","docId":"concepts/sharing-public","unlisted":false},{"type":"link","label":"Reserved Shares","href":"/docs/concepts/sharing-reserved","docId":"concepts/sharing-reserved","unlisted":false},{"type":"link","label":"Sharing HTTP Servers","href":"/docs/concepts/http","docId":"concepts/http","unlisted":false},{"type":"link","label":"Sharing TCP and UDP Servers","href":"/docs/concepts/tunnels","docId":"concepts/tunnels","unlisted":false},{"type":"link","label":"Sharing Websites and Files","href":"/docs/concepts/files","docId":"concepts/files","unlisted":false},{"type":"link","label":"Open Source","href":"/docs/concepts/opensource","docId":"concepts/opensource","unlisted":false},{"type":"link","label":"Hosting","href":"/docs/concepts/hosting","docId":"concepts/hosting","unlisted":false}],"href":"/docs/concepts/"},{"type":"category","label":"Guides","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"Install","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Linux","href":"/docs/guides/install/linux","docId":"guides/install/linux","unlisted":false},{"type":"link","label":"macOS","href":"/docs/guides/install/macos","docId":"guides/install/macos","unlisted":false},{"type":"link","label":"Windows","href":"/docs/guides/install/windows","docId":"guides/install/windows","unlisted":false}],"href":"/docs/guides/install/"},{"type":"link","label":"frontdoor","href":"/docs/guides/frontdoor","docId":"guides/frontdoor","unlisted":false},{"type":"link","label":"Permission Modes","href":"/docs/guides/permission-modes","docId":"guides/permission-modes","unlisted":false},{"type":"category","label":"Docker Share","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Public Share","href":"/docs/guides/docker-share/docker_public_share_guide","docId":"guides/docker-share/docker_public_share_guide","unlisted":false},{"type":"link","label":"Private Share","href":"/docs/guides/docker-share/docker_private_share_guide","docId":"guides/docker-share/docker_private_share_guide","unlisted":false}],"href":"/docs/guides/docker-share/"},{"type":"category","label":"Self Hosting","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"Linux","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"NGINX TLS","href":"/docs/guides/self-hosting/linux/nginx","docId":"guides/self-hosting/linux/nginx","unlisted":false}],"href":"/docs/guides/self-hosting/linux/"},{"type":"link","label":"Personalized Frontend","href":"/docs/guides/self-hosting/personalized-frontend","docId":"guides/self-hosting/personalized-frontend","unlisted":false},{"type":"link","label":"Docker","href":"/docs/guides/self-hosting/docker","docId":"guides/self-hosting/docker","unlisted":false},{"type":"category","label":"Metrics and Limits","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Configuring Metrics","href":"/docs/guides/self-hosting/metrics-and-limits/configuring-metrics","docId":"guides/self-hosting/metrics-and-limits/configuring-metrics","unlisted":false},{"type":"link","label":"Configuring Limits","href":"/docs/guides/self-hosting/metrics-and-limits/configuring-limits","docId":"guides/self-hosting/metrics-and-limits/configuring-limits","unlisted":false}],"href":"/docs/category/metrics-and-limits"},{"type":"category","label":"OAuth","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"OAuth Public Frontend Configuration","href":"/docs/guides/self-hosting/oauth/configuring-oauth","docId":"guides/self-hosting/oauth/configuring-oauth","unlisted":false}],"href":"/docs/category/oauth"},{"type":"link","label":"Instance Config","href":"/docs/guides/self-hosting/instance-configuration","docId":"guides/self-hosting/instance-configuration","unlisted":false}],"href":"/docs/category/self-hosting"},{"type":"category","label":"drives","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"The Drives CLI","href":"/docs/guides/drives/cli","docId":"guides/drives/cli","unlisted":false}]},{"type":"link","label":"VPN","href":"/docs/guides/vpn/","docId":"guides/vpn/vpn","unlisted":false}],"href":"/docs/category/guides"}]},"docs":{"concepts/files":{"id":"concepts/files","title":"Sharing Websites and Files","description":"With zrok it is possible to share files quickly and easily as well. To share files using zrok use","sidebar":"tutorialSidebar"},"concepts/hosting":{"id":"concepts/hosting","title":"Hosting","description":"Self-Hosted","sidebar":"tutorialSidebar"},"concepts/http":{"id":"concepts/http","title":"Sharing HTTP Servers","description":"zrok can share HTTP and HTTPS resources natively. If you have an existing web server that you want to share with other users, you can use the zrok share command using the --backend-mode proxy flag.","sidebar":"tutorialSidebar"},"concepts/index":{"id":"concepts/index","title":"Concepts","description":"zrok was designed to make sharing local resources both secure and easy. In this section of the zrok documentation, we\'ll tour through all of the most important features.","sidebar":"tutorialSidebar"},"concepts/opensource":{"id":"concepts/opensource","title":"Open Source","description":"It\'s important to the zrok project that it remain free and open source software. The code is available on GitHub","sidebar":"tutorialSidebar"},"concepts/sharing-private":{"id":"concepts/sharing-private","title":"Private Shares","description":"zrok was built to share and access digital resources. A private share allows a resource to be","sidebar":"tutorialSidebar"},"concepts/sharing-public":{"id":"concepts/sharing-public","title":"Public Shares","description":"zrok supports public sharing for web-based (HTTP and HTTPS) resources. These resources are easily shared with the general internet through public access points.","sidebar":"tutorialSidebar"},"concepts/sharing-reserved":{"id":"concepts/sharing-reserved","title":"Reserved Shares","description":"By default a public or private share is assigned a share token when you create a share using the zrok share command. The zrok share command is the bridge between your local environment and the users you are sharing with. When you terminate the zrok share, the bridge is eliminated and the share token is deleted. If you run zrok share again, you will be allocated a brand new share token.","sidebar":"tutorialSidebar"},"concepts/tunnels":{"id":"concepts/tunnels","title":"Sharing TCP and UDP Servers","description":"zrok includes support for sharing low-level TCP and UDP network resources using the tcpTunnel and udpTunnel backend modes.","sidebar":"tutorialSidebar"},"getting-started":{"id":"getting-started","title":"Getting Started with zrok","description":"What\'s a zrok?","sidebar":"tutorialSidebar"},"guides/docker-share/docker_private_share_guide":{"id":"guides/docker-share/docker_private_share_guide","title":"Docker Private Share","description":"Goal","sidebar":"tutorialSidebar"},"guides/docker-share/docker_public_share_guide":{"id":"guides/docker-share/docker_public_share_guide","title":"Docker Compose Public Share","description":"Goal","sidebar":"tutorialSidebar"},"guides/docker-share/index":{"id":"guides/docker-share/index","title":"Getting Started with Docker","description":"Overview","sidebar":"tutorialSidebar"},"guides/drives/cli":{"id":"guides/drives/cli","title":"The Drives CLI","description":"The zrok drives CLI tools allow for simple, ergonomic management and synchronization of local and remote files.","sidebar":"tutorialSidebar"},"guides/frontdoor":{"id":"guides/frontdoor","title":"zrok frontdoor","description":"zrok frontdoor is the heavy-duty front door to your app or site. It makes your website or app available to your online audience through the shield of zrok.io\'s hardened, managed frontends.","sidebar":"tutorialSidebar"},"guides/install/index":{"id":"guides/install/index","title":"Install","description":"{e.exports=JSON.parse('{"version":{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"Getting Started","href":"/docs/getting-started","docId":"getting-started","unlisted":false},{"type":"category","label":"Concepts","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Private Shares","href":"/docs/concepts/sharing-private","docId":"concepts/sharing-private","unlisted":false},{"type":"link","label":"Public Shares","href":"/docs/concepts/sharing-public","docId":"concepts/sharing-public","unlisted":false},{"type":"link","label":"Reserved Shares","href":"/docs/concepts/sharing-reserved","docId":"concepts/sharing-reserved","unlisted":false},{"type":"link","label":"Sharing HTTP Servers","href":"/docs/concepts/http","docId":"concepts/http","unlisted":false},{"type":"link","label":"Sharing TCP and UDP Servers","href":"/docs/concepts/tunnels","docId":"concepts/tunnels","unlisted":false},{"type":"link","label":"Sharing Websites and Files","href":"/docs/concepts/files","docId":"concepts/files","unlisted":false},{"type":"link","label":"Open Source","href":"/docs/concepts/opensource","docId":"concepts/opensource","unlisted":false},{"type":"link","label":"Hosting","href":"/docs/concepts/hosting","docId":"concepts/hosting","unlisted":false}],"href":"/docs/concepts/"},{"type":"category","label":"Guides","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"Install","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Linux","href":"/docs/guides/install/linux","docId":"guides/install/linux","unlisted":false},{"type":"link","label":"macOS","href":"/docs/guides/install/macos","docId":"guides/install/macos","unlisted":false},{"type":"link","label":"Windows","href":"/docs/guides/install/windows","docId":"guides/install/windows","unlisted":false}],"href":"/docs/guides/install/"},{"type":"link","label":"frontdoor","href":"/docs/guides/frontdoor","docId":"guides/frontdoor","unlisted":false},{"type":"link","label":"Permission Modes","href":"/docs/guides/permission-modes","docId":"guides/permission-modes","unlisted":false},{"type":"category","label":"Docker Share","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Public Share","href":"/docs/guides/docker-share/docker_public_share_guide","docId":"guides/docker-share/docker_public_share_guide","unlisted":false},{"type":"link","label":"Private Share","href":"/docs/guides/docker-share/docker_private_share_guide","docId":"guides/docker-share/docker_private_share_guide","unlisted":false}],"href":"/docs/guides/docker-share/"},{"type":"category","label":"Self Hosting","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"Linux","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"NGINX TLS","href":"/docs/guides/self-hosting/linux/nginx","docId":"guides/self-hosting/linux/nginx","unlisted":false}],"href":"/docs/guides/self-hosting/linux/"},{"type":"link","label":"Interstitial Pages","href":"/docs/guides/self-hosting/interstitial-page","docId":"guides/self-hosting/interstitial-page","unlisted":false},{"type":"link","label":"Personalized Frontend","href":"/docs/guides/self-hosting/personalized-frontend","docId":"guides/self-hosting/personalized-frontend","unlisted":false},{"type":"link","label":"Docker","href":"/docs/guides/self-hosting/docker","docId":"guides/self-hosting/docker","unlisted":false},{"type":"category","label":"Metrics and Limits","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Configuring Metrics","href":"/docs/guides/self-hosting/metrics-and-limits/configuring-metrics","docId":"guides/self-hosting/metrics-and-limits/configuring-metrics","unlisted":false},{"type":"link","label":"Configuring Limits","href":"/docs/guides/self-hosting/metrics-and-limits/configuring-limits","docId":"guides/self-hosting/metrics-and-limits/configuring-limits","unlisted":false}],"href":"/docs/category/metrics-and-limits"},{"type":"category","label":"OAuth","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"OAuth Public Frontend Configuration","href":"/docs/guides/self-hosting/oauth/configuring-oauth","docId":"guides/self-hosting/oauth/configuring-oauth","unlisted":false}],"href":"/docs/category/oauth"},{"type":"link","label":"Instance Config","href":"/docs/guides/self-hosting/instance-configuration","docId":"guides/self-hosting/instance-configuration","unlisted":false}],"href":"/docs/category/self-hosting"},{"type":"category","label":"drives","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"The Drives CLI","href":"/docs/guides/drives/cli","docId":"guides/drives/cli","unlisted":false}]},{"type":"link","label":"VPN","href":"/docs/guides/vpn/","docId":"guides/vpn/vpn","unlisted":false}],"href":"/docs/category/guides"}]},"docs":{"concepts/files":{"id":"concepts/files","title":"Sharing Websites and Files","description":"With zrok it is possible to share files quickly and easily as well. To share files using zrok use","sidebar":"tutorialSidebar"},"concepts/hosting":{"id":"concepts/hosting","title":"Hosting","description":"Self-Hosted","sidebar":"tutorialSidebar"},"concepts/http":{"id":"concepts/http","title":"Sharing HTTP Servers","description":"zrok can share HTTP and HTTPS resources natively. If you have an existing web server that you want to share with other users, you can use the zrok share command using the --backend-mode proxy flag.","sidebar":"tutorialSidebar"},"concepts/index":{"id":"concepts/index","title":"Concepts","description":"zrok was designed to make sharing local resources both secure and easy. In this section of the zrok documentation, we\'ll tour through all of the most important features.","sidebar":"tutorialSidebar"},"concepts/opensource":{"id":"concepts/opensource","title":"Open Source","description":"It\'s important to the zrok project that it remain free and open source software. The code is available on GitHub","sidebar":"tutorialSidebar"},"concepts/sharing-private":{"id":"concepts/sharing-private","title":"Private Shares","description":"zrok was built to share and access digital resources. A private share allows a resource to be","sidebar":"tutorialSidebar"},"concepts/sharing-public":{"id":"concepts/sharing-public","title":"Public Shares","description":"zrok supports public sharing for web-based (HTTP and HTTPS) resources. These resources are easily shared with the general internet through public access points.","sidebar":"tutorialSidebar"},"concepts/sharing-reserved":{"id":"concepts/sharing-reserved","title":"Reserved Shares","description":"By default a public or private share is assigned a share token when you create a share using the zrok share command. The zrok share command is the bridge between your local environment and the users you are sharing with. When you terminate the zrok share, the bridge is eliminated and the share token is deleted. If you run zrok share again, you will be allocated a brand new share token.","sidebar":"tutorialSidebar"},"concepts/tunnels":{"id":"concepts/tunnels","title":"Sharing TCP and UDP Servers","description":"zrok includes support for sharing low-level TCP and UDP network resources using the tcpTunnel and udpTunnel backend modes.","sidebar":"tutorialSidebar"},"getting-started":{"id":"getting-started","title":"Getting Started with zrok","description":"What\'s a zrok?","sidebar":"tutorialSidebar"},"guides/docker-share/docker_private_share_guide":{"id":"guides/docker-share/docker_private_share_guide","title":"Docker Private Share","description":"Goal","sidebar":"tutorialSidebar"},"guides/docker-share/docker_public_share_guide":{"id":"guides/docker-share/docker_public_share_guide","title":"Docker Compose Public Share","description":"Goal","sidebar":"tutorialSidebar"},"guides/docker-share/index":{"id":"guides/docker-share/index","title":"Getting Started with Docker","description":"Overview","sidebar":"tutorialSidebar"},"guides/drives/cli":{"id":"guides/drives/cli","title":"The Drives CLI","description":"The zrok drives CLI tools allow for simple, ergonomic management and synchronization of local and remote files.","sidebar":"tutorialSidebar"},"guides/frontdoor":{"id":"guides/frontdoor","title":"zrok frontdoor","description":"zrok frontdoor is the heavy-duty front door to your app or site. It makes your website or app available to your online audience through the shield of zrok.io\'s hardened, managed frontends.","sidebar":"tutorialSidebar"},"guides/install/index":{"id":"guides/install/index","title":"Install","description":"{r.r(n),r.d(n,{assets:()=>a,contentTitle:()=>s,default:()=>h,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var t=r(5893),o=r(1151);const i={sidebar_position:50,sidebar_label:"NGINX TLS"},s="NGINX Reverse Proxy for zrok",l={id:"guides/self-hosting/linux/nginx",title:"NGINX Reverse Proxy for zrok",description:"Walkthrough Video",source:"@site/../docs/guides/self-hosting/linux/nginx.mdx",sourceDirName:"guides/self-hosting/linux",slug:"/guides/self-hosting/linux/nginx",permalink:"/docs/guides/self-hosting/linux/nginx",draft:!1,unlisted:!1,editUrl:"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/self-hosting/linux/nginx.mdx",tags:[],version:"current",sidebarPosition:50,frontMatter:{sidebar_position:50,sidebar_label:"NGINX TLS"},sidebar:"tutorialSidebar",previous:{title:"Linux",permalink:"/docs/guides/self-hosting/linux/"},next:{title:"Interstitial Pages",permalink:"/docs/guides/self-hosting/interstitial-page"}},a={},c=[{value:"Walkthrough Video",id:"walkthrough-video",level:2},{value:"Before You Begin",id:"before-you-begin",level:2},{value:"Choose a Reverse Proxy Address",id:"choose-a-reverse-proxy-address",level:2},{value:"Obtain a Wildcard Server Certificate",id:"obtain-a-wildcard-server-certificate",level:2},{value:"Install NGINX",id:"install-nginx",level:2},{value:"Configure NGINX",id:"configure-nginx",level:2},{value:"Restart NGINX",id:"restart-nginx",level:2},{value:"Check the Firewall",id:"check-the-firewall",level:2},{value:"Update the zrok Frontend",id:"update-the-zrok-frontend",level:2}];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",...(0,o.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"nginx-reverse-proxy-for-zrok",children:"NGINX Reverse Proxy for zrok"}),"\n",(0,t.jsx)(n.h2,{id:"walkthrough-video",children:"Walkthrough Video"}),"\n",(0,t.jsx)("iframe",{width:"100%",height:"315",src:"https://www.youtube.com/embed/870A5dke_u4?start=1080",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowfullscreen:!0}),"\n",(0,t.jsx)(n.h2,{id:"before-you-begin",children:"Before You Begin"}),"\n",(0,t.jsxs)(n.p,{children:["I'll assume you have a running ",(0,t.jsx)(n.code,{children:"zrok"})," controller and frontend and wish to front both with NGINX providing server TLS. Go back to ",(0,t.jsx)(n.a,{href:"/docs/guides/self-hosting/linux/",children:"Self-Hosting Guide"})," if you still need to spin those up."]}),"\n",(0,t.jsx)(n.h2,{id:"choose-a-reverse-proxy-address",children:"Choose a Reverse Proxy Address"}),"\n",(0,t.jsxs)(n.p,{children:["I'll use ",(0,t.jsx)(n.code,{children:"https://api.zrok.quigley.com:443"})," in this example, and assume you already set up wildcard DNS like ",(0,t.jsx)(n.code,{children:"*.zrok.quigley.com"}),". This lets us elect ",(0,t.jsx)(n.code,{children:"api.zrok.quigley.com"})," as the controller DNS name, and forward any other incoming requests to the zrok public frontend."]}),"\n",(0,t.jsx)(n.h2,{id:"obtain-a-wildcard-server-certificate",children:"Obtain a Wildcard Server Certificate"}),"\n",(0,t.jsx)(n.p,{children:"You must complete a DNS challenge to obtain a wildcard certificate from Let's Encrypt. I'll assume you know how to create the necessary TXT record in the DNS zone you're using with zrok."}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Install certbot: ",(0,t.jsx)(n.a,{href:"https://eff-certbot.readthedocs.io/en/stable/install.html",children:"https://eff-certbot.readthedocs.io/en/stable/install.html"})]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Run certbot with the manual plugin: ",(0,t.jsx)(n.a,{href:"https://certbot.eff.org/docs/using.html#manual",children:"https://certbot.eff.org/docs/using.html#manual"})]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"# install cert for *.zrok.quigley.com in /etc/letsencrypt\nsudo certbot certonly --manual\n"})}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"install-nginx",children:(0,t.jsx)(n.a,{href:"https://www.nginx.com/resources/wiki/start/topics/tutorials/install/",children:"Install NGINX"})}),"\n",(0,t.jsx)(n.h2,{id:"configure-nginx",children:"Configure NGINX"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"server {\n listen 443 ssl;\n server_name api.zrok.quigley.com;\n ssl_certificate /etc/letsencrypt/live/zrok.quigley.com/fullchain.pem;\n ssl_certificate_key /etc/letsencrypt/live/zrok.quigley.com/privkey.pem;\n ssl_protocols TLSv1 TLSv1.1 TLSv1.2;\n ssl_ciphers HIGH:!aNULL:!MD5;\n\n location / {\n proxy_pass http://127.0.0.1:18080;\n error_log /var/log/nginx/zrok-controller.log;\n }\n\n}\n\nmap $http_upgrade $connection_upgrade {\n default keep-alive;\n 'websocket' upgrade;\n '' close;\n}\n\nserver {\n listen 443 ssl;\n server_name *.zrok.quigley.com;\n ssl_certificate /etc/letsencrypt/live/zrok.quigley.com/fullchain.pem;\n ssl_certificate_key /etc/letsencrypt/live/zrok.quigley.com/privkey.pem;\n ssl_protocols TLSv1 TLSv1.1 TLSv1.2;\n ssl_ciphers HIGH:!aNULL:!MD5;\n\n location / {\n proxy_pass http://127.0.0.1:8080;\n proxy_set_header Host $host;\n error_log /var/log/nginx/zrok-frontend.log;\n proxy_busy_buffers_size 512k;\n proxy_buffers 4 512k;\n proxy_buffer_size 256k;\n\n proxy_http_version 1.1;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection \"upgrade\";\n }\n}\n"})}),"\n",(0,t.jsx)(n.h2,{id:"restart-nginx",children:"Restart NGINX"}),"\n",(0,t.jsx)(n.p,{children:"Load the new configuration by restarting NGINX. Check the logs to make sure it's happy."}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Started A high performance web server and a reverse proxy server."}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"check-the-firewall",children:"Check the Firewall"}),"\n",(0,t.jsx)(n.p,{children:"If you followed the non-TLS quickstart then you may have opened 8080,108080/tcp in your firewall. You can go ahead and replace those exceptions with 443/tcp because only NGINX needs to be reachable for zrok to function."}),"\n",(0,t.jsx)(n.h2,{id:"update-the-zrok-frontend",children:"Update the zrok Frontend"}),"\n",(0,t.jsxs)(n.p,{children:['List available frontends to obtain the token identifier of the frontend named "public". You may need to set ',(0,t.jsx)(n.code,{children:"ZROK_ADMIN_TOKEN"})," or ",(0,t.jsx)(n.code,{children:"ZROK_API_ENDPOINT"})," before running ",(0,t.jsx)(n.code,{children:"zrok admin"}),"."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"$ zrok admin list frontends\n\n TOKEN ZID PUBLIC NAME URL TEMPLATE CREATED AT UPDATED AT \n 2NiDTRYUww18 7DsLh9DXG public http://{token}.zrok.quigley.com:8080 2023-01-19 05:29:20.793 +0000 UTC 2023-01-19 06:17:25 +0000 UTC \n"})}),"\n",(0,t.jsx)(n.p,{children:"Update the URL template to use NGINX."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"$ zrok admin update frontend 2NiDTRYUww18 --url-template https://{token}.zrok.quigley.com:443\n[ 0.028] INFO main.(*adminUpdateFrontendCommand).run: updated global frontend '2NiDTRYUww18'\n"})})]})}function h(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},1151:(e,n,r)=>{r.d(n,{Z:()=>l,a:()=>s});var t=r(7294);const o={},i=t.createContext(o);function s(e){const n=t.useContext(i);return t.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(o):e.components||o:s(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ef8afbfd.3326e0f0.js b/assets/js/ef8afbfd.3326e0f0.js deleted file mode 100644 index a6631f63..00000000 --- a/assets/js/ef8afbfd.3326e0f0.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[4031],{6155:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>a,contentTitle:()=>s,default:()=>h,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var t=r(5893),o=r(1151);const i={sidebar_position:50,sidebar_label:"NGINX TLS"},s="NGINX Reverse Proxy for zrok",l={id:"guides/self-hosting/linux/nginx",title:"NGINX Reverse Proxy for zrok",description:"Walkthrough Video",source:"@site/../docs/guides/self-hosting/linux/nginx.mdx",sourceDirName:"guides/self-hosting/linux",slug:"/guides/self-hosting/linux/nginx",permalink:"/docs/guides/self-hosting/linux/nginx",draft:!1,unlisted:!1,editUrl:"https://github.com/openziti/zrok/blob/main/docs/../docs/guides/self-hosting/linux/nginx.mdx",tags:[],version:"current",sidebarPosition:50,frontMatter:{sidebar_position:50,sidebar_label:"NGINX TLS"},sidebar:"tutorialSidebar",previous:{title:"Linux",permalink:"/docs/guides/self-hosting/linux/"},next:{title:"Personalized Frontend",permalink:"/docs/guides/self-hosting/personalized-frontend"}},a={},c=[{value:"Walkthrough Video",id:"walkthrough-video",level:2},{value:"Before You Begin",id:"before-you-begin",level:2},{value:"Choose a Reverse Proxy Address",id:"choose-a-reverse-proxy-address",level:2},{value:"Obtain a Wildcard Server Certificate",id:"obtain-a-wildcard-server-certificate",level:2},{value:"Install NGINX",id:"install-nginx",level:2},{value:"Configure NGINX",id:"configure-nginx",level:2},{value:"Restart NGINX",id:"restart-nginx",level:2},{value:"Check the Firewall",id:"check-the-firewall",level:2},{value:"Update the zrok Frontend",id:"update-the-zrok-frontend",level:2}];function d(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",...(0,o.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"nginx-reverse-proxy-for-zrok",children:"NGINX Reverse Proxy for zrok"}),"\n",(0,t.jsx)(n.h2,{id:"walkthrough-video",children:"Walkthrough Video"}),"\n",(0,t.jsx)("iframe",{width:"100%",height:"315",src:"https://www.youtube.com/embed/870A5dke_u4?start=1080",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowfullscreen:!0}),"\n",(0,t.jsx)(n.h2,{id:"before-you-begin",children:"Before You Begin"}),"\n",(0,t.jsxs)(n.p,{children:["I'll assume you have a running ",(0,t.jsx)(n.code,{children:"zrok"})," controller and frontend and wish to front both with NGINX providing server TLS. Go back to ",(0,t.jsx)(n.a,{href:"/docs/guides/self-hosting/linux/",children:"Self-Hosting Guide"})," if you still need to spin those up."]}),"\n",(0,t.jsx)(n.h2,{id:"choose-a-reverse-proxy-address",children:"Choose a Reverse Proxy Address"}),"\n",(0,t.jsxs)(n.p,{children:["I'll use ",(0,t.jsx)(n.code,{children:"https://api.zrok.quigley.com:443"})," in this example, and assume you already set up wildcard DNS like ",(0,t.jsx)(n.code,{children:"*.zrok.quigley.com"}),". This lets us elect ",(0,t.jsx)(n.code,{children:"api.zrok.quigley.com"})," as the controller DNS name, and forward any other incoming requests to the zrok public frontend."]}),"\n",(0,t.jsx)(n.h2,{id:"obtain-a-wildcard-server-certificate",children:"Obtain a Wildcard Server Certificate"}),"\n",(0,t.jsx)(n.p,{children:"You must complete a DNS challenge to obtain a wildcard certificate from Let's Encrypt. I'll assume you know how to create the necessary TXT record in the DNS zone you're using with zrok."}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Install certbot: ",(0,t.jsx)(n.a,{href:"https://eff-certbot.readthedocs.io/en/stable/install.html",children:"https://eff-certbot.readthedocs.io/en/stable/install.html"})]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Run certbot with the manual plugin: ",(0,t.jsx)(n.a,{href:"https://certbot.eff.org/docs/using.html#manual",children:"https://certbot.eff.org/docs/using.html#manual"})]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"# install cert for *.zrok.quigley.com in /etc/letsencrypt\nsudo certbot certonly --manual\n"})}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"install-nginx",children:(0,t.jsx)(n.a,{href:"https://www.nginx.com/resources/wiki/start/topics/tutorials/install/",children:"Install NGINX"})}),"\n",(0,t.jsx)(n.h2,{id:"configure-nginx",children:"Configure NGINX"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"server {\n listen 443 ssl;\n server_name api.zrok.quigley.com;\n ssl_certificate /etc/letsencrypt/live/zrok.quigley.com/fullchain.pem;\n ssl_certificate_key /etc/letsencrypt/live/zrok.quigley.com/privkey.pem;\n ssl_protocols TLSv1 TLSv1.1 TLSv1.2;\n ssl_ciphers HIGH:!aNULL:!MD5;\n\n location / {\n proxy_pass http://127.0.0.1:18080;\n error_log /var/log/nginx/zrok-controller.log;\n }\n\n}\n\nmap $http_upgrade $connection_upgrade {\n default keep-alive;\n 'websocket' upgrade;\n '' close;\n}\n\nserver {\n listen 443 ssl;\n server_name *.zrok.quigley.com;\n ssl_certificate /etc/letsencrypt/live/zrok.quigley.com/fullchain.pem;\n ssl_certificate_key /etc/letsencrypt/live/zrok.quigley.com/privkey.pem;\n ssl_protocols TLSv1 TLSv1.1 TLSv1.2;\n ssl_ciphers HIGH:!aNULL:!MD5;\n\n location / {\n proxy_pass http://127.0.0.1:8080;\n proxy_set_header Host $host;\n error_log /var/log/nginx/zrok-frontend.log;\n proxy_busy_buffers_size 512k;\n proxy_buffers 4 512k;\n proxy_buffer_size 256k;\n\n proxy_http_version 1.1;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection \"upgrade\";\n }\n}\n"})}),"\n",(0,t.jsx)(n.h2,{id:"restart-nginx",children:"Restart NGINX"}),"\n",(0,t.jsx)(n.p,{children:"Load the new configuration by restarting NGINX. Check the logs to make sure it's happy."}),"\n",(0,t.jsxs)(n.blockquote,{children:["\n",(0,t.jsx)(n.p,{children:"Started A high performance web server and a reverse proxy server."}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"check-the-firewall",children:"Check the Firewall"}),"\n",(0,t.jsx)(n.p,{children:"If you followed the non-TLS quickstart then you may have opened 8080,108080/tcp in your firewall. You can go ahead and replace those exceptions with 443/tcp because only NGINX needs to be reachable for zrok to function."}),"\n",(0,t.jsx)(n.h2,{id:"update-the-zrok-frontend",children:"Update the zrok Frontend"}),"\n",(0,t.jsxs)(n.p,{children:['List available frontends to obtain the token identifier of the frontend named "public". You may need to set ',(0,t.jsx)(n.code,{children:"ZROK_ADMIN_TOKEN"})," or ",(0,t.jsx)(n.code,{children:"ZROK_API_ENDPOINT"})," before running ",(0,t.jsx)(n.code,{children:"zrok admin"}),"."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"$ zrok admin list frontends\n\n TOKEN ZID PUBLIC NAME URL TEMPLATE CREATED AT UPDATED AT \n 2NiDTRYUww18 7DsLh9DXG public http://{token}.zrok.quigley.com:8080 2023-01-19 05:29:20.793 +0000 UTC 2023-01-19 06:17:25 +0000 UTC \n"})}),"\n",(0,t.jsx)(n.p,{children:"Update the URL template to use NGINX."}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"$ zrok admin update frontend 2NiDTRYUww18 --url-template https://{token}.zrok.quigley.com:443\n[ 0.028] INFO main.(*adminUpdateFrontendCommand).run: updated global frontend '2NiDTRYUww18'\n"})})]})}function h(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},1151:(e,n,r)=>{r.d(n,{Z:()=>l,a:()=>s});var t=r(7294);const o={},i=t.createContext(o);function s(e){const n=t.useContext(i);return t.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(o):e.components||o:s(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/main.919bd9e8.js b/assets/js/main.919bd9e8.js new file mode 100644 index 00000000..f6e9874c --- /dev/null +++ b/assets/js/main.919bd9e8.js @@ -0,0 +1,2 @@ +/*! For license information please see main.919bd9e8.js.LICENSE.txt */ +(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[179],{830:(e,t,n)=>{"use strict";n.d(t,{W:()=>o});var r=n(7294);function o(){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"}))}},723:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});n(7294);var r=n(8356),o=n.n(r),a=n(6887);const i={"07d0b302":[()=>n.e(8905).then(n.bind(n,3103)),"@site/../docs/concepts/http.md",3103],"0c66edb9":[()=>n.e(58).then(n.bind(n,2732)),"@site/../docs/guides/permission-modes.md",2732],"14eb3368":[()=>Promise.all([n.e(532),n.e(9817)]).then(n.bind(n,4228)),"@theme/DocCategoryGeneratedIndexPage",4228],17896441:[()=>Promise.all([n.e(532),n.e(2312),n.e(7918)]).then(n.bind(n,7814)),"@theme/DocItem",7814],"1a4e3797":[()=>Promise.all([n.e(532),n.e(7920)]).then(n.bind(n,8852)),"@theme/SearchPage",8852],"1ba5bc99":[()=>Promise.all([n.e(532),n.e(7142)]).then(n.bind(n,1616)),"@site/../docs/guides/install/macos.mdx",1616],"21880a4d":[()=>n.e(8156).then(n.bind(n,8697)),"@site/../docs/guides/vpn/vpn.md",8697],"288b1075":[()=>n.e(2108).then(n.bind(n,8152)),"@site/../docs/guides/self-hosting/metrics-and-limits/configuring-metrics.md",8152],"2da89d45":[()=>Promise.all([n.e(532),n.e(5893)]).then(n.bind(n,6071)),"@site/../docs/guides/docker-share/index.mdx",6071],"2e812224":[()=>n.e(7076).then(n.bind(n,4695)),"@site/../docs/guides/docker-share/docker_public_share_guide.md",4695],"339d500a":[()=>n.e(1889).then(n.bind(n,6335)),"@site/../docs/concepts/tunnels.md",6335],"34e1d3b9":[()=>n.e(1360).then(n.bind(n,3901)),"@site/../docs/concepts/sharing-private.md",3901],"4555b262":[()=>n.e(1387).then(n.bind(n,2314)),"@site/../docs/guides/drives/cli.md",2314],"47881d5c":[()=>Promise.all([n.e(532),n.e(2312),n.e(1272),n.e(826)]).then(n.bind(n,6285)),"@site/../docs/guides/install/linux.mdx",6285],"50ef9c44":[()=>n.e(8198).then(n.bind(n,8413)),"@site/../docs/concepts/hosting.md",8413],"5cd0a723":[()=>n.e(8993).then(n.bind(n,2121)),"@site/../docs/guides/self-hosting/instance-configuration.mdx",2121],"5e95c892":[()=>n.e(9661).then(n.bind(n,1892)),"@theme/DocsRoot",1892],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,6809)),"@generated/docusaurus.config",6809],"600b2345":[()=>n.e(4900).then(n.bind(n,169)),"@site/../docs/guides/self-hosting/metrics-and-limits/configuring-limits.md",169],"618abc13":[()=>n.e(2914).then(n.t.bind(n,3719,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-guides-55c.json",3719],"6272ba0e":[()=>n.e(7176).then(n.bind(n,7806)),"@site/../docs/concepts/sharing-reserved.md",7806],"6e881e32":[()=>n.e(3182).then(n.bind(n,8214)),"@site/../docs/guides/self-hosting/oauth/configuring-oauth.md",8214],"7452427d":[()=>n.e(4920).then(n.bind(n,722)),"@site/../docs/guides/self-hosting/personalized-frontend.md",722],"75b20590":[()=>n.e(4838).then(n.bind(n,6162)),"@site/../docs/concepts/opensource.md",6162],"88b6e020":[()=>n.e(6062).then(n.t.bind(n,3922,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-self-hosting-d2f.json",3922],"9939c4f4":[()=>n.e(7273).then(n.bind(n,1855)),"@site/../docs/guides/self-hosting/interstitial-page.md",1855],a7456010:[()=>n.e(5980).then(n.t.bind(n,9365,19)),"@generated/docusaurus-plugin-content-pages/default/__plugin.json",9365],a7bd4aaa:[()=>n.e(8518).then(n.bind(n,8564)),"@theme/DocVersionRoot",8564],a94703ab:[()=>Promise.all([n.e(532),n.e(4368)]).then(n.bind(n,2674)),"@theme/DocRoot",2674],aba21aa0:[()=>n.e(3629).then(n.t.bind(n,1765,19)),"@generated/docusaurus-plugin-content-docs/default/__plugin.json",1765],b186d866:[()=>n.e(960).then(n.t.bind(n,8100,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-oauth-55b.json",8100],b6569025:[()=>Promise.all([n.e(532),n.e(6913)]).then(n.bind(n,9243)),"@site/../docs/guides/install/index.mdx",9243],bbbe662c:[()=>n.e(4196).then(n.bind(n,8724)),"@site/../docs/guides/docker-share/docker_private_share_guide.md",8724],bc747cac:[()=>n.e(8945).then(n.bind(n,3033)),"@site/../docs/concepts/index.md",3033],c015c796:[()=>n.e(2732).then(n.bind(n,2180)),"@site/../docs/concepts/files.md",2180],c141421f:[()=>n.e(1004).then(n.t.bind(n,1324,19)),"@generated/docusaurus-theme-search-algolia/default/__plugin.json",1324],c304be44:[()=>Promise.all([n.e(532),n.e(5327)]).then(n.bind(n,6508)),"@site/../docs/guides/install/windows.mdx",6508],c4f5d8e4:[()=>n.e(4195).then(n.bind(n,2841)),"@site/src/pages/index.js",2841],cda0d2e5:[()=>Promise.all([n.e(532),n.e(2312),n.e(1272),n.e(174),n.e(5889)]).then(n.bind(n,8854)),"@site/../docs/guides/frontdoor.mdx",8854],d768dc0f:[()=>n.e(5882).then(n.bind(n,475)),"@site/../docs/guides/self-hosting/linux/index.mdx",475],d9f29b48:[()=>n.e(9714).then(n.t.bind(n,690,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-category-metrics-and-limits-f9d.json",690],e1dfe4fe:[()=>n.e(4778).then(n.bind(n,3938)),"@site/../docs/guides/self-hosting/docker.mdx",3938],ea84f538:[()=>n.e(9944).then(n.t.bind(n,7105,19)),"@generated/docusaurus-plugin-content-docs/default/p/docs-7e8.json",7105],ef8afbfd:[()=>n.e(4031).then(n.bind(n,6155)),"@site/../docs/guides/self-hosting/linux/nginx.mdx",6155],f2348458:[()=>n.e(2992).then(n.bind(n,4732)),"@site/../docs/concepts/sharing-public.md",4732],f888b719:[()=>Promise.all([n.e(532),n.e(8938)]).then(n.bind(n,2800)),"@site/../docs/getting-started.mdx",2800]};var l=n(5893);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(9670),u=n(226);function d(e,t){if("*"===e)return o()({loading:s,loader:()=>n.e(1772).then(n.bind(n,1772)),modules:["@theme/NotFound"],webpack:()=>[1772],render(e,t){const n=e.default;return(0,l.jsx)(u.z,{value:{plugin:{name:"native",id:"default"}},children:(0,l.jsx)(n,{...t})})}});const r=a[`${e}-${t}`],d={},p=[],f=[],h=(0,c.Z)(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]))})),o().Map({loading:s,loader:d,modules:p,webpack:()=>f,render(t,n){const o=JSON.parse(JSON.stringify(r));Object.entries(t).forEach((t=>{let[n,r]=t;const a=r.default;if(!a)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 a&&"function"!=typeof a||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{a[e]=r[e]}));let i=o;const l=n.split(".");l.slice(0,-1).forEach((e=>{i=i[e]})),i[l[l.length-1]]=a}));const a=o.__comp;delete o.__comp;const i=o.__context;delete o.__context;const s=o.__props;return delete o.__props,(0,l.jsx)(u.z,{value:i,children:(0,l.jsx)(a,{...o,...s,...n})})}})}const p=[{path:"/search/",component:d("/search/","21e"),exact:!0},{path:"/docs/",component:d("/docs/","456"),routes:[{path:"/docs/",component:d("/docs/","432"),routes:[{path:"/docs/",component:d("/docs/","48e"),routes:[{path:"/docs/category/guides/",component:d("/docs/category/guides/","4b8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/category/metrics-and-limits/",component:d("/docs/category/metrics-and-limits/","fc0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/category/oauth/",component:d("/docs/category/oauth/","fda"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/category/self-hosting/",component:d("/docs/category/self-hosting/","d06"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/concepts/",component:d("/docs/concepts/","76a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/concepts/files/",component:d("/docs/concepts/files/","331"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/concepts/hosting/",component:d("/docs/concepts/hosting/","fea"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/concepts/http/",component:d("/docs/concepts/http/","d68"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/concepts/opensource/",component:d("/docs/concepts/opensource/","94c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/concepts/sharing-private/",component:d("/docs/concepts/sharing-private/","f92"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/concepts/sharing-public/",component:d("/docs/concepts/sharing-public/","cfe"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/concepts/sharing-reserved/",component:d("/docs/concepts/sharing-reserved/","5d7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/concepts/tunnels/",component:d("/docs/concepts/tunnels/","f73"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/getting-started/",component:d("/docs/getting-started/","fdf"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/docker-share/",component:d("/docs/guides/docker-share/","7d3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/docker-share/docker_private_share_guide/",component:d("/docs/guides/docker-share/docker_private_share_guide/","927"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/docker-share/docker_public_share_guide/",component:d("/docs/guides/docker-share/docker_public_share_guide/","ccf"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/drives/cli/",component:d("/docs/guides/drives/cli/","9bf"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/frontdoor/",component:d("/docs/guides/frontdoor/","e30"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/install/",component:d("/docs/guides/install/","aa4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/install/linux/",component:d("/docs/guides/install/linux/","0c6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/install/macos/",component:d("/docs/guides/install/macos/","532"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/install/windows/",component:d("/docs/guides/install/windows/","ad4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/permission-modes/",component:d("/docs/guides/permission-modes/","d45"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/self-hosting/docker/",component:d("/docs/guides/self-hosting/docker/","5a7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/self-hosting/instance-configuration/",component:d("/docs/guides/self-hosting/instance-configuration/","297"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/self-hosting/interstitial-page/",component:d("/docs/guides/self-hosting/interstitial-page/","90e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/self-hosting/linux/",component:d("/docs/guides/self-hosting/linux/","d78"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/self-hosting/linux/nginx/",component:d("/docs/guides/self-hosting/linux/nginx/","b26"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/self-hosting/metrics-and-limits/configuring-limits/",component:d("/docs/guides/self-hosting/metrics-and-limits/configuring-limits/","8b7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/self-hosting/metrics-and-limits/configuring-metrics/",component:d("/docs/guides/self-hosting/metrics-and-limits/configuring-metrics/","0a8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/self-hosting/oauth/configuring-oauth/",component:d("/docs/guides/self-hosting/oauth/configuring-oauth/","b5f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/self-hosting/personalized-frontend/",component:d("/docs/guides/self-hosting/personalized-frontend/","567"),exact:!0,sidebar:"tutorialSidebar"},{path:"/docs/guides/vpn/",component:d("/docs/guides/vpn/","13f"),exact:!0,sidebar:"tutorialSidebar"}]}]}]},{path:"/",component:d("/","2e1"),exact:!0},{path:"*",component:d("*")}]},8934:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,t:()=>i});var r=n(7294),o=n(5893);const a=r.createContext(!1);function i(e){let{children:t}=e;const[n,i]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{i(!0)}),[]),(0,o.jsx)(a.Provider,{value:n,children:t})}},7221:(e,t,n)=>{"use strict";var r=n(7294),o=n(745),a=n(3727),i=n(405),l=n(412);const s=[n(2497),n(3310),n(8320),n(2295)];var c=n(723),u=n(6550),d=n(8790),p=n(5893);function f(e){let{children:t}=e;return(0,p.jsx)(p.Fragment,{children:t})}var h=n(5742),g=n(2263),m=n(4996),y=n(6668),b=n(833),v=n(4711),w=n(9727),k=n(3320),x=n(8780),S=n(197);function E(){const{i18n:{currentLocale:e,defaultLocale:t,localeConfigs:n}}=(0,g.Z)(),r=(0,v.l)(),o=n[e].htmlLang,a=e=>e.replace("-","_");return(0,p.jsxs)(h.Z,{children:[Object.entries(n).map((e=>{let[t,{htmlLang:n}]=e;return(0,p.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:n},t)})),(0,p.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:"x-default"}),(0,p.jsx)("meta",{property:"og:locale",content:a(o)}),Object.values(n).filter((e=>o!==e.htmlLang)).map((e=>(0,p.jsx)("meta",{property:"og:locale:alternate",content:a(e.htmlLang)},`meta-og-${e.htmlLang}`)))]})}function C(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,g.Z)(),r=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,g.Z)(),{pathname:r}=(0,u.TH)();return e+(0,x.applyTrailingSlash)((0,m.Z)(r),{trailingSlash:n,baseUrl:t})}(),o=t?`${n}${t}`:r;return(0,p.jsxs)(h.Z,{children:[(0,p.jsx)("meta",{property:"og:url",content:o}),(0,p.jsx)("link",{rel:"canonical",href:o})]})}function _(){const{i18n:{currentLocale:e}}=(0,g.Z)(),{metadata:t,image:n}=(0,y.L)();return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(h.Z,{children:[(0,p.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,p.jsx)("body",{className:w.h})]}),n&&(0,p.jsx)(b.d,{image:n}),(0,p.jsx)(C,{}),(0,p.jsx)(E,{}),(0,p.jsx)(S.Z,{tag:k.HX,locale:e}),(0,p.jsx)(h.Z,{children:t.map(((e,t)=>(0,p.jsx)("meta",{...e},t)))})]})}const T=new Map;var j=n(8934),A=n(8940),L=n(469);function R(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()=>o.forEach((e=>e?.()))}const N=function(e){let{children:t,location:n,previousLocation:r}=e;return(0,L.Z)((()=>{r!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,o=t.hash===n.hash,a=t.search===n.search;if(r&&o&&!a)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}),R("onRouteDidUpdate",{previousLocation:r,location:n}))}),[r,n]),t};function P(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,d.f)(c.Z,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class O extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=l.Z.canUseDOM?R("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=R("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),P(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,p.jsx)(N,{previousLocation:this.previousLocation,location:t,children:(0,p.jsx)(u.AW,{location:t,render:()=>e})})}}const I=O,D="__docusaurus-base-url-issue-banner-container",M="__docusaurus-base-url-issue-banner",F="__docusaurus-base-url-issue-banner-suggestion-container";function z(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 T.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return T.set(e.pathname,t),{...e,pathname:t}}((0,u.TH)());return(0,p.jsx)(I,{location:e,children:G})}function W(){return(0,p.jsx)(q.Z,{children:(0,p.jsx)(A.M,{children:(0,p.jsxs)(j.t,{children:[(0,p.jsxs)(f,{children:[(0,p.jsx)(U,{}),(0,p.jsx)(_,{}),(0,p.jsx)($,{}),(0,p.jsx)(V,{})]}),(0,p.jsx)(H,{})]})})})}var K=n(6887);const Q=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 o=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;o?.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 Y=n(9670);const X=new Set,J=new Set,ee=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,te={prefetch:e=>{if(!(e=>!ee()&&!J.has(e)&&!X.has(e))(e))return!1;X.add(e);const t=(0,d.f)(c.Z,e).flatMap((e=>{return t=e.route.path,Object.entries(K).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,Y.Z)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?Q(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!ee()&&!J.has(e))(e)&&(J.add(e),P(e))},ne=Object.freeze(te),re=Boolean(!0);if(l.Z.canUseDOM){window.docusaurus=ne;const e=document.getElementById("__docusaurus"),t=(0,p.jsx)(i.B6,{children:(0,p.jsx)(a.VK,{children:(0,p.jsx)(W,{})})}),n=(e,t)=>{console.error("Docusaurus React Root onRecoverableError:",e,t)},l=()=>{if(window.docusaurusRoot)window.docusaurusRoot.render(t);else if(re)window.docusaurusRoot=o.hydrateRoot(e,t,{onRecoverableError:n});else{const r=o.createRoot(e,{onRecoverableError:n});r.render(t),window.docusaurusRoot=r}};P(window.location.pathname).then((()=>{(0,r.startTransition)(l)}))}},8940:(e,t,n)=>{"use strict";n.d(t,{_:()=>d,M:()=>p});var r=n(7294),o=n(6809);const a=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/docs","versions":[{"name":"current","label":"Next","isLast":true,"path":"/docs","mainDocId":"getting-started","docs":[{"id":"concepts/files","path":"/docs/concepts/files","sidebar":"tutorialSidebar"},{"id":"concepts/hosting","path":"/docs/concepts/hosting","sidebar":"tutorialSidebar"},{"id":"concepts/http","path":"/docs/concepts/http","sidebar":"tutorialSidebar"},{"id":"concepts/index","path":"/docs/concepts/","sidebar":"tutorialSidebar"},{"id":"concepts/opensource","path":"/docs/concepts/opensource","sidebar":"tutorialSidebar"},{"id":"concepts/sharing-private","path":"/docs/concepts/sharing-private","sidebar":"tutorialSidebar"},{"id":"concepts/sharing-public","path":"/docs/concepts/sharing-public","sidebar":"tutorialSidebar"},{"id":"concepts/sharing-reserved","path":"/docs/concepts/sharing-reserved","sidebar":"tutorialSidebar"},{"id":"concepts/tunnels","path":"/docs/concepts/tunnels","sidebar":"tutorialSidebar"},{"id":"getting-started","path":"/docs/getting-started","sidebar":"tutorialSidebar"},{"id":"guides/docker-share/docker_private_share_guide","path":"/docs/guides/docker-share/docker_private_share_guide","sidebar":"tutorialSidebar"},{"id":"guides/docker-share/docker_public_share_guide","path":"/docs/guides/docker-share/docker_public_share_guide","sidebar":"tutorialSidebar"},{"id":"guides/docker-share/index","path":"/docs/guides/docker-share/","sidebar":"tutorialSidebar"},{"id":"guides/drives/cli","path":"/docs/guides/drives/cli","sidebar":"tutorialSidebar"},{"id":"guides/frontdoor","path":"/docs/guides/frontdoor","sidebar":"tutorialSidebar"},{"id":"guides/install/index","path":"/docs/guides/install/","sidebar":"tutorialSidebar"},{"id":"guides/install/linux","path":"/docs/guides/install/linux","sidebar":"tutorialSidebar"},{"id":"guides/install/macos","path":"/docs/guides/install/macos","sidebar":"tutorialSidebar"},{"id":"guides/install/windows","path":"/docs/guides/install/windows","sidebar":"tutorialSidebar"},{"id":"guides/permission-modes","path":"/docs/guides/permission-modes","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/docker","path":"/docs/guides/self-hosting/docker","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/instance-configuration","path":"/docs/guides/self-hosting/instance-configuration","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/interstitial-page","path":"/docs/guides/self-hosting/interstitial-page","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/linux/index","path":"/docs/guides/self-hosting/linux/","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/linux/nginx","path":"/docs/guides/self-hosting/linux/nginx","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/metrics-and-limits/configuring-limits","path":"/docs/guides/self-hosting/metrics-and-limits/configuring-limits","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/metrics-and-limits/configuring-metrics","path":"/docs/guides/self-hosting/metrics-and-limits/configuring-metrics","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/oauth/configuring-oauth","path":"/docs/guides/self-hosting/oauth/configuring-oauth","sidebar":"tutorialSidebar"},{"id":"guides/self-hosting/personalized-frontend","path":"/docs/guides/self-hosting/personalized-frontend","sidebar":"tutorialSidebar"},{"id":"guides/vpn/vpn","path":"/docs/guides/vpn/","sidebar":"tutorialSidebar"},{"id":"/category/guides","path":"/docs/category/guides","sidebar":"tutorialSidebar"},{"id":"/category/self-hosting","path":"/docs/category/self-hosting","sidebar":"tutorialSidebar"},{"id":"/category/metrics-and-limits","path":"/docs/category/metrics-and-limits","sidebar":"tutorialSidebar"},{"id":"/category/oauth","path":"/docs/category/oauth","sidebar":"tutorialSidebar"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/docs/getting-started","label":"Getting Started"}}}}],"breadcrumbs":true}},"docusaurus-plugin-google-tag-manager":{"default":{"containerId":"GTM-MDFLZPK8","id":"default"}}}'),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(7529);const s=JSON.parse('{"docusaurusVersion":"3.3.2","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"3.3.2"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"3.3.2"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"3.3.2"},"docusaurus-plugin-google-tag-manager":{"type":"package","name":"@docusaurus/plugin-google-tag-manager","version":"3.3.2"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"3.3.2"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"3.3.2"},"docusaurus-theme-search-algolia":{"type":"package","name":"@docusaurus/theme-search-algolia","version":"3.3.2"},"docusaurus-plugin-client-redirects":{"type":"package","name":"@docusaurus/plugin-client-redirects","version":"3.3.2"},"custom-webpack-plugin":{"type":"local"}}}');var c=n(5893);const u={siteConfig:o.default,siteMetadata:s,globalData:a,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})}},4763:(e,t,n)=>{"use strict";n.d(t,{Z:()=>g});var r=n(7294),o=n(412),a=n(5742),i=n(8780),l=n(7372),s=n(226),c=n(5893);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.z,{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)(g,{fallback:()=>(0,c.jsx)(u,{error:t,tryAgain:n}),children:[(0,c.jsx)(a.Z,{children:(0,c.jsx)("title",{children:"Page Error"})}),(0,c.jsx)(l.Z,{children:(0,c.jsx)(u,{error:t,tryAgain:n})})]})})}const h=e=>(0,c.jsx)(f,{...e});class g extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){o.Z.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}}},412:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,o={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},5742:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});n(7294);var r=n(405),o=n(5893);function a(e){return(0,o.jsx)(r.ql,{...e})}},3692:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var r=n(7294),o=n(3727),a=n(8780),i=n(2263),l=n(3919),s=n(412),c=n(8138),u=n(4996),d=n(5893);function p(e,t){let{isNavLink:n,to:p,href:f,activeClassName:h,isActive:g,"data-noBrokenLinkCheck":m,autoAddBaseUrl:y=!0,...b}=e;const{siteConfig:{trailingSlash:v,baseUrl:w}}=(0,i.Z)(),{withBaseUrl:k}=(0,u.C)(),x=(0,c.Z)(),S=(0,r.useRef)(null);(0,r.useImperativeHandle)(t,(()=>S.current));const E=p||f;const C=(0,l.Z)(E),_=E?.replace("pathname://","");let T=void 0!==_?(j=_,y&&(e=>e.startsWith("/"))(j)?k(j):j):void 0;var j;T&&C&&(T=(0,a.applyTrailingSlash)(T,{trailingSlash:v,baseUrl:w}));const A=(0,r.useRef)(!1),L=n?o.OL:o.rU,R=s.Z.canUseIntersectionObserver,N=(0,r.useRef)(),P=()=>{A.current||null==T||(window.docusaurus.preload(T),A.current=!0)};(0,r.useEffect)((()=>(!R&&C&&null!=T&&window.docusaurus.prefetch(T),()=>{R&&N.current&&N.current.disconnect()})),[N,T,R,C]);const O=T?.startsWith("#")??!1,I=!b.target||"_self"===b.target,D=!T||!C||!I||O;return m||!O&&D||x.collectLink(T),b.id&&x.collectAnchor(b.id),D?(0,d.jsx)("a",{ref:S,href:T,...E&&!C&&{target:"_blank",rel:"noopener noreferrer"},...b}):(0,d.jsx)(L,{...b,onMouseEnter:P,onTouchStart:P,innerRef:e=>{S.current=e,R&&e&&C&&(N.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(N.current.unobserve(e),N.current.disconnect(),null!=T&&window.docusaurus.prefetch(T))}))})),N.current.observe(e))},to:T,...n&&{isActive:g,activeClassName:h}})}const f=r.forwardRef(p)},5999:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c,I:()=>s});var r=n(7294),o=n(5893);function a(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(7529);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 a(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,o.jsx)(o.Fragment,{children:a(i,r)})}},9935:(e,t,n)=>{"use strict";n.d(t,{m:()=>r});const r="default"},3919:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function o(e){return void 0!==e&&!r(e)}n.d(t,{Z:()=>o,b:()=>r})},4996:(e,t,n)=>{"use strict";n.d(t,{C:()=>i,Z:()=>l});var r=n(7294),o=n(2263),a=n(3919);function i(){const{siteConfig:{baseUrl:e,url:t}}=(0,o.Z)(),n=(0,r.useCallback)(((n,r)=>function(e,t,n,r){let{forcePrependBaseUrl:o=!1,absolute:i=!1}=void 0===r?{}:r;if(!n||n.startsWith("#")||(0,a.b)(n))return n;if(o)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;const l=n.startsWith(t)?n:t+n.replace(/^\//,"");return i?e+l:l}(t,e,n,r)),[t,e]);return{withBaseUrl:n}}function l(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},8138:(e,t,n)=>{"use strict";n.d(t,{Z:()=>i});var r=n(7294);n(5893);const o=r.createContext({collectAnchor:()=>{},collectLink:()=>{}}),a=()=>(0,r.useContext)(o);function i(){return a()}},2263:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=n(7294),o=n(8940);function a(){return(0,r.useContext)(o._)}},2389:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=n(7294),o=n(8934);function a(){return(0,r.useContext)(o._)}},469:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294);const o=n(412).Z.canUseDOM?r.useLayoutEffect:r.useEffect},9670:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});const r=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function o(e){const t={};return function e(n,o){Object.entries(n).forEach((n=>{let[a,i]=n;const l=o?`${o}.${a}`:a;r(i)?e(i,l):t[l]=i}))}(e),t}},226:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,z:()=>i});var r=n(7294),o=n(5893);const a=r.createContext(null);function i(e){let{children:t,value:n}=e;const i=r.useContext(a),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,o.jsx)(a.Provider,{value:l,children:t})}},143:(e,t,n)=>{"use strict";n.d(t,{Iw:()=>y,gA:()=>f,WS:()=>h,_r:()=>d,Jo:()=>b,zh:()=>p,yW:()=>m,gB:()=>g});var r=n(6550),o=n(2263),a=n(9935);function i(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,o.Z)();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.LX)(t,{path:e.path,exact:!1,strict:!1})))}function c(e,t){const n=s(e,t),o=n?.docs.find((e=>!!(0,r.LX)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:o,alternateDocVersions:o?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(o.id):{}}}const u={},d=()=>i("docusaurus-plugin-content-docs")??u,p=e=>{try{return function(e,t,n){void 0===t&&(t=a.m),void 0===n&&(n={});const r=i(e),o=r?.[t];if(!o&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return o}("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.TH)();return function(e,t,n){void 0===n&&(n={});const o=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.LX)(t,{path:n.path,exact:!1,strict:!1})})),a=o?{pluginId:o[0],pluginData:o[1]}:void 0;if(!a&&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 a}(t,n,e)}function h(e){void 0===e&&(e={});const t=f(e),{pathname:n}=(0,r.TH)();if(!t)return;return{activePlugin:t,activeVersion:s(t.pluginData,n)}}function g(e){return p(e).versions}function m(e){const t=p(e);return l(t)}function y(e){const t=p(e),{pathname:n}=(0,r.TH)();return c(t,n)}function b(e){const t=p(e),{pathname:n}=(0,r.TH)();return function(e,t){const n=l(e);return{latestDocSuggestion:c(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},8320:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>a});var r=n(4865),o=n.n(r);o().configure({showSpinner:!1});const a={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{o().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){o().done()}}},3310:(e,t,n)=>{"use strict";n.r(t);var r=n(4798),o=n(6809);!function(e){const{themeConfig:{prism:t}}=o.default,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{"php"===e&&n(6854),n(6726)(`./prism-${e}`)})),delete globalThis.Prism}(r.p1)},2503:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});n(7294);var r=n(6905),o=n(5999),a=n(6668),i=n(3692),l=n(8138);const s={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};var c=n(5893);function u(e){let{as:t,id:n,...u}=e;const d=(0,l.Z)(),{navbar:{hideOnScroll:p}}=(0,a.L)();if("h1"===t||!n)return(0,c.jsx)(t,{...u,id:void 0});d.collectAnchor(n);const f=(0,o.I)({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.Z)("anchor",p?s.anchorWithHideOnScrollNavbar:s.anchorWithStickyNavbar,u.className),id:n,children:[u.children,(0,c.jsx)(i.Z,{className:"hash-link",to:`#${n}`,"aria-label":f,title:f,children:"\u200b"})]})}},9471:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});n(7294);const r={iconExternalLink:"iconExternalLink_nPIU"};var o=n(5893);function a(e){let{width:t=13.5,height:n=13.5}=e;return(0,o.jsx)("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:r.iconExternalLink,children:(0,o.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"})})}},7372:(e,t,n)=>{"use strict";n.d(t,{Z:()=>Pt});var r=n(7294),o=n(6905),a=n(4763),i=n(833),l=n(6550),s=n(5999),c=n(5936),u=n(5893);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.k6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&p(t)}),[]);return(0,c.S)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&p(e.current)})),{containerRef:e,onClick:n}}const h=(0,s.I)({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 g(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 m=n(5281),y=n(9727);const b={skipToContent:"skipToContent_fXgn"};function v(){return(0,u.jsx)(g,{className:b.skipToContent})}var w=n(6668),k=n(9689);function x(e){let{width:t=21,height:n=21,color:r="currentColor",strokeWidth:o=1.2,className:a,...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:o,children:(0,u.jsx)("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})})})}const S={closeButton:"closeButton_CVFx"};function E(e){return(0,u.jsx)("button",{type:"button","aria-label":(0,s.I)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"}),...e,className:(0,o.Z)("clean-btn close",S.closeButton,e.className),children:(0,u.jsx)(x,{width:14,height:14,strokeWidth:3.1})})}const C={content:"content_knG7"};function _(e){const{announcementBar:t}=(0,w.L)(),{content:n}=t;return(0,u.jsx)("div",{...e,className:(0,o.Z)(C.content,e.className),dangerouslySetInnerHTML:{__html:n}})}const T={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function j(){const{announcementBar:e}=(0,w.L)(),{isActive:t,close:n}=(0,k.nT)();if(!t)return null;const{backgroundColor:r,textColor:o,isCloseable:a}=e;return(0,u.jsxs)("div",{className:T.announcementBar,style:{backgroundColor:r,color:o},role:"banner",children:[a&&(0,u.jsx)("div",{className:T.announcementBarPlaceholder}),(0,u.jsx)(_,{className:T.announcementBarContent}),a&&(0,u.jsx)(E,{onClick:n,className:T.announcementBarClose})]})}var A=n(3163),L=n(2466);var R=n(902),N=n(3102);const P=r.createContext(null);function O(e){let{children:t}=e;const n=function(){const e=(0,A.e)(),t=(0,N.HY)(),[n,o]=(0,r.useState)(!1),a=null!==t.component,i=(0,R.D9)(a);return(0,r.useEffect)((()=>{a&&!i&&o(!0)}),[a,i]),(0,r.useEffect)((()=>{a?e.shown||o(!0):o(!1)}),[e.shown,a]),(0,r.useMemo)((()=>[n,o]),[n])}();return(0,u.jsx)(P.Provider,{value:n,children:t})}function I(e){if(e.component){const t=e.component;return(0,u.jsx)(t,{...e.props})}}function D(){const e=(0,r.useContext)(P);if(!e)throw new R.i6("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,o=(0,r.useCallback)((()=>n(!1)),[n]),a=(0,N.HY)();return(0,r.useMemo)((()=>({shown:t,hide:o,content:I(a)})),[o,a,t])}function M(e){let{header:t,primaryMenu:n,secondaryMenu:r}=e;const{shown:a}=D();return(0,u.jsxs)("div",{className:"navbar-sidebar",children:[t,(0,u.jsxs)("div",{className:(0,o.Z)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":a}),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(2949),z=n(2389);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_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function q(e){let{className:t,buttonClassName:n,value:r,onChange:a}=e;const i=(0,z.Z)(),l=(0,s.I)({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.I)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,s.I)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return(0,u.jsx)("div",{className:(0,o.Z)(U.toggle,t),children:(0,u.jsxs)("button",{className:(0,o.Z)("clean-btn",U.toggleButton,!i&&U.toggleButtonDisabled,n),type:"button",onClick:()=>a("dark"===r?"light":"dark"),disabled:!i,title:l,"aria-label":l,"aria-live":"polite",children:[(0,u.jsx)(B,{className:(0,o.Z)(U.toggleIcon,U.lightToggleIcon)}),(0,u.jsx)($,{className:(0,o.Z)(U.toggleIcon,U.darkToggleIcon)})]})})}const Z=r.memo(q),H={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function G(e){let{className:t}=e;const n=(0,w.L)().navbar.style,r=(0,w.L)().colorMode.disableSwitch,{colorMode:o,setColorMode:a}=(0,F.I)();return r?null:(0,u.jsx)(Z,{className:t,buttonClassName:"dark"===n?H.darkNavbarColorModeToggle:void 0,value:o,onChange:a})}var V=n(1327);function W(){return(0,u.jsx)(V.Z,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function K(){const e=(0,A.e)();return(0,u.jsx)("button",{type:"button","aria-label":(0,s.I)({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)(x,{color:"var(--ifm-color-emphasis-600)"})})}function Q(){return(0,u.jsxs)("div",{className:"navbar-sidebar__brand",children:[(0,u.jsx)(W,{}),(0,u.jsx)(G,{className:"margin-right--md"}),(0,u.jsx)(K,{})]})}var Y=n(3692),X=n(4996),J=n(3919),ee=n(8022),te=n(9471);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:r,href:o,label:a,html:i,isDropdownLink:l,prependBaseUrlToHref:s,...c}=e;const d=(0,X.Z)(r),p=(0,X.Z)(t),f=(0,X.Z)(o,{forcePrependBaseUrl:!0}),h=a&&o&&!(0,J.Z)(o),g=i?{dangerouslySetInnerHTML:{__html:i}}:{children:(0,u.jsxs)(u.Fragment,{children:[a,h&&(0,u.jsx)(te.Z,{...l&&{width:12,height:12}})]})};return o?(0,u.jsx)(Y.Z,{href:s?f:o,...c,...g}):(0,u.jsx)(Y.Z,{to:d,isNavLink:!0,...(t||n)&&{isActive:(e,t)=>n?(0,ee.F)(n,t.pathname):t.pathname.startsWith(p)},...c,...g})}function re(e){let{className:t,isDropdownItem:n=!1,...r}=e;const a=(0,u.jsx)(ne,{className:(0,o.Z)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n,...r});return n?(0,u.jsx)("li",{children:a}):a}function oe(e){let{className:t,isDropdownItem:n,...r}=e;return(0,u.jsx)("li",{className:"menu__list-item",children:(0,u.jsx)(ne,{className:(0,o.Z)("menu__link",t),...r})})}function ae(e){let{mobile:t=!1,position:n,...r}=e;const o=t?oe:re;return(0,u.jsx)(o,{...r,activeClassName:r.activeClassName??(t?"menu__link--active":"navbar__link--active")})}var ie=n(6043),le=n(8596),se=n(2263);const ce={dropdownNavbarItemMobile:"dropdownNavbarItemMobile_S0Fm"};function ue(e,t){return e.some((e=>function(e,t){return!!(0,le.Mg)(e.to,t)||!!(0,ee.F)(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function de(e){let{items:t,position:n,className:a,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,o.Z)("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,o.Z)("navbar__link",a),...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)(He,{isDropdownItem:!0,activeClassName:"dropdown__link--active",...e,key:t})))})]})}function pe(e){let{items:t,className:n,position:a,onClick:i,...s}=e;const c=function(){const{siteConfig:{baseUrl:e}}=(0,se.Z)(),{pathname:t}=(0,l.TH)();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,o.Z)("menu__list-item",{"menu__list-item--collapsed":p}),children:[(0,u.jsx)(ne,{role:"button",className:(0,o.Z)(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.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:p,children:t.map(((e,t)=>(0,r.createElement)(He,{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(4711);function ge(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 me="iconLanguage_nlXk";var ye=n(3935);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(830),we=["translations"];function ke(){return ke=Object.assign||function(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);n=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var Ce="Ctrl";var _e=r.forwardRef((function(e,t){var n=e.translations,o=void 0===n?{}:n,a=Ee(e,we),i=o.buttonText,l=void 0===i?"Search":i,s=o.buttonAriaLabel,c=void 0===s?"Search":s,u=xe((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(Ce))}),[]),r.createElement("button",ke({type:"button",className:"DocSearch DocSearch-Button","aria-label":c},a,{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===Ce?Ce:"Meta"},d===Ce?r.createElement(be,null):d),r.createElement(Te,{reactsToKey:"k"},"K"))))}));function Te(e){var t=e.reactsToKey,n=e.children,o=xe((0,r.useState)(!1),2),a=o[0],i=o[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:a?"DocSearch-Button-Key DocSearch-Button-Key--pressed":"DocSearch-Button-Key"},n)}var je=n(5742),Ae=n(6177),Le=n(239),Re=n(3320);const Ne={button:{buttonText:(0,s.I)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"}),buttonAriaLabel:(0,s.I)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"})},modal:{searchBox:{resetButtonTitle:(0,s.I)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),resetButtonAriaLabel:(0,s.I)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),cancelButtonText:(0,s.I)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"}),cancelButtonAriaLabel:(0,s.I)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"})},startScreen:{recentSearchesTitle:(0,s.I)({id:"theme.SearchModal.startScreen.recentSearchesTitle",message:"Recent",description:"The title for recent searches"}),noRecentSearchesText:(0,s.I)({id:"theme.SearchModal.startScreen.noRecentSearchesText",message:"No recent searches",description:"The text when no recent searches"}),saveRecentSearchButtonTitle:(0,s.I)({id:"theme.SearchModal.startScreen.saveRecentSearchButtonTitle",message:"Save this search",description:"The label for save recent search button"}),removeRecentSearchButtonTitle:(0,s.I)({id:"theme.SearchModal.startScreen.removeRecentSearchButtonTitle",message:"Remove this search from history",description:"The label for remove recent search button"}),favoriteSearchesTitle:(0,s.I)({id:"theme.SearchModal.startScreen.favoriteSearchesTitle",message:"Favorite",description:"The title for favorite searches"}),removeFavoriteSearchButtonTitle:(0,s.I)({id:"theme.SearchModal.startScreen.removeFavoriteSearchButtonTitle",message:"Remove this search from favorites",description:"The label for remove favorite search button"})},errorScreen:{titleText:(0,s.I)({id:"theme.SearchModal.errorScreen.titleText",message:"Unable to fetch results",description:"The title for error screen of search modal"}),helpText:(0,s.I)({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.I)({id:"theme.SearchModal.footer.selectText",message:"to select",description:"The explanatory text of the action for the enter key"}),selectKeyAriaLabel:(0,s.I)({id:"theme.SearchModal.footer.selectKeyAriaLabel",message:"Enter key",description:"The ARIA label for the Enter key button that makes the selection"}),navigateText:(0,s.I)({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.I)({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.I)({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.I)({id:"theme.SearchModal.footer.closeText",message:"to close",description:"The explanatory text of the action for Escape key"}),closeKeyAriaLabel:(0,s.I)({id:"theme.SearchModal.footer.closeKeyAriaLabel",message:"Escape key",description:"The ARIA label for the Escape key button that close the modal"}),searchByText:(0,s.I)({id:"theme.SearchModal.footer.searchByText",message:"Search by",description:"The text explain that the search is making by Algolia"})},noResultsScreen:{noResultsText:(0,s.I)({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.I)({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.I)({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.I)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsLinkText",message:"Let us know.",description:"The text for the link to report missing results"})}},placeholder:(0,s.I)({id:"theme.SearchModal.placeholder",message:"Search docs",description:"The placeholder of the input of the DocSearch pop-up modal"})};let Pe=null;function Oe(e){let{hit:t,children:n}=e;return(0,u.jsx)(Y.Z,{to:t.url,children:n})}function Ie(e){let{state:t,onClose:n}=e;const r=(0,Ae.M)();return(0,u.jsx)(Y.Z,{to:r(t.query),onClick:n,children:(0,u.jsx)(s.Z,{id:"theme.SearchBar.seeAll",values:{count:t.context.nbHits},children:"See all {count} results"})})}function De(e){let{contextualSearch:t,externalUrlRegex:o,...a}=e;const{siteMetadata:i}=(0,se.Z)(),s=(0,Le.l)(),c=function(){const{locale:e,tags:t}=(0,Re._q)();return[`language:${e}`,t.map((e=>`docusaurus_tag:${e}`))]}(),d=a.searchParameters?.facetFilters??[],p=t?function(e,t){const n=e=>"string"==typeof e?[e]:e;return[...n(e),...n(t)]}(c,d):d,f={...a.searchParameters,facetFilters:p},h=(0,l.k6)(),g=(0,r.useRef)(null),m=(0,r.useRef)(null),[y,b]=(0,r.useState)(!1),[v,w]=(0,r.useState)(void 0),k=(0,r.useCallback)((()=>Pe?Promise.resolve():Promise.all([n.e(1426).then(n.bind(n,1426)),Promise.all([n.e(532),n.e(6945)]).then(n.bind(n,6945)),Promise.all([n.e(532),n.e(8894)]).then(n.bind(n,8894))]).then((e=>{let[{DocSearchModal:t}]=e;Pe=t}))),[]),x=(0,r.useCallback)((()=>{k().then((()=>{g.current=document.createElement("div"),document.body.insertBefore(g.current,document.body.firstChild),b(!0)}))}),[k,b]),S=(0,r.useCallback)((()=>{b(!1),g.current?.remove(),m.current?.focus()}),[b]),E=(0,r.useCallback)((e=>{k().then((()=>{b(!0),w(e.key)}))}),[k,b,w]),C=(0,r.useRef)({navigate(e){let{itemUrl:t}=e;(0,ee.F)(o,t)?window.location.href=t:h.push(t)}}).current,_=(0,r.useRef)((e=>a.transformItems?a.transformItems(e):e.map((e=>({...e,url:s(e.url)}))))).current,T=(0,r.useMemo)((()=>e=>(0,u.jsx)(Ie,{...e,onClose:S})),[S]),j=(0,r.useCallback)((e=>(e.addAlgoliaAgent("docusaurus",i.docusaurusVersion),e)),[i.docusaurusVersion]);return function(e){var t=e.isOpen,n=e.onOpen,o=e.onClose,a=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?o():document.body.classList.contains("DocSearch--active")||document.body.classList.contains("DocSearch--active")||n()),i&&i.current===document.activeElement&&a&&/[a-zA-Z0-9]/.test(String.fromCharCode(e.keyCode))&&a(e)}return window.addEventListener("keydown",e),function(){window.removeEventListener("keydown",e)}}),[t,n,o,a,i])}({isOpen:y,onOpen:x,onClose:S,onInput:E,searchButtonRef:m}),(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(je.Z,{children:(0,u.jsx)("link",{rel:"preconnect",href:`https://${a.appId}-dsn.algolia.net`,crossOrigin:"anonymous"})}),(0,u.jsx)(_e,{onTouchStart:k,onFocus:k,onMouseOver:k,onClick:x,ref:m,translations:Ne.button}),y&&Pe&&g.current&&(0,ye.createPortal)((0,u.jsx)(Pe,{onClose:S,initialScrollY:window.scrollY,initialQuery:v,navigator:C,transformItems:_,hitComponent:Oe,transformSearchClient:j,...a.searchPagePath&&{resultsFooterComponent:T},...a,searchParameters:f,placeholder:Ne.placeholder,translations:Ne.modal}),g.current)]})}function Me(){const{siteConfig:e}=(0,se.Z)();return(0,u.jsx)(De,{...e.themeConfig.algolia})}const Fe={navbarSearchContainer:"navbarSearchContainer_Bca1"};function ze(e){let{children:t,className:n}=e;return(0,u.jsx)("div",{className:(0,o.Z)(n,Fe.navbarSearchContainer),children:t})}var Be=n(143),$e=n(3438);var Ue=n(373);const qe=e=>e.docs.find((t=>t.id===e.mainDocId));const Ze={default:ae,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:r,queryString:o="",...a}=e;const{i18n:{currentLocale:i,locales:c,localeConfigs:d}}=(0,se.Z)(),p=(0,he.l)(),{search:f,hash:h}=(0,l.TH)(),g=[...n,...c.map((e=>{const n=`${`pathname://${p.createUrl({locale:e,fullyQualified:!1})}`}${f}${h}${o}`;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],m=t?(0,s.I)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[i].label;return(0,u.jsx)(fe,{...a,mobile:t,label:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(ge,{className:me}),m]}),items:g})},search:function(e){let{mobile:t,className:n}=e;return t?null:(0,u.jsx)(ze,{className:n,children:(0,u.jsx)(Me,{})})},dropdown:fe,html:function(e){let{value:t,className:n,mobile:r=!1,isDropdownItem:a=!1}=e;const i=a?"li":"div";return(0,u.jsx)(i,{className:(0,o.Z)({navbar__item:!r&&!a,"menu__list-item":r},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:r,...o}=e;const{activeDoc:a}=(0,Be.Iw)(r),i=(0,$e.vY)(t,r),l=a?.path===i?.path;return null===i||i.unlisted&&!l?null:(0,u.jsx)(ae,{exact:!0,...o,isActive:()=>l||!!a?.sidebar&&a.sidebar===i.sidebar,label:n??i.id,to:i.path})},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:r,...o}=e;const{activeDoc:a}=(0,Be.Iw)(r),i=(0,$e.oz)(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)(ae,{exact:!0,...o,isActive:()=>a?.sidebar===t,label:n??i.label,to:i.path})},docsVersion:function(e){let{label:t,to:n,docsPluginId:r,...o}=e;const a=(0,$e.lO)(r)[0],i=t??a.label,l=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(a).path;return(0,u.jsx)(ae,{...o,label:i,to:l})},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:r,dropdownItemsBefore:o,dropdownItemsAfter:a,...i}=e;const{search:c,hash:d}=(0,l.TH)(),p=(0,Be.Iw)(n),f=(0,Be.gB)(n),{savePreferredVersionName:h}=(0,Ue.J)(n),g=[...o,...f.map((e=>{const t=p.alternateDocVersions[e.name]??qe(e);return{label:e.label,to:`${t.path}${c}${d}`,isActive:()=>e===p.activeVersion,onClick:()=>h(e.name)}})),...a],m=(0,$e.lO)(n)[0],y=t&&g.length>1?(0,s.I)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):m.label,b=t&&g.length>1?void 0:qe(m).path;return g.length<=1?(0,u.jsx)(ae,{...i,mobile:t,label:y,to:b,isActive:r?()=>!1:void 0}):(0,u.jsx)(fe,{...i,mobile:t,label:y,to:b,items:g,isActive:r?()=>!1:void 0})}};function He(e){let{type:t,...n}=e;const r=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),o=Ze[r];if(!o)throw new Error(`No NavbarItem component found for type "${t}".`);return(0,u.jsx)(o,{...n})}function Ge(){const e=(0,A.e)(),t=(0,w.L)().navbar.items;return(0,u.jsx)("ul",{className:"menu__list",children:t.map(((t,n)=>(0,r.createElement)(He,{mobile:!0,...t,onClick:()=>e.toggle(),key:n})))})}function Ve(e){return(0,u.jsx)("button",{...e,type:"button",className:"clean-btn navbar-sidebar__back",children:(0,u.jsx)(s.Z,{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 We(){const e=0===(0,w.L)().navbar.items.length,t=D();return(0,u.jsxs)(u.Fragment,{children:[!e&&(0,u.jsx)(Ve,{onClick:()=>t.hide()}),t.content]})}function Ke(){const e=(0,A.e)();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)(M,{header:(0,u.jsx)(Q,{}),primaryMenu:(0,u.jsx)(Ge,{}),secondaryMenu:(0,u.jsx)(We,{})}):null}const Qe={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Ye(e){return(0,u.jsx)("div",{role:"presentation",...e,className:(0,o.Z)("navbar-sidebar__backdrop",e.className)})}function Xe(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:a}}=(0,w.L)(),i=(0,A.e)(),{navbarRef:l,isNavbarVisible:d}=function(e){const[t,n]=(0,r.useState)(e),o=(0,r.useRef)(!1),a=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(a.current=e.getBoundingClientRect().height)}),[]);return(0,L.RF)(((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 o.current=!0,void n(!1);n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return(0,u.jsxs)("nav",{ref:l,"aria-label":(0,s.I)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,o.Z)("navbar","navbar--fixed-top",n&&[Qe.navbarHideable,!d&&Qe.navbarHidden],{"navbar--dark":"dark"===a,"navbar--primary":"primary"===a,"navbar-sidebar--show":i.shown}),children:[t,(0,u.jsx)(Ye,{onClick:i.toggle}),(0,u.jsx)(Ke,{})]})}var Je=n(8780);const et={errorBoundaryError:"errorBoundaryError_a6uf",errorBoundaryFallback:"errorBoundaryFallback_VBag"};function tt(e){return(0,u.jsx)("button",{type:"button",...e,children:(0,u.jsx)(s.Z,{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 ot="right";function at(e){let{width:t=30,height:n=30,className:r,...o}=e;return(0,u.jsx)("svg",{className:r,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true",...o,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,A.e)();return(0,u.jsx)("button",{onClick:e,"aria-label":(0,s.I)({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)(at,{})})}const lt={colorModeToggle:"colorModeToggle_DEke"};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)(He,{...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,A.e)(),t=(0,w.L)().navbar.items,[n,r]=function(e){function t(e){return"left"===(e.position??ot)}return[e.filter(t),e.filter((e=>!t(e)))]}(t),o=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)(W,{}),(0,u.jsx)(st,{items:n})]}),right:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(st,{items:r}),(0,u.jsx)(G,{className:lt.colorModeToggle}),!o&&(0,u.jsx)(ze,{children:(0,u.jsx)(Me,{})})]})})}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:o,prependBaseUrlToHref:a,...i}=t,l=(0,X.Z)(n),s=(0,X.Z)(r,{forcePrependBaseUrl:!0});return(0,u.jsxs)(Y.Z,{className:"footer__link-item",...r?{href:a?s:r}:{to:l},...i,children:[o,r&&!(0,J.Z)(r)&&(0,u.jsx)(te.Z,{})]})}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 gt(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 mt(){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)(mt,{})]},n)))})})}function vt(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?(0,u.jsx)(gt,{columns:t}):(0,u.jsx)(bt,{links:t})}var wt=n(9965);const kt={footerLogoLink:"footerLogoLink_BH7S"};function xt(e){let{logo:t}=e;const{withBaseUrl:n}=(0,X.C)(),r={light:n(t.src),dark:n(t.srcDark??t.src)};return(0,u.jsx)(wt.Z,{className:(0,o.Z)("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)(Y.Z,{href:t.href,className:kt.footerLogoLink,target:t.target,children:(0,u.jsx)(xt,{logo:t})}):(0,u.jsx)(xt,{logo:t})}function Et(e){let{copyright:t}=e;return(0,u.jsx)("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function Ct(e){let{style:t,links:n,logo:r,copyright:a}=e;return(0,u.jsx)("footer",{className:(0,o.Z)("footer",{"footer--dark":"dark"===t}),children:(0,u.jsxs)("div",{className:"container container-fluid",children:[n,(r||a)&&(0,u.jsxs)("div",{className:"footer__bottom text--center",children:[r&&(0,u.jsx)("div",{className:"margin-bottom--sm",children:r}),a]})]})})}function _t(){const{footer:e}=(0,w.L)();if(!e)return null;const{copyright:t,links:n,logo:r,style:o}=e;return(0,u.jsx)(Ct,{style:o,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(_t),jt=(0,R.Qc)([F.S,k.pl,L.OC,Ue.L5,i.VC,function(e){let{children:t}=e;return(0,u.jsx)(N.n2,{children:(0,u.jsx)(A.M,{children:(0,u.jsx)(O,{children:t})})})}]);function At(e){let{children:t}=e;return(0,u.jsx)(jt,{children:t})}var Lt=n(2503);function Rt(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.Z,{as:"h1",className:"hero__title",children:(0,u.jsx)(s.Z,{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 Nt={mainWrapper:"mainWrapper_z2l0"};function Pt(e){const{children:t,noFooter:n,wrapperClassName:r,title:l,description:s}=e;return(0,y.t)(),(0,u.jsxs)(At,{children:[(0,u.jsx)(i.d,{title:l,description:s}),(0,u.jsx)(v,{}),(0,u.jsx)(j,{}),(0,u.jsx)(dt,{}),(0,u.jsx)("div",{id:d,className:(0,o.Z)(m.k.wrapper.main,Nt.mainWrapper,r),children:(0,u.jsx)(a.Z,{fallback:e=>(0,u.jsx)(Rt,{...e}),children:t})}),!n&&(0,u.jsx)(Tt,{})]})}},1327:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});n(7294);var r=n(3692),o=n(4996),a=n(2263),i=n(6668),l=n(9965),s=n(5893);function c(e){let{logo:t,alt:n,imageClassName:r}=e;const a={light:(0,o.Z)(t.src),dark:(0,o.Z)(t.srcDark||t.src)},i=(0,s.jsx)(l.Z,{className:t.className,sources:a,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,a.Z)(),{navbar:{title:n,logo:l}}=(0,i.L)(),{imageClassName:u,titleClassName:d,...p}=e,f=(0,o.Z)(l?.href||"/"),h=n?"":t,g=l?.alt??h;return(0,s.jsxs)(r.Z,{to:f,...p,...l?.target&&{target:l.target},children:[l&&(0,s.jsx)(c,{logo:l,alt:g,imageClassName:u}),null!=n&&(0,s.jsx)("b",{className:d,children:n})]})}},197:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});n(7294);var r=n(5742),o=n(5893);function a(e){let{locale:t,version:n,tag:a}=e;const i=t;return(0,o.jsxs)(r.Z,{children:[t&&(0,o.jsx)("meta",{name:"docusaurus_locale",content:t}),n&&(0,o.jsx)("meta",{name:"docusaurus_version",content:n}),a&&(0,o.jsx)("meta",{name:"docusaurus_tag",content:a}),i&&(0,o.jsx)("meta",{name:"docsearch:language",content:i}),n&&(0,o.jsx)("meta",{name:"docsearch:version",content:n}),a&&(0,o.jsx)("meta",{name:"docsearch:docusaurus_tag",content:a})]})}},9965:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});var r=n(7294),o=n(788),a=n(2389),i=n(2949);const l={themedComponent:"themedComponent_mlkZ","themedComponent--light":"themedComponent--light_NVdE","themedComponent--dark":"themedComponent--dark_xIcU"};var s=n(5893);function c(e){let{className:t,children:n}=e;const c=(0,a.Z)(),{colorMode:u}=(0,i.I)();return(0,s.jsx)(s.Fragment,{children:(c?"dark"===u?["dark"]:["light"]:["light","dark"]).map((e=>{const a=n({theme:e,className:(0,o.Z)(t,l.themedComponent,l[`themedComponent--${e}`])});return(0,s.jsx)(r.Fragment,{children:a},e)}))})}function u(e){const{sources:t,className:n,alt:r,...o}=e;return(0,s.jsx)(c,{className:n,children:e=>{let{theme:n,className:a}=e;return(0,s.jsx)("img",{src:t[n],alt:r,className:a,...o})}})}},6043:(e,t,n)=>{"use strict";n.d(t,{u:()=>c,z:()=>y});var r=n(7294),o=n(412),a=n(469),i=n(1442),l=n(5893);const s="ease-in-out";function c(e){let{initialState:t}=e;const[n,o]=(0,r.useState)(t??!1),a=(0,r.useCallback)((()=>{o((e=>!e))}),[]);return{collapsed:n,setCollapsed:o,toggleCollapsed:a}}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:o}=e;const a=(0,r.useRef)(!1);(0,r.useEffect)((()=>{const e=t.current;function r(){const t=e.scrollHeight,n=o?.duration??function(e){if((0,i.n)())return 1;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${o?.easing??s}`,height:`${t}px`}}function l(){const t=r();e.style.transition=t.transition,e.style.height=t.height}if(!a.current)return p(e,n),void(a.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,o])}function h(e){if(!o.Z.canUseDOM)return e?u:d}function g(e){let{as:t="div",collapsed:n,children:o,animation:a,onCollapseTransitionEnd:i,className:s,disableSSRStyle:c}=e;const u=(0,r.useRef)(null);return f({collapsibleRef:u,collapsed:n,animation:a}),(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:o})}function m(e){let{collapsed:t,...n}=e;const[o,i]=(0,r.useState)(!t),[s,c]=(0,r.useState)(t);return(0,a.Z)((()=>{t||i(!0)}),[t]),(0,a.Z)((()=>{o&&c(t)}),[o,t]),o?(0,l.jsx)(g,{...n,collapsed:s}):null}function y(e){let{lazy:t,...n}=e;const r=t?m:g;return(0,l.jsx)(r,{...n})}},9689:(e,t,n)=>{"use strict";n.d(t,{nT:()=>g,pl:()=>h});var r=n(7294),o=n(2389),a=n(12),i=n(902),l=n(6668),s=n(5893);const c=(0,a.WA)("docusaurus.announcement.dismiss"),u=(0,a.WA)("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.L)(),t=(0,o.Z)(),[n,a]=(0,r.useState)((()=>!!t&&d()));(0,r.useEffect)((()=>{a(d())}),[]);const i=(0,r.useCallback)((()=>{p(!0),a(!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()||a(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return(0,s.jsx)(f.Provider,{value:n,children:t})}function g(){const e=(0,r.useContext)(f);if(!e)throw new i.i6("AnnouncementBarProvider");return e}},2949:(e,t,n)=>{"use strict";n.d(t,{I:()=>y,S:()=>m});var r=n(7294),o=n(412),a=n(902),i=n(12),l=n(6668),s=n(5893);const c=r.createContext(void 0),u="theme",d=(0,i.WA)(u),p={light:"light",dark:"dark"},f=e=>e===p.dark?p.dark:p.light,h=e=>o.Z.canUseDOM?f(document.documentElement.getAttribute("data-theme")):f(e),g=e=>{d.set(f(e))};function m(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,l.L)(),[o,a]=(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:o=!0}=r;t?(a(t),o&&g(t)):(a(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(o))}),[o]),(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:o,setColorMode:i,get isDarkTheme(){return o===p.dark},setLightTheme(){i(p.light)},setDarkTheme(){i(p.dark)}})),[o,i])}();return(0,s.jsx)(c.Provider,{value:n,children:t})}function y(){const e=(0,r.useContext)(c);if(null==e)throw new a.i6("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},373:(e,t,n)=>{"use strict";n.d(t,{J:()=>v,L5:()=>y,Oh:()=>w});var r=n(7294),o=n(143),a=n(9935),i=n(6668),l=n(3438),s=n(902),c=n(12),u=n(5893);const d=e=>`docs-preferred-version-${e}`,p={save:(e,t,n)=>{(0,c.WA)(d(e),{persistence:t}).set(n)},read:(e,t)=>(0,c.WA)(d(e),{persistence:t}).get(),clear:(e,t)=>{(0,c.WA)(d(e),{persistence:t}).del()}},f=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const h=r.createContext(null);function g(){const e=(0,o._r)(),t=(0,i.L)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[a,l]=(0,r.useState)((()=>f(n)));(0,r.useEffect)((()=>{l(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function o(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,o(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[a,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){p.save(e,t,n),l((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function m(e){let{children:t}=e;const n=g();return(0,u.jsx)(h.Provider,{value:n,children:t})}function y(e){let{children:t}=e;return l.cE?(0,u.jsx)(m,{children:t}):(0,u.jsx)(u.Fragment,{children:t})}function b(){const e=(0,r.useContext)(h);if(!e)throw new s.i6("DocsPreferredVersionContextProvider");return e}function v(e){void 0===e&&(e=a.m);const t=(0,o.zh)(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,o._r)(),[t]=b();function n(n){const r=e[n],{preferredVersionName:o}=t[n];return r.versions.find((e=>e.name===o))??null}const r=Object.keys(e);return Object.fromEntries(r.map((e=>[e,n(e)])))}},1116:(e,t,n)=>{"use strict";n.d(t,{V:()=>c,b:()=>s});var r=n(7294),o=n(902),a=n(5893);const i=Symbol("EmptyContext"),l=r.createContext(i);function s(e){let{children:t,name:n,items:o}=e;const i=(0,r.useMemo)((()=>n&&o?{name:n,items:o}:null),[n,o]);return(0,a.jsx)(l.Provider,{value:i,children:t})}function c(){const e=(0,r.useContext)(l);if(e===i)throw new o.i6("DocsSidebarProvider");return e}},4477:(e,t,n)=>{"use strict";n.d(t,{E:()=>s,q:()=>l});var r=n(7294),o=n(902),a=n(5893);const i=r.createContext(null);function l(e){let{children:t,version:n}=e;return(0,a.jsx)(i.Provider,{value:n,children:t})}function s(){const e=(0,r.useContext)(i);if(null===e)throw new o.i6("DocsVersionProvider");return e}},3163:(e,t,n)=>{"use strict";n.d(t,{M:()=>p,e:()=>f});var r=n(7294),o=n(3102),a=n(7524),i=n(1980),l=n(6668),s=n(902),c=n(5893);const u=r.createContext(void 0);function d(){const e=function(){const e=(0,o.HY)(),{items:t}=(0,l.L)().navbar;return 0===t.length&&!e.component}(),t=(0,a.i)(),n=!e&&"mobile"===t,[s,c]=(0,r.useState)(!1);(0,i.Rb)((()=>{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.i6("NavbarMobileSidebarProvider");return e}},3102:(e,t,n)=>{"use strict";n.d(t,{HY:()=>s,Zo:()=>c,n2:()=>l});var r=n(7294),o=n(902),a=n(5893);const i=r.createContext(null);function l(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return(0,a.jsx)(i.Provider,{value:n,children:t})}function s(){const e=(0,r.useContext)(i);if(!e)throw new o.i6("NavbarSecondaryMenuContentProvider");return e[0]}function c(e){let{component:t,props:n}=e;const a=(0,r.useContext)(i);if(!a)throw new o.i6("NavbarSecondaryMenuContentProvider");const[,l]=a,s=(0,o.Ql)(n);return(0,r.useEffect)((()=>{l({component:t,props:s})}),[l,t,s]),(0,r.useEffect)((()=>()=>l({component:null,props:null})),[l]),null}},9727:(e,t,n)=>{"use strict";n.d(t,{h:()=>o,t:()=>a});var r=n(7294);const o="navigation-with-keyboard";function a(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(o),"mousedown"===e.type&&document.body.classList.remove(o)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(o),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},6177:(e,t,n)=>{"use strict";n.d(t,{K:()=>l,M:()=>s});var r=n(7294),o=n(2263),a=n(1980);const i="q";function l(){return(0,a.Nc)(i)}function s(){const{siteConfig:{baseUrl:e,themeConfig:t}}=(0,o.Z)(),{algolia:{searchPagePath:n}}=t;return(0,r.useCallback)((t=>`${e}${n}?${i}=${encodeURIComponent(t)}`),[e,n])}},7524:(e,t,n)=>{"use strict";n.d(t,{i:()=>l});var r=n(7294),o=n(412);const a={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(!o.Z.canUseDOM)throw new Error("getWindowSize() should only be called after React hydration");return window.innerWidth>e?a.desktop:a.mobile}(t))}return e(),window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}}),[t]),n}},5281:(e,t,n)=>{"use strict";n.d(t,{k:()=>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"}}},1442:(e,t,n)=>{"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{n:()=>r})},3438:(e,t,n)=>{"use strict";n.d(t,{LM:()=>h,MN:()=>T,SN:()=>_,_F:()=>b,cE:()=>p,f:()=>w,jA:()=>g,lO:()=>S,oz:()=>E,s1:()=>x,vY:()=>C,xz:()=>f});var r=n(7294),o=n(6550),a=n(8790),i=n(143),l=n(373),s=n(4477),c=n(1116),u=n(7392),d=n(8596);const p=!!i._r;function f(e){const t=(0,s.E)();if(!e)return;const n=t.docs[e];if(!n)throw new Error(`no version doc found by id=${e}`);return n}function h(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=h(t);if(e)return e}}(e):void 0:e.href}function g(){const{pathname:e}=(0,o.TH)(),t=(0,c.V)();if(!t)throw new Error("Unexpected: cant find current sidebar in context");const n=k({sidebarItems:t.items,pathname:e,onlyCategories:!0}).slice(-1)[0];if(!n)throw new Error(`${e} is not associated with a category. useCurrentSidebarCategory() should only be used on category index pages.`);return n}const m=(e,t)=>void 0!==e&&(0,d.Mg)(e,t),y=(e,t)=>e.some((e=>b(e,t)));function b(e,t){return"link"===e.type?m(e.href,t):"category"===e.type&&(m(e.href,t)||y(e.items,t))}function v(e,t){switch(e.type){case"category":return b(e,t)||e.items.some((e=>v(e,t)));case"link":return!e.unlisted||b(e,t);default:return!0}}function w(e,t){return(0,r.useMemo)((()=>e.filter((e=>v(e,t)))),[e,t])}function k(e){let{sidebarItems:t,pathname:n,onlyCategories:r=!1}=e;const o=[];return function e(t){for(const a of t)if("category"===a.type&&((0,d.Mg)(a.href,n)||e(a.items))||"link"===a.type&&(0,d.Mg)(a.href,n)){return r&&"category"!==a.type||o.unshift(a),!0}return!1}(t),o}function x(){const e=(0,c.V)(),{pathname:t}=(0,o.TH)(),n=(0,i.gA)()?.pluginData.breadcrumbs;return!1!==n&&e?k({sidebarItems:e.items,pathname:t}):null}function S(e){const{activeVersion:t}=(0,i.Iw)(e),{preferredVersion:n}=(0,l.J)(e),o=(0,i.yW)(e);return(0,r.useMemo)((()=>(0,u.j)([t,n,o].filter(Boolean))),[t,n,o])}function E(e,t){const n=S(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 C(e,t){const n=S(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- ${(0,u.j)(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function _(e){let{route:t}=e;const n=(0,o.TH)(),r=(0,s.E)(),i=t.routes,l=i.find((e=>(0,o.LX)(n.pathname,e)));if(!l)return null;const c=l.sidebar,u=c?r.docsSidebars[c]:void 0;return{docElement:(0,a.H)(i),sidebarName:c,sidebarItems:u}}function T(e){return e.filter((e=>!("category"===e.type||"link"===e.type)||!!h(e)))}},2128:(e,t,n)=>{"use strict";n.d(t,{p:()=>o});var r=n(2263);function o(e){const{siteConfig:t}=(0,r.Z)(),{title:n,titleDelimiter:o}=t;return e?.trim().length?`${e.trim()} ${o} ${n}`:n}},1980:(e,t,n)=>{"use strict";n.d(t,{Nc:()=>c,Rb:()=>i,_X:()=>s});var r=n(7294),o=n(6550),a=n(902);function i(e){!function(e){const t=(0,o.k6)(),n=(0,a.zX)(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,o.k6)();return(0,r.useSyncExternalStore)(t.listen,(()=>e(t)),(()=>e(t)))}function s(e){return l((t=>null===e?null:new URLSearchParams(t.location.search).get(e)))}function c(e){const t=s(e)??"",n=function(e){const t=(0,o.k6)();return(0,r.useCallback)(((n,r)=>{const o=new URLSearchParams(t.location.search);n?o.set(e,n):o.delete(e),(r?.push?t.push:t.replace)({search:o.toString()})}),[e,t])}(e);return[t,n]}},7392:(e,t,n)=>{"use strict";function r(e,t){return void 0===t&&(t=(e,t)=>e===t),e.filter(((n,r)=>e.findIndex((e=>t(e,n)))!==r))}function o(e){return Array.from(new Set(e))}n.d(t,{j:()=>o,l:()=>r})},833:(e,t,n)=>{"use strict";n.d(t,{FG:()=>f,d:()=>d,VC:()=>h});var r=n(7294),o=n(788),a=n(5742),i=n(226);function l(){const e=r.useContext(i._);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var s=n(4996),c=n(2128),u=n(5893);function d(e){let{title:t,description:n,keywords:r,image:o,children:i}=e;const l=(0,c.p)(t),{withBaseUrl:d}=(0,s.C)(),p=o?d(o,{absolute:!0}):void 0;return(0,u.jsxs)(a.Z,{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,o.Z)(i,t);return(0,u.jsxs)(p.Provider,{value:l,children:[(0,u.jsx)(a.Z,{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 a=`plugin-id-${n.plugin.id}`;return(0,u.jsx)(f,{className:(0,o.Z)(r,a),children:t})}},902:(e,t,n)=>{"use strict";n.d(t,{D9:()=>l,Qc:()=>u,Ql:()=>c,i6:()=>s,zX:()=>i});var r=n(7294),o=n(469),a=n(5893);function i(e){const t=(0,r.useRef)(e);return(0,o.Z)((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function l(e){const t=(0,r.useRef)();return(0,o.Z)((()=>{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,a.jsx)(a.Fragment,{children:e.reduceRight(((e,t)=>(0,a.jsx)(t,{children:e})),n)})}}},8022:(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,{F:()=>r})},8596:(e,t,n)=>{"use strict";n.d(t,{Mg:()=>i,Ns:()=>l});var r=n(7294),o=n(723),a=n(2263);function i(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function l(){const{baseUrl:e}=(0,a.Z)().siteConfig;return(0,r.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function r(e){return e.path===t&&!0===e.exact}function o(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(o).flatMap((e=>e.routes??[])))}(n)}({routes:o.Z,baseUrl:e})),[e])}},2466:(e,t,n)=>{"use strict";n.d(t,{Ct:()=>g,OC:()=>u,RF:()=>f,o5:()=>h});var r=n(7294),o=n(412),a=n(2389),i=n(469),l=n(902),s=n(5893);const c=r.createContext(void 0);function u(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,s.jsx)(c.Provider,{value:n,children:t})}function d(){const e=(0,r.useContext)(c);if(null==e)throw new l.i6("ScrollControllerProvider");return e}const p=()=>o.Z.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function f(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=d(),o=(0,r.useRef)(p()),a=(0,l.zX)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=p();a(e,o.current),o.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[a,n,...t])}function h(){const e=d(),t=function(){const e=(0,r.useRef)({elem:null,top:0}),t=(0,r.useCallback)((t=>{e.current={elem:t,top:t.getBoundingClientRect().top}}),[]),n=(0,r.useCallback)((()=>{const{current:{elem:t,top:n}}=e;if(!t)return{restored:!1};const r=t.getBoundingClientRect().top-n;return r&&window.scrollBy({left:0,top:r}),e.current={elem:null,top:0},{restored:0!==r}}),[]);return(0,r.useMemo)((()=>({save:t,restore:n})),[n,t])}(),n=(0,r.useRef)(void 0),o=(0,r.useCallback)((r=>{t.save(r),e.disableScrollEvents(),n.current=()=>{const{restored:r}=t.restore();if(n.current=void 0,r){const t=()=>{e.enableScrollEvents(),window.removeEventListener("scroll",t)};window.addEventListener("scroll",t)}else e.enableScrollEvents()}}),[e,t]);return(0,i.Z)((()=>{queueMicrotask((()=>n.current?.()))})),{blockElementScrollPositionUntilNextRender:o}}function g(){const e=(0,r.useRef)(null),t=(0,a.Z)()&&"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 o=document.documentElement.scrollTop;(n&&o>e||!n&&ot&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},3320:(e,t,n)=>{"use strict";n.d(t,{HX:()=>i,_q:()=>s,os:()=>l});var r=n(143),o=n(2263),a=n(373);const i="default";function l(e,t){return`docs-${e}-${t}`}function s(){const{i18n:e}=(0,o.Z)(),t=(0,r._r)(),n=(0,r.WS)(),s=(0,a.Oh)();const c=[i,...Object.keys(t).map((function(e){const r=n?.activePlugin.pluginId===e?n.activeVersion:void 0,o=s[e],a=t[e].versions.find((e=>e.isLast));return l(e,(r??o??a).name)}))];return{locale:e.currentLocale,tags:c}}},12:(e,t,n)=>{"use strict";n.d(t,{Nk:()=>u,WA:()=>c});var r=n(7294);const o="localStorage";function a(e){let{key:t,oldValue:n,newValue:r,storage:o}=e;if(n===r)return;const a=document.createEvent("StorageEvent");a.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,o),window.dispatchEvent(a)}function i(e){if(void 0===e&&(e=o),"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){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}}(e);const n=i(t?.persistence);return null===n?s:{get:()=>{try{return n.getItem(e)}catch(t){return console.error(`Docusaurus storage error, can't get key=${e}`,t),null}},set:t=>{try{const r=n.getItem(e);n.setItem(e,t),a({key:e,oldValue:r,newValue:t,storage:n})}catch(r){console.error(`Docusaurus storage error, can't set ${e}=${t}`,r)}},del:()=>{try{const t=n.getItem(e);n.removeItem(e),a({key:e,oldValue:t,newValue:null,storage:n})}catch(t){console.error(`Docusaurus storage error, can't delete key=${e}`,t)}},listen:t=>{try{const r=r=>{r.storageArea===n&&r.key===e&&t(r)};return window.addEventListener("storage",r),()=>window.removeEventListener("storage",r)}catch(r){return console.error(`Docusaurus storage error, can't listen for changes of key=${e}`,r),()=>{}}}}}function u(e,t){const n=(0,r.useRef)((()=>null===e?s:c(e,t))).current(),o=(0,r.useCallback)((e=>"undefined"==typeof window?()=>{}:n.listen(e)),[n]);return[(0,r.useSyncExternalStore)(o,(()=>"undefined"==typeof window?null:n.get()),(()=>null)),n]}},4711:(e,t,n)=>{"use strict";n.d(t,{l:()=>i});var r=n(2263),o=n(6550),a=n(8780);function i(){const{siteConfig:{baseUrl:e,url:t,trailingSlash:n},i18n:{defaultLocale:i,currentLocale:l}}=(0,r.Z)(),{pathname:s}=(0,o.TH)(),c=(0,a.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}`}}}},5936:(e,t,n)=>{"use strict";n.d(t,{S:()=>i});var r=n(7294),o=n(6550),a=n(902);function i(e){const t=(0,o.TH)(),n=(0,a.D9)(t),i=(0,a.zX)(e);(0,r.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},6668:(e,t,n)=>{"use strict";n.d(t,{L:()=>o});var r=n(2263);function o(){return(0,r.Z)().siteConfig.themeConfig}},6278:(e,t,n)=>{"use strict";n.d(t,{L:()=>o});var r=n(2263);function o(){const{siteConfig:{themeConfig:e}}=(0,r.Z)();return e}},239:(e,t,n)=>{"use strict";n.d(t,{l:()=>l});var r=n(7294),o=n(8022),a=n(4996),i=n(6278);function l(){const{withBaseUrl:e}=(0,a.C)(),{algolia:{externalUrlRegex:t,replaceSearchResultPathname:n}}=(0,i.L)();return(0,r.useCallback)((r=>{const a=new URL(r);if((0,o.F)(t,a.href))return r;const i=`${a.pathname+a.hash}`;return e(function(e,t){return t?e.replaceAll(new RegExp(t.from,"g"),t.to):e}(i,n))}),[e,t,n])}},8802:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.removeTrailingSlash=t.addLeadingSlash=t.addTrailingSlash=void 0;const r=n(5913);function o(e){return e.endsWith("/")?e:`${e}/`}function a(e){return(0,r.removeSuffix)(e,"/")}t.addTrailingSlash=o,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?o(s):a(s));var s;return e.replace(i,l)},t.addLeadingSlash=function(e){return(0,r.addPrefix)(e,"/")},t.removeTrailingSlash=a},4143:(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]}},8780: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 o=n(8802);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r(o).default}}),Object.defineProperty(t,"addTrailingSlash",{enumerable:!0,get:function(){return o.addTrailingSlash}}),Object.defineProperty(t,"addLeadingSlash",{enumerable:!0,get:function(){return o.addLeadingSlash}}),Object.defineProperty(t,"removeTrailingSlash",{enumerable:!0,get:function(){return o.removeTrailingSlash}});var a=n(5913);Object.defineProperty(t,"addPrefix",{enumerable:!0,get:function(){return a.addPrefix}}),Object.defineProperty(t,"removeSuffix",{enumerable:!0,get:function(){return a.removeSuffix}}),Object.defineProperty(t,"addSuffix",{enumerable:!0,get:function(){return a.addSuffix}}),Object.defineProperty(t,"removePrefix",{enumerable:!0,get:function(){return a.removePrefix}});var i=n(4143);Object.defineProperty(t,"getErrorCausalChain",{enumerable:!0,get:function(){return i.getErrorCausalChain}})},5913:(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}},2358:(e,t,n)=>{"use strict";n.d(t,{lX:()=>S,q_:()=>A,ob:()=>g,PP:()=>R,Ep:()=>h,Hp:()=>m});var r=n(7462);function o(e){return"/"===e.charAt(0)}function a(e,t){for(var n=t,r=n+1,o=e.length;r=0;p--){var f=i[p];"."===f?a(i,p):".."===f?(a(i,p),d++):d&&(a(i,p),d--)}if(!c)for(;d--;d)i.unshift("..");!c||""===i[0]||i[0]&&o(i[0])||i.unshift("");var h=i.join("/");return n&&"/"!==h.substr(-1)&&(h+="/"),h};function l(e){return e.valueOf?e.valueOf():Object.prototype.valueOf.call(e)}const s=function e(t,n){if(t===n)return!0;if(null==t||null==n)return!1;if(Array.isArray(t))return Array.isArray(n)&&t.length===n.length&&t.every((function(t,r){return e(t,n[r])}));if("object"==typeof t||"object"==typeof n){var r=l(t),o=l(n);return r!==t||o!==n?e(r,o):Object.keys(Object.assign({},t,n)).every((function(r){return e(t[r],n[r])}))}return!1};var c=n(8776);function u(e){return"/"===e.charAt(0)?e:"/"+e}function d(e){return"/"===e.charAt(0)?e.substr(1):e}function p(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 f(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function h(e){var t=e.pathname,n=e.search,r=e.hash,o=t||"/";return n&&"?"!==n&&(o+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(o+="#"===r.charAt(0)?r:"#"+r),o}function g(e,t,n,o){var a;"string"==typeof e?(a=function(e){var t=e||"/",n="",r="",o=t.indexOf("#");-1!==o&&(r=t.substr(o),t=t.substr(0,o));var a=t.indexOf("?");return-1!==a&&(n=t.substr(a),t=t.substr(0,a)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),a.state=t):(void 0===(a=(0,r.Z)({},e)).pathname&&(a.pathname=""),a.search?"?"!==a.search.charAt(0)&&(a.search="?"+a.search):a.search="",a.hash?"#"!==a.hash.charAt(0)&&(a.hash="#"+a.hash):a.hash="",void 0!==t&&void 0===a.state&&(a.state=t));try{a.pathname=decodeURI(a.pathname)}catch(l){throw l instanceof URIError?new URIError('Pathname "'+a.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):l}return n&&(a.key=n),o?a.pathname?"/"!==a.pathname.charAt(0)&&(a.pathname=i(a.pathname,o.pathname)):a.pathname=o.pathname:a.pathname||(a.pathname="/"),a}function m(e,t){return e.pathname===t.pathname&&e.search===t.search&&e.hash===t.hash&&e.key===t.key&&s(e.state,t.state)}function y(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,o){if(null!=e){var a="function"==typeof e?e(t,n):e;"string"==typeof a?"function"==typeof r?r(a,o):o(!0):o(!1!==a)}else o(!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,o):n.push(o),d({action:r,location:o,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",o=g(e,t,p(),w.location);u.confirmTransitionTo(o,r,n,(function(e){e&&(w.entries[w.index]=o,d({action:r,location:o}))}))},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(9864),o={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},a={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]||o}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 o=f(n);o&&o!==h&&e(t,o,r)}var i=u(n);d&&(i=i.concat(d(n)));for(var l=s(t),g=s(n),m=0;m{"use strict";e.exports=function(e,t,n,r,o,a,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,o,a,i,l],u=0;(s=new Error(t.replace(/%s/g,(function(){return c[u++]})))).name="Invariant Violation"}throw s.framesToPop=1,s}}},5826:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},2497:(e,t,n)=>{"use strict";n.r(t)},2295:(e,t,n)=>{"use strict";n.r(t)},4865:function(e,t,n){var r,o;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 o(e,t,n){return en?n:e}function a(e){return 100*(-1+e)}function i(e,t,n){var o;return(o="translate3d"===r.positionUsing?{transform:"translate3d("+a(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+a(e)+"%,0)"}:{"margin-left":a(e)+"%"}).transition="all "+t+"ms "+n,o}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=o(e,r.minimum,1),n.status=1===e?null:e;var a=n.render(!t),c=a.querySelector(r.barSelector),u=r.speed,d=r.easing;return a.offsetWidth,l((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),s(c,i(e,u,d)),1===e?(s(a,{transition:"none",opacity:1}),a.offsetWidth,setTimeout((function(){s(a,{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)*o(Math.random()*t,.1,.95)),t=o(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 o,i=t.querySelector(r.barSelector),l=e?"-100":a(n.status||0),c=document.querySelector(r.parent);return s(i,{transition:"all 0 linear",transform:"translate3d("+l+"%,0,0)"}),r.showSpinner||(o=t.querySelector(r.spinnerSelector))&&f(o),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,o=e.length,a=t.charAt(0).toUpperCase()+t.slice(1);o--;)if((r=e[o]+a)in n)return r;return t}function o(e){return e=n(e),t[e]||(t[e]=r(e))}function a(e,t,n){t=o(t),e.style[t]=n}return function(e,t){var n,r,o=arguments;if(2==o.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&a(e,n,r);else a(e,o[1],o[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===(o="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=o)},4779:(e,t,n)=>{var r=n(5826);e.exports=f,e.exports.parse=a,e.exports.compile=function(e,t){return l(a(e,t),t)},e.exports.tokensToFunction=l,e.exports.tokensToRegExp=p;var o=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function a(e,t){for(var n,r=[],a=0,i=0,l="",u=t&&t.delimiter||"/";null!=(n=o.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],g=n[2],m=n[3],y=n[4],b=n[5],v=n[6],w=n[7];l&&(r.push(l),l="");var k=null!=g&&null!=h&&h!==g,x="+"===v||"*"===v,S="?"===v||"*"===v,E=n[2]||u,C=y||b;r.push({name:m||a++,prefix:g||"",delimiter:E,optional:S,repeat:x,partial:k,asterisk:!!w,pattern:C?c(C):w?".*":"[^"+s(E)+"]+?"})}}return i{e.exports&&(e.exports={core:{meta:{path:"components/prism-core.js",option:"mandatory"},core:"Core"},themes:{meta:{path:"themes/{id}.css",link:"index.html?theme={id}",exclusive:!0},prism:{title:"Default",option:"default"},"prism-dark":"Dark","prism-funky":"Funky","prism-okaidia":{title:"Okaidia",owner:"ocodia"},"prism-twilight":{title:"Twilight",owner:"remybach"},"prism-coy":{title:"Coy",owner:"tshedor"},"prism-solarizedlight":{title:"Solarized Light",owner:"hectormatos2011 "},"prism-tomorrow":{title:"Tomorrow Night",owner:"Rosey"}},languages:{meta:{path:"components/prism-{id}",noCSS:!0,examplesPath:"examples/prism-{id}",addCheckAll:!0},markup:{title:"Markup",alias:["html","xml","svg","mathml","ssml","atom","rss"],aliasTitles:{html:"HTML",xml:"XML",svg:"SVG",mathml:"MathML",ssml:"SSML",atom:"Atom",rss:"RSS"},option:"default"},css:{title:"CSS",option:"default",modify:"markup"},clike:{title:"C-like",option:"default"},javascript:{title:"JavaScript",require:"clike",modify:"markup",optional:"regex",alias:"js",option:"default"},abap:{title:"ABAP",owner:"dellagustin"},abnf:{title:"ABNF",owner:"RunDevelopment"},actionscript:{title:"ActionScript",require:"javascript",modify:"markup",owner:"Golmote"},ada:{title:"Ada",owner:"Lucretia"},agda:{title:"Agda",owner:"xy-ren"},al:{title:"AL",owner:"RunDevelopment"},antlr4:{title:"ANTLR4",alias:"g4",owner:"RunDevelopment"},apacheconf:{title:"Apache Configuration",owner:"GuiTeK"},apex:{title:"Apex",require:["clike","sql"],owner:"RunDevelopment"},apl:{title:"APL",owner:"ngn"},applescript:{title:"AppleScript",owner:"Golmote"},aql:{title:"AQL",owner:"RunDevelopment"},arduino:{title:"Arduino",require:"cpp",alias:"ino",owner:"dkern"},arff:{title:"ARFF",owner:"Golmote"},armasm:{title:"ARM Assembly",alias:"arm-asm",owner:"RunDevelopment"},arturo:{title:"Arturo",alias:"art",optional:["bash","css","javascript","markup","markdown","sql"],owner:"drkameleon"},asciidoc:{alias:"adoc",title:"AsciiDoc",owner:"Golmote"},aspnet:{title:"ASP.NET (C#)",require:["markup","csharp"],owner:"nauzilus"},asm6502:{title:"6502 Assembly",owner:"kzurawel"},asmatmel:{title:"Atmel AVR Assembly",owner:"cerkit"},autohotkey:{title:"AutoHotkey",owner:"aviaryan"},autoit:{title:"AutoIt",owner:"Golmote"},avisynth:{title:"AviSynth",alias:"avs",owner:"Zinfidel"},"avro-idl":{title:"Avro IDL",alias:"avdl",owner:"RunDevelopment"},awk:{title:"AWK",alias:"gawk",aliasTitles:{gawk:"GAWK"},owner:"RunDevelopment"},bash:{title:"Bash",alias:["sh","shell"],aliasTitles:{sh:"Shell",shell:"Shell"},owner:"zeitgeist87"},basic:{title:"BASIC",owner:"Golmote"},batch:{title:"Batch",owner:"Golmote"},bbcode:{title:"BBcode",alias:"shortcode",aliasTitles:{shortcode:"Shortcode"},owner:"RunDevelopment"},bbj:{title:"BBj",owner:"hyyan"},bicep:{title:"Bicep",owner:"johnnyreilly"},birb:{title:"Birb",require:"clike",owner:"Calamity210"},bison:{title:"Bison",require:"c",owner:"Golmote"},bnf:{title:"BNF",alias:"rbnf",aliasTitles:{rbnf:"RBNF"},owner:"RunDevelopment"},bqn:{title:"BQN",owner:"yewscion"},brainfuck:{title:"Brainfuck",owner:"Golmote"},brightscript:{title:"BrightScript",owner:"RunDevelopment"},bro:{title:"Bro",owner:"wayward710"},bsl:{title:"BSL (1C:Enterprise)",alias:"oscript",aliasTitles:{oscript:"OneScript"},owner:"Diversus23"},c:{title:"C",require:"clike",owner:"zeitgeist87"},csharp:{title:"C#",require:"clike",alias:["cs","dotnet"],owner:"mvalipour"},cpp:{title:"C++",require:"c",owner:"zeitgeist87"},cfscript:{title:"CFScript",require:"clike",alias:"cfc",owner:"mjclemente"},chaiscript:{title:"ChaiScript",require:["clike","cpp"],owner:"RunDevelopment"},cil:{title:"CIL",owner:"sbrl"},cilkc:{title:"Cilk/C",require:"c",alias:"cilk-c",owner:"OpenCilk"},cilkcpp:{title:"Cilk/C++",require:"cpp",alias:["cilk-cpp","cilk"],owner:"OpenCilk"},clojure:{title:"Clojure",owner:"troglotit"},cmake:{title:"CMake",owner:"mjrogozinski"},cobol:{title:"COBOL",owner:"RunDevelopment"},coffeescript:{title:"CoffeeScript",require:"javascript",alias:"coffee",owner:"R-osey"},concurnas:{title:"Concurnas",alias:"conc",owner:"jasontatton"},csp:{title:"Content-Security-Policy",owner:"ScottHelme"},cooklang:{title:"Cooklang",owner:"ahue"},coq:{title:"Coq",owner:"RunDevelopment"},crystal:{title:"Crystal",require:"ruby",owner:"MakeNowJust"},"css-extras":{title:"CSS Extras",require:"css",modify:"css",owner:"milesj"},csv:{title:"CSV",owner:"RunDevelopment"},cue:{title:"CUE",owner:"RunDevelopment"},cypher:{title:"Cypher",owner:"RunDevelopment"},d:{title:"D",require:"clike",owner:"Golmote"},dart:{title:"Dart",require:"clike",owner:"Golmote"},dataweave:{title:"DataWeave",owner:"machaval"},dax:{title:"DAX",owner:"peterbud"},dhall:{title:"Dhall",owner:"RunDevelopment"},diff:{title:"Diff",owner:"uranusjr"},django:{title:"Django/Jinja2",require:"markup-templating",alias:"jinja2",owner:"romanvm"},"dns-zone-file":{title:"DNS zone file",owner:"RunDevelopment",alias:"dns-zone"},docker:{title:"Docker",alias:"dockerfile",owner:"JustinBeckwith"},dot:{title:"DOT (Graphviz)",alias:"gv",optional:"markup",owner:"RunDevelopment"},ebnf:{title:"EBNF",owner:"RunDevelopment"},editorconfig:{title:"EditorConfig",owner:"osipxd"},eiffel:{title:"Eiffel",owner:"Conaclos"},ejs:{title:"EJS",require:["javascript","markup-templating"],owner:"RunDevelopment",alias:"eta",aliasTitles:{eta:"Eta"}},elixir:{title:"Elixir",owner:"Golmote"},elm:{title:"Elm",owner:"zwilias"},etlua:{title:"Embedded Lua templating",require:["lua","markup-templating"],owner:"RunDevelopment"},erb:{title:"ERB",require:["ruby","markup-templating"],owner:"Golmote"},erlang:{title:"Erlang",owner:"Golmote"},"excel-formula":{title:"Excel Formula",alias:["xlsx","xls"],owner:"RunDevelopment"},fsharp:{title:"F#",require:"clike",owner:"simonreynolds7"},factor:{title:"Factor",owner:"catb0t"},false:{title:"False",owner:"edukisto"},"firestore-security-rules":{title:"Firestore security rules",require:"clike",owner:"RunDevelopment"},flow:{title:"Flow",require:"javascript",owner:"Golmote"},fortran:{title:"Fortran",owner:"Golmote"},ftl:{title:"FreeMarker Template Language",require:"markup-templating",owner:"RunDevelopment"},gml:{title:"GameMaker Language",alias:"gamemakerlanguage",require:"clike",owner:"LiarOnce"},gap:{title:"GAP (CAS)",owner:"RunDevelopment"},gcode:{title:"G-code",owner:"RunDevelopment"},gdscript:{title:"GDScript",owner:"RunDevelopment"},gedcom:{title:"GEDCOM",owner:"Golmote"},gettext:{title:"gettext",alias:"po",owner:"RunDevelopment"},gherkin:{title:"Gherkin",owner:"hason"},git:{title:"Git",owner:"lgiraudel"},glsl:{title:"GLSL",require:"c",owner:"Golmote"},gn:{title:"GN",alias:"gni",owner:"RunDevelopment"},"linker-script":{title:"GNU Linker Script",alias:"ld",owner:"RunDevelopment"},go:{title:"Go",require:"clike",owner:"arnehormann"},"go-module":{title:"Go module",alias:"go-mod",owner:"RunDevelopment"},gradle:{title:"Gradle",require:"clike",owner:"zeabdelkhalek-badido18"},graphql:{title:"GraphQL",optional:"markdown",owner:"Golmote"},groovy:{title:"Groovy",require:"clike",owner:"robfletcher"},haml:{title:"Haml",require:"ruby",optional:["css","css-extras","coffeescript","erb","javascript","less","markdown","scss","textile"],owner:"Golmote"},handlebars:{title:"Handlebars",require:"markup-templating",alias:["hbs","mustache"],aliasTitles:{mustache:"Mustache"},owner:"Golmote"},haskell:{title:"Haskell",alias:"hs",owner:"bholst"},haxe:{title:"Haxe",require:"clike",optional:"regex",owner:"Golmote"},hcl:{title:"HCL",owner:"outsideris"},hlsl:{title:"HLSL",require:"c",owner:"RunDevelopment"},hoon:{title:"Hoon",owner:"matildepark"},http:{title:"HTTP",optional:["csp","css","hpkp","hsts","javascript","json","markup","uri"],owner:"danielgtaylor"},hpkp:{title:"HTTP Public-Key-Pins",owner:"ScottHelme"},hsts:{title:"HTTP Strict-Transport-Security",owner:"ScottHelme"},ichigojam:{title:"IchigoJam",owner:"BlueCocoa"},icon:{title:"Icon",owner:"Golmote"},"icu-message-format":{title:"ICU Message Format",owner:"RunDevelopment"},idris:{title:"Idris",alias:"idr",owner:"KeenS",require:"haskell"},ignore:{title:".ignore",owner:"osipxd",alias:["gitignore","hgignore","npmignore"],aliasTitles:{gitignore:".gitignore",hgignore:".hgignore",npmignore:".npmignore"}},inform7:{title:"Inform 7",owner:"Golmote"},ini:{title:"Ini",owner:"aviaryan"},io:{title:"Io",owner:"AlesTsurko"},j:{title:"J",owner:"Golmote"},java:{title:"Java",require:"clike",owner:"sherblot"},javadoc:{title:"JavaDoc",require:["markup","java","javadoclike"],modify:"java",optional:"scala",owner:"RunDevelopment"},javadoclike:{title:"JavaDoc-like",modify:["java","javascript","php"],owner:"RunDevelopment"},javastacktrace:{title:"Java stack trace",owner:"RunDevelopment"},jexl:{title:"Jexl",owner:"czosel"},jolie:{title:"Jolie",require:"clike",owner:"thesave"},jq:{title:"JQ",owner:"RunDevelopment"},jsdoc:{title:"JSDoc",require:["javascript","javadoclike","typescript"],modify:"javascript",optional:["actionscript","coffeescript"],owner:"RunDevelopment"},"js-extras":{title:"JS Extras",require:"javascript",modify:"javascript",optional:["actionscript","coffeescript","flow","n4js","typescript"],owner:"RunDevelopment"},json:{title:"JSON",alias:"webmanifest",aliasTitles:{webmanifest:"Web App Manifest"},owner:"CupOfTea696"},json5:{title:"JSON5",require:"json",owner:"RunDevelopment"},jsonp:{title:"JSONP",require:"json",owner:"RunDevelopment"},jsstacktrace:{title:"JS stack trace",owner:"sbrl"},"js-templates":{title:"JS Templates",require:"javascript",modify:"javascript",optional:["css","css-extras","graphql","markdown","markup","sql"],owner:"RunDevelopment"},julia:{title:"Julia",owner:"cdagnino"},keepalived:{title:"Keepalived Configure",owner:"dev-itsheng"},keyman:{title:"Keyman",owner:"mcdurdin"},kotlin:{title:"Kotlin",alias:["kt","kts"],aliasTitles:{kts:"Kotlin Script"},require:"clike",owner:"Golmote"},kumir:{title:"KuMir (\u041a\u0443\u041c\u0438\u0440)",alias:"kum",owner:"edukisto"},kusto:{title:"Kusto",owner:"RunDevelopment"},latex:{title:"LaTeX",alias:["tex","context"],aliasTitles:{tex:"TeX",context:"ConTeXt"},owner:"japborst"},latte:{title:"Latte",require:["clike","markup-templating","php"],owner:"nette"},less:{title:"Less",require:"css",optional:"css-extras",owner:"Golmote"},lilypond:{title:"LilyPond",require:"scheme",alias:"ly",owner:"RunDevelopment"},liquid:{title:"Liquid",require:"markup-templating",owner:"cinhtau"},lisp:{title:"Lisp",alias:["emacs","elisp","emacs-lisp"],owner:"JuanCaicedo"},livescript:{title:"LiveScript",owner:"Golmote"},llvm:{title:"LLVM IR",owner:"porglezomp"},log:{title:"Log file",optional:"javastacktrace",owner:"RunDevelopment"},lolcode:{title:"LOLCODE",owner:"Golmote"},lua:{title:"Lua",owner:"Golmote"},magma:{title:"Magma (CAS)",owner:"RunDevelopment"},makefile:{title:"Makefile",owner:"Golmote"},markdown:{title:"Markdown",require:"markup",optional:"yaml",alias:"md",owner:"Golmote"},"markup-templating":{title:"Markup templating",require:"markup",owner:"Golmote"},mata:{title:"Mata",owner:"RunDevelopment"},matlab:{title:"MATLAB",owner:"Golmote"},maxscript:{title:"MAXScript",owner:"RunDevelopment"},mel:{title:"MEL",owner:"Golmote"},mermaid:{title:"Mermaid",owner:"RunDevelopment"},metafont:{title:"METAFONT",owner:"LaeriExNihilo"},mizar:{title:"Mizar",owner:"Golmote"},mongodb:{title:"MongoDB",owner:"airs0urce",require:"javascript"},monkey:{title:"Monkey",owner:"Golmote"},moonscript:{title:"MoonScript",alias:"moon",owner:"RunDevelopment"},n1ql:{title:"N1QL",owner:"TMWilds"},n4js:{title:"N4JS",require:"javascript",optional:"jsdoc",alias:"n4jsd",owner:"bsmith-n4"},"nand2tetris-hdl":{title:"Nand To Tetris HDL",owner:"stephanmax"},naniscript:{title:"Naninovel Script",owner:"Elringus",alias:"nani"},nasm:{title:"NASM",owner:"rbmj"},neon:{title:"NEON",owner:"nette"},nevod:{title:"Nevod",owner:"nezaboodka"},nginx:{title:"nginx",owner:"volado"},nim:{title:"Nim",owner:"Golmote"},nix:{title:"Nix",owner:"Golmote"},nsis:{title:"NSIS",owner:"idleberg"},objectivec:{title:"Objective-C",require:"c",alias:"objc",owner:"uranusjr"},ocaml:{title:"OCaml",owner:"Golmote"},odin:{title:"Odin",owner:"edukisto"},opencl:{title:"OpenCL",require:"c",modify:["c","cpp"],owner:"Milania1"},openqasm:{title:"OpenQasm",alias:"qasm",owner:"RunDevelopment"},oz:{title:"Oz",owner:"Golmote"},parigp:{title:"PARI/GP",owner:"Golmote"},parser:{title:"Parser",require:"markup",owner:"Golmote"},pascal:{title:"Pascal",alias:"objectpascal",aliasTitles:{objectpascal:"Object Pascal"},owner:"Golmote"},pascaligo:{title:"Pascaligo",owner:"DefinitelyNotAGoat"},psl:{title:"PATROL Scripting Language",owner:"bertysentry"},pcaxis:{title:"PC-Axis",alias:"px",owner:"RunDevelopment"},peoplecode:{title:"PeopleCode",alias:"pcode",owner:"RunDevelopment"},perl:{title:"Perl",owner:"Golmote"},php:{title:"PHP",require:"markup-templating",owner:"milesj"},phpdoc:{title:"PHPDoc",require:["php","javadoclike"],modify:"php",owner:"RunDevelopment"},"php-extras":{title:"PHP Extras",require:"php",modify:"php",owner:"milesj"},"plant-uml":{title:"PlantUML",alias:"plantuml",owner:"RunDevelopment"},plsql:{title:"PL/SQL",require:"sql",owner:"Golmote"},powerquery:{title:"PowerQuery",alias:["pq","mscript"],owner:"peterbud"},powershell:{title:"PowerShell",owner:"nauzilus"},processing:{title:"Processing",require:"clike",owner:"Golmote"},prolog:{title:"Prolog",owner:"Golmote"},promql:{title:"PromQL",owner:"arendjr"},properties:{title:".properties",owner:"Golmote"},protobuf:{title:"Protocol Buffers",require:"clike",owner:"just-boris"},pug:{title:"Pug",require:["markup","javascript"],optional:["coffeescript","ejs","handlebars","less","livescript","markdown","scss","stylus","twig"],owner:"Golmote"},puppet:{title:"Puppet",owner:"Golmote"},pure:{title:"Pure",optional:["c","cpp","fortran"],owner:"Golmote"},purebasic:{title:"PureBasic",require:"clike",alias:"pbfasm",owner:"HeX0R101"},purescript:{title:"PureScript",require:"haskell",alias:"purs",owner:"sriharshachilakapati"},python:{title:"Python",alias:"py",owner:"multipetros"},qsharp:{title:"Q#",require:"clike",alias:"qs",owner:"fedonman"},q:{title:"Q (kdb+ database)",owner:"Golmote"},qml:{title:"QML",require:"javascript",owner:"RunDevelopment"},qore:{title:"Qore",require:"clike",owner:"temnroegg"},r:{title:"R",owner:"Golmote"},racket:{title:"Racket",require:"scheme",alias:"rkt",owner:"RunDevelopment"},cshtml:{title:"Razor C#",alias:"razor",require:["markup","csharp"],optional:["css","css-extras","javascript","js-extras"],owner:"RunDevelopment"},jsx:{title:"React JSX",require:["markup","javascript"],optional:["jsdoc","js-extras","js-templates"],owner:"vkbansal"},tsx:{title:"React TSX",require:["jsx","typescript"]},reason:{title:"Reason",require:"clike",owner:"Golmote"},regex:{title:"Regex",owner:"RunDevelopment"},rego:{title:"Rego",owner:"JordanSh"},renpy:{title:"Ren'py",alias:"rpy",owner:"HyuchiaDiego"},rescript:{title:"ReScript",alias:"res",owner:"vmarcosp"},rest:{title:"reST (reStructuredText)",owner:"Golmote"},rip:{title:"Rip",owner:"ravinggenius"},roboconf:{title:"Roboconf",owner:"Golmote"},robotframework:{title:"Robot Framework",alias:"robot",owner:"RunDevelopment"},ruby:{title:"Ruby",require:"clike",alias:"rb",owner:"samflores"},rust:{title:"Rust",owner:"Golmote"},sas:{title:"SAS",optional:["groovy","lua","sql"],owner:"Golmote"},sass:{title:"Sass (Sass)",require:"css",optional:"css-extras",owner:"Golmote"},scss:{title:"Sass (SCSS)",require:"css",optional:"css-extras",owner:"MoOx"},scala:{title:"Scala",require:"java",owner:"jozic"},scheme:{title:"Scheme",owner:"bacchus123"},"shell-session":{title:"Shell session",require:"bash",alias:["sh-session","shellsession"],owner:"RunDevelopment"},smali:{title:"Smali",owner:"RunDevelopment"},smalltalk:{title:"Smalltalk",owner:"Golmote"},smarty:{title:"Smarty",require:"markup-templating",optional:"php",owner:"Golmote"},sml:{title:"SML",alias:"smlnj",aliasTitles:{smlnj:"SML/NJ"},owner:"RunDevelopment"},solidity:{title:"Solidity (Ethereum)",alias:"sol",require:"clike",owner:"glachaud"},"solution-file":{title:"Solution file",alias:"sln",owner:"RunDevelopment"},soy:{title:"Soy (Closure Template)",require:"markup-templating",owner:"Golmote"},sparql:{title:"SPARQL",require:"turtle",owner:"Triply-Dev",alias:"rq"},"splunk-spl":{title:"Splunk SPL",owner:"RunDevelopment"},sqf:{title:"SQF: Status Quo Function (Arma 3)",require:"clike",owner:"RunDevelopment"},sql:{title:"SQL",owner:"multipetros"},squirrel:{title:"Squirrel",require:"clike",owner:"RunDevelopment"},stan:{title:"Stan",owner:"RunDevelopment"},stata:{title:"Stata Ado",require:["mata","java","python"],owner:"RunDevelopment"},iecst:{title:"Structured Text (IEC 61131-3)",owner:"serhioromano"},stylus:{title:"Stylus",owner:"vkbansal"},supercollider:{title:"SuperCollider",alias:"sclang",owner:"RunDevelopment"},swift:{title:"Swift",owner:"chrischares"},systemd:{title:"Systemd configuration file",owner:"RunDevelopment"},"t4-templating":{title:"T4 templating",owner:"RunDevelopment"},"t4-cs":{title:"T4 Text Templates (C#)",require:["t4-templating","csharp"],alias:"t4",owner:"RunDevelopment"},"t4-vb":{title:"T4 Text Templates (VB)",require:["t4-templating","vbnet"],owner:"RunDevelopment"},tap:{title:"TAP",owner:"isaacs",require:"yaml"},tcl:{title:"Tcl",owner:"PeterChaplin"},tt2:{title:"Template Toolkit 2",require:["clike","markup-templating"],owner:"gflohr"},textile:{title:"Textile",require:"markup",optional:"css",owner:"Golmote"},toml:{title:"TOML",owner:"RunDevelopment"},tremor:{title:"Tremor",alias:["trickle","troy"],owner:"darach",aliasTitles:{trickle:"trickle",troy:"troy"}},turtle:{title:"Turtle",alias:"trig",aliasTitles:{trig:"TriG"},owner:"jakubklimek"},twig:{title:"Twig",require:"markup-templating",owner:"brandonkelly"},typescript:{title:"TypeScript",require:"javascript",optional:"js-templates",alias:"ts",owner:"vkbansal"},typoscript:{title:"TypoScript",alias:"tsconfig",aliasTitles:{tsconfig:"TSConfig"},owner:"dkern"},unrealscript:{title:"UnrealScript",alias:["uscript","uc"],owner:"RunDevelopment"},uorazor:{title:"UO Razor Script",owner:"jaseowns"},uri:{title:"URI",alias:"url",aliasTitles:{url:"URL"},owner:"RunDevelopment"},v:{title:"V",require:"clike",owner:"taggon"},vala:{title:"Vala",require:"clike",optional:"regex",owner:"TemplarVolk"},vbnet:{title:"VB.Net",require:"basic",owner:"Bigsby"},velocity:{title:"Velocity",require:"markup",owner:"Golmote"},verilog:{title:"Verilog",owner:"a-rey"},vhdl:{title:"VHDL",owner:"a-rey"},vim:{title:"vim",owner:"westonganger"},"visual-basic":{title:"Visual Basic",alias:["vb","vba"],aliasTitles:{vba:"VBA"},owner:"Golmote"},warpscript:{title:"WarpScript",owner:"RunDevelopment"},wasm:{title:"WebAssembly",owner:"Golmote"},"web-idl":{title:"Web IDL",alias:"webidl",owner:"RunDevelopment"},wgsl:{title:"WGSL",owner:"Dr4gonthree"},wiki:{title:"Wiki markup",require:"markup",owner:"Golmote"},wolfram:{title:"Wolfram language",alias:["mathematica","nb","wl"],aliasTitles:{mathematica:"Mathematica",nb:"Mathematica Notebook"},owner:"msollami"},wren:{title:"Wren",owner:"clsource"},xeora:{title:"Xeora",require:"markup",alias:"xeoracube",aliasTitles:{xeoracube:"XeoraCube"},owner:"freakmaxi"},"xml-doc":{title:"XML doc (.net)",require:"markup",modify:["csharp","fsharp","vbnet"],owner:"RunDevelopment"},xojo:{title:"Xojo (REALbasic)",owner:"Golmote"},xquery:{title:"XQuery",require:"markup",owner:"Golmote"},yaml:{title:"YAML",alias:"yml",owner:"hason"},yang:{title:"YANG",owner:"RunDevelopment"},zig:{title:"Zig",owner:"RunDevelopment"}},plugins:{meta:{path:"plugins/{id}/prism-{id}",link:"plugins/{id}/"},"line-highlight":{title:"Line Highlight",description:"Highlights specific lines and/or line ranges."},"line-numbers":{title:"Line Numbers",description:"Line number at the beginning of code lines.",owner:"kuba-kubula"},"show-invisibles":{title:"Show Invisibles",description:"Show hidden characters such as tabs and line breaks.",optional:["autolinker","data-uri-highlight"]},autolinker:{title:"Autolinker",description:"Converts URLs and emails in code to clickable links. Parses Markdown links in comments."},wpd:{title:"WebPlatform Docs",description:'Makes tokens link to WebPlatform.org documentation. The links open in a new tab.'},"custom-class":{title:"Custom Class",description:"This plugin allows you to prefix Prism's default classes (.comment can become .namespace--comment) or replace them with your defined ones (like .editor__comment). You can even add new classes.",owner:"dvkndn",noCSS:!0},"file-highlight":{title:"File Highlight",description:"Fetch external files and highlight them with Prism. Used on the Prism website itself.",noCSS:!0},"show-language":{title:"Show Language",description:"Display the highlighted language in code blocks (inline code does not show the label).",owner:"nauzilus",noCSS:!0,require:"toolbar"},"jsonp-highlight":{title:"JSONP Highlight",description:"Fetch content with JSONP and highlight some interesting content (e.g. GitHub/Gists or Bitbucket API).",noCSS:!0,owner:"nauzilus"},"highlight-keywords":{title:"Highlight Keywords",description:"Adds special CSS classes for each keyword for fine-grained highlighting.",owner:"vkbansal",noCSS:!0},"remove-initial-line-feed":{title:"Remove initial line feed",description:"Removes the initial line feed in code blocks.",owner:"Golmote",noCSS:!0},"inline-color":{title:"Inline color",description:"Adds a small inline preview for colors in style sheets.",require:"css-extras",owner:"RunDevelopment"},previewers:{title:"Previewers",description:"Previewers for angles, colors, gradients, easing and time.",require:"css-extras",owner:"Golmote"},autoloader:{title:"Autoloader",description:"Automatically loads the needed languages to highlight the code blocks.",owner:"Golmote",noCSS:!0},"keep-markup":{title:"Keep Markup",description:"Prevents custom markup from being dropped out during highlighting.",owner:"Golmote",optional:"normalize-whitespace",noCSS:!0},"command-line":{title:"Command Line",description:"Display a command line with a prompt and, optionally, the output/response from the commands.",owner:"chriswells0"},"unescaped-markup":{title:"Unescaped Markup",description:"Write markup without having to escape anything."},"normalize-whitespace":{title:"Normalize Whitespace",description:"Supports multiple operations to normalize whitespace in code blocks.",owner:"zeitgeist87",optional:"unescaped-markup",noCSS:!0},"data-uri-highlight":{title:"Data-URI Highlight",description:"Highlights data-URI contents.",owner:"Golmote",noCSS:!0},toolbar:{title:"Toolbar",description:"Attach a toolbar for plugins to easily register buttons on the top of a code block.",owner:"mAAdhaTTah"},"copy-to-clipboard":{title:"Copy to Clipboard Button",description:"Add a button that copies the code block to the clipboard when clicked.",owner:"mAAdhaTTah",require:"toolbar",noCSS:!0},"download-button":{title:"Download Button",description:"A button in the toolbar of a code block adding a convenient way to download a code file.",owner:"Golmote",require:"toolbar",noCSS:!0},"match-braces":{title:"Match braces",description:"Highlights matching braces.",owner:"RunDevelopment"},"diff-highlight":{title:"Diff Highlight",description:"Highlights the code inside diff blocks.",owner:"RunDevelopment",require:"diff"},"filter-highlight-all":{title:"Filter highlightAll",description:"Filters the elements the highlightAll and highlightAllUnder methods actually highlight.",owner:"RunDevelopment",noCSS:!0},treeview:{title:"Treeview",description:"A language with special styles to highlight file system tree structures.",owner:"Golmote"}}})},2885:(e,t,n)=>{const r=n(9901),o=n(9642),a=new Set;function i(e){void 0===e?e=Object.keys(r.languages).filter((e=>"meta"!=e)):Array.isArray(e)||(e=[e]);const t=[...a,...Object.keys(Prism.languages)];o(r,e,t).load((e=>{if(!(e in r.languages))return void(i.silent||console.warn("Language does not exist: "+e));const t="./prism-"+e;delete n.c[n(6500).resolve(t)],delete Prism.languages[e],n(6500)(t),a.add(e)}))}i.silent=!1,e.exports=i},6854:()=>{!function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,o,a){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(o,(function(e){if("function"==typeof a&&!a(e))return e;for(var o,l=i.length;-1!==n.code.indexOf(o=t(r,l));)++l;return i[l]=e,o})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var o=0,a=Object.keys(n.tokenStack);!function i(l){for(var s=0;s=a.length);s++){var c=l[s];if("string"==typeof c||c.content&&"string"==typeof c.content){var u=a[o],d=n.tokenStack[u],p="string"==typeof c?c:c.content,f=t(r,u),h=p.indexOf(f);if(h>-1){++o;var g=p.substring(0,h),m=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),y=p.substring(h+f.length),b=[];g&&b.push.apply(b,i([g])),b.push(m),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)},6726:(e,t,n)=>{var r={"./":2885};function o(e){var t=a(e);return n(t)}function a(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}o.keys=function(){return Object.keys(r)},o.resolve=a,e.exports=o,o.id=6726},6500:(e,t,n)=>{var r={"./":2885};function o(e){var t=a(e);return n(t)}function a(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}o.keys=function(){return Object.keys(r)},o.resolve=a,e.exports=o,o.id=6500},9642:e=>{"use strict";var t=function(){var e=function(){};function t(e,t){Array.isArray(e)?e.forEach(t):null!=e&&t(e,0)}function n(e){for(var t={},n=0,r=e.length;n "));var l={},s=e[r];if(s){function c(t){if(!(t in e))throw new Error(r+" depends on an unknown component "+t);if(!(t in l))for(var i in o(t,a),l[t]=!0,n[t])l[i]=!0}t(s.require,c),t(s.optional,c),t(s.modify,c)}n[r]=l,a.pop()}}return function(e){var t=n[e];return t||(o(e,r),t=n[e]),t}}function o(e){for(var t in e)return!0;return!1}return function(a,i,l){var s=function(e){var t={};for(var n in e){var r=e[n];for(var o in r)if("meta"!=o){var a=r[o];t[o]="string"==typeof a?{title:a}:a}}return t}(a),c=function(e){var n;return function(r){if(r in e)return r;if(!n)for(var o in n={},e){var a=e[o];t(a&&a.alias,(function(t){if(t in n)throw new Error(t+" cannot be alias for both "+o+" and "+n[t]);if(t in e)throw new Error(t+" cannot be alias of "+o+" because it is a component.");n[t]=o}))}return n[r]||r}}(s);i=i.map(c),l=(l||[]).map(c);var u=n(i),d=n(l);i.forEach((function e(n){var r=s[n];t(r&&r.require,(function(t){t in d||(u[t]=!0,e(t))}))}));for(var p,f=r(s),h=u;o(h);){for(var g in p={},h){var m=s[g];t(m&&m.modify,(function(e){e in d&&(p[e]=!0)}))}for(var y in d)if(!(y in u))for(var b in f(y))if(b in u){p[y]=!0;break}for(var v in h=p)u[v]=!0}var w={getIds:function(){var e=[];return w.load((function(t){e.push(t)})),e},load:function(t,n){return function(t,n,r,o){var a=o?o.series:void 0,i=o?o.parallel:e,l={},s={};function c(e){if(e in l)return l[e];s[e]=!0;var o,u=[];for(var d in t(e))d in n&&u.push(d);if(0===u.length)o=r(e);else{var p=i(u.map((function(e){var t=c(e);return delete s[e],t})));a?o=a(p,(function(){return r(e)})):r(e)}return l[e]=o}for(var u in n)c(u);var d=[];for(var p in s)d.push(l[p]);return i(d)}(f,u,t,n)}};return w}}();e.exports=t},2703:(e,t,n)=>{"use strict";var r=n(414);function o(){}function a(){}a.resetWarningCache=o,e.exports=function(){function e(e,t,n,o,a,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:a,resetWarningCache:o};return n.PropTypes=n,n}},5697:(e,t,n)=>{e.exports=n(2703)()},414:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},4448:(e,t,n)=>{"use strict";var r=n(7294),o=n(3840);function a(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n