diff --git a/404.html b/404.html index f7b0056f..3cd1f8ef 100644 --- a/404.html +++ b/404.html @@ -16,8 +16,8 @@ - - + +
Skip to main content

Page Not Found

We could not find what you were looking for.

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

diff --git a/assets/js/3b424f39.86e8311f.js b/assets/js/3b424f39.e9084e78.js similarity index 69% rename from assets/js/3b424f39.86e8311f.js rename to assets/js/3b424f39.e9084e78.js index fd409360..b05dd662 100644 --- a/assets/js/3b424f39.86e8311f.js +++ b/assets/js/3b424f39.e9084e78.js @@ -1 +1 @@ -"use strict";(self.webpackChunkpioreactor=self.webpackChunkpioreactor||[]).push([[1981],{29167:(e,r,t)=>{t.r(r),t.d(r,{assets:()=>c,contentTitle:()=>n,default:()=>h,frontMatter:()=>a,metadata:()=>s,toc:()=>l});var o=t(85893),i=t(11151);const a={title:"Creating a Pioreactor cluster",slug:"/create-cluster"},n=void 0,s={id:"Extending your Pioreactor/cluster-management/create-cluster",title:"Creating a Pioreactor cluster",description:"Pioreactors are able to be used as individual units, or in concert with other Pioreactors. In either case, a Pioreactor needs to be assigned as a leader. The leader unit controls other Pioreactors (and that may include itself), stores the database, hosts the web interface, and is the interface between users and the hardware. A leader will communicate and control all the workers (non-leader Pioreactors) in the inventory.",source:"@site/user-guide/03-Extending your Pioreactor/01-cluster-management/01-create-cluster.md",sourceDirName:"03-Extending your Pioreactor/01-cluster-management",slug:"/create-cluster",permalink:"/user-guide/create-cluster",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"Creating a Pioreactor cluster",slug:"/create-cluster"},sidebar:"tutorialSidebar",previous:{title:"Running a self-test",permalink:"/user-guide/running-self-test"},next:{title:"Powering your Pioreactor cluster",permalink:"/user-guide/powering-cluster"}},c={},l=[{value:"Adding Pioreactors to your cluster",id:"adding-pioreactors-to-your-cluster",level:3},{value:"Active and inactive",id:"active-and-inactive",level:3},{value:"Possible cluster topologies",id:"possible-cluster-topologies",level:3},{value:"Single Pioreactor",id:"single-pioreactor",level:4},{value:"Cluster, and leader is a worker",id:"cluster-and-leader-is-a-worker",level:4},{value:"Cluster, and leader is not a worker",id:"cluster-and-leader-is-not-a-worker",level:4},{value:"Common questions",id:"common-questions",level:3},{value:"Can I change the name of a worker?",id:"can-i-change-the-name-of-a-worker",level:4},{value:"Can I change the name of a leader?",id:"can-i-change-the-name-of-a-leader",level:4}];function d(e){const r={a:"a",admonition:"admonition",code:"code",em:"em",h3:"h3",h4:"h4",img:"img",li:"li",ol:"ol",p:"p",...(0,i.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(r.p,{children:["Pioreactors are able to be used as individual units, or in concert with other Pioreactors. In either case, a Pioreactor needs to be assigned as a ",(0,o.jsx)(r.em,{children:"leader"}),". The leader unit controls other Pioreactors (and that may include itself), stores the database, hosts the web interface, and is the interface between users and the hardware. A leader will communicate and control all the ",(0,o.jsx)(r.em,{children:"workers"})," (non-leader Pioreactors) in the ",(0,o.jsx)(r.em,{children:"inventory"}),"."]}),"\n",(0,o.jsx)(r.admonition,{type:"info",children:(0,o.jsxs)(r.p,{children:["When you set up your first Pioreactor using our ",(0,o.jsx)(r.a,{href:"/user-guide/software-set-up",children:"software installation guide"}),", your Pioreactor was set up to be a leader already. You only need one leader in a Pioreactor cluster."]})}),"\n",(0,o.jsx)(r.h3,{id:"adding-pioreactors-to-your-cluster",children:"Adding Pioreactors to your cluster"}),"\n",(0,o.jsxs)(r.p,{children:["After installing the ",(0,o.jsx)(r.em,{children:"worker"})," image onto your additional Pioreactor (see the instructions ",(0,o.jsx)(r.a,{href:"/user-guide/software-set-up#adding-additional-workers-to-your-cluster",children:"here"}),"), visit the Inventory page."]}),"\n",(0,o.jsxs)(r.p,{children:["On the ",(0,o.jsx)(r.em,{children:"Inventory"}),' page, you can search for and add worker Pioreactors to your cluster. Click "Add new Pioreactor" at the top right corner of this tab.']}),"\n",(0,o.jsx)(r.p,{children:(0,o.jsx)(r.img,{src:t(51378).Z+"",width:"2973",height:"1469"})}),"\n",(0,o.jsx)(r.p,{children:'In the popup, add the name of your worker and click "Add Pioreactor".'}),"\n",(0,o.jsx)(r.p,{children:(0,o.jsx)(r.img,{src:t(43184).Z+"",width:"2973",height:"1469"})}),"\n",(0,o.jsx)(r.p,{children:"Once a new Pioreactor is added, you may need to refresh the page to see the new worker in the cluster."}),"\n",(0,o.jsx)(r.p,{children:"This Inventory tab will display metadata pertaining to each of your Pioreactors. You can use this page to identify a Pioreactor (causes the blue LED on the HAT to blink), unassign a Pioreactor from any experiment, reboot a Pioreactor, or remove it from your cluster. This page also provides a summary of which Pioreactors are assigned to which experiment, as highlighted in yellow in the image below."}),"\n",(0,o.jsx)(r.p,{children:(0,o.jsx)(r.img,{src:t(9102).Z+"",width:"2917",height:"1463"})}),"\n",(0,o.jsx)(r.h3,{id:"active-and-inactive",children:"Active and inactive"}),"\n",(0,o.jsxs)(r.p,{children:["Workers can be ",(0,o.jsx)(r.em,{children:"active"})," (available for running activities), or inactive. Inactive Pioreactors can still be assigned to experiments, but won't respond to commands to run activities or participate in experiment profiles. Inactive is a useful tool for taking a Pioreactor temporarily out of an experiment or cluster."]}),"\n",(0,o.jsx)(r.p,{children:"Turning a worker to inactive will halt all its activities."}),"\n",(0,o.jsx)(r.h3,{id:"possible-cluster-topologies",children:"Possible cluster topologies"}),"\n",(0,o.jsx)(r.p,{children:"A cluster can be made up of a single Pioreactor, or can be scaled to as many Pioreactors as you have. This gives us a few different possible topologies of what your cluster of Pioreactor(s) might look like."}),"\n",(0,o.jsx)(r.h4,{id:"single-pioreactor",children:"Single Pioreactor"}),"\n",(0,o.jsx)(r.p,{children:"The simplest topology is when you have a single Pioreactor, and by default it is both the leader and the only worker."}),"\n",(0,o.jsx)("img",{src:"/img/user-guide/single_pioreactor_cluster.png",width:"335",style:{margin:"auto",display:"block"}}),"\n",(0,o.jsx)(r.h4,{id:"cluster-and-leader-is-a-worker",children:"Cluster, and leader is a worker"}),"\n",(0,o.jsx)(r.p,{children:"When you have multiple Pioreactors, you can nominate one to be the leader, and retain it as a worker, too:"}),"\n",(0,o.jsx)(r.p,{children:(0,o.jsx)(r.img,{alt:"leader is also a worker in the cluster",src:t(28973).Z+"",width:"987",height:"363"})}),"\n",(0,o.jsxs)(r.h4,{id:"cluster-and-leader-is-not-a-worker",children:["Cluster, and leader is ",(0,o.jsx)(r.em,{children:"not"})," a worker"]}),"\n",(0,o.jsxs)(r.p,{children:["You can also choose not to have the leader be a worker. This is useful if you have a spare Raspberry Pi without the Pioreactor hardware, or the number of Pioreactors grows large and you wish to keep one out of the inventory to focus on being a leader only. We provide custom images for this ",(0,o.jsxs)(r.a,{href:"https://github.com/Pioreactor/CustoPiZer/releases",children:["here, titled ",(0,o.jsx)(r.code,{children:"pioreactor_leader.zip"})]})]}),"\n",(0,o.jsx)(r.p,{children:(0,o.jsx)(r.img,{alt:"leader not worker",src:t(71715).Z+"",width:"987",height:"351"})}),"\n",(0,o.jsx)(r.h3,{id:"common-questions",children:"Common questions"}),"\n",(0,o.jsxs)(r.h4,{id:"can-i-change-the-name-of-a-worker",children:["Can I change the name of a ",(0,o.jsx)(r.em,{children:"worker"}),"?"]}),"\n",(0,o.jsx)(r.p,{children:"Yes, so long as that worker isn't the leader. Note: this doesn't change historical data."}),"\n",(0,o.jsxs)(r.ol,{children:["\n",(0,o.jsx)(r.li,{children:"Remove the worker from your cluster using the Inventory page."}),"\n",(0,o.jsx)(r.li,{children:"SSH into the worker (it should still be on your network, even if not part of the cluster)."}),"\n",(0,o.jsxs)(r.li,{children:["Run ",(0,o.jsx)(r.code,{children:"sudo hostnamectl set-hostname && sudo reboot"})]}),"\n",(0,o.jsx)(r.li,{children:"After a moment, the worker will turn back on with the new name. You can then use the Inventory page to add the worker again."}),"\n"]}),"\n",(0,o.jsxs)(r.h4,{id:"can-i-change-the-name-of-a-leader",children:["Can I change the name of a ",(0,o.jsx)(r.em,{children:"leader"}),"?"]}),"\n",(0,o.jsx)(r.p,{children:"This is more difficult, and our suggestion is to restart the cluster."})]})}function h(e={}){const{wrapper:r}={...(0,i.a)(),...e.components};return r?(0,o.jsx)(r,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},43184:(e,r,t)=>{t.d(r,{Z:()=>o});const o=t.p+"assets/images/add-new-pioreactor-1bbe84865bdde6f9d24e923c2437520c.png"},9102:(e,r,t)=>{t.d(r,{Z:()=>o});const o=t.p+"assets/images/inventory-multiple-pios-9af5e63a906f09ebb75d1d4f4c79baee.png"},51378:(e,r,t)=>{t.d(r,{Z:()=>o});const o=t.p+"assets/images/inventory-tab-702a21756ef0a5d34c0c012dcaf095bc.png"},28973:(e,r,t)=>{t.d(r,{Z:()=>o});const o=t.p+"assets/images/leader_as_worker_cluster-0545170277e1f3b1377ad5e0408c417d.png"},71715:(e,r,t)=>{t.d(r,{Z:()=>o});const o=t.p+"assets/images/leader_cluster-f913ccaa86e3a4394ddcb87a5f17b18c.png"},11151:(e,r,t)=>{t.d(r,{Z:()=>s,a:()=>n});var o=t(67294);const i={},a=o.createContext(i);function n(e){const r=o.useContext(a);return o.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function s(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:n(e.components),o.createElement(a.Provider,{value:r},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkpioreactor=self.webpackChunkpioreactor||[]).push([[1981],{29167:(e,r,t)=>{t.r(r),t.d(r,{assets:()=>l,contentTitle:()=>i,default:()=>h,frontMatter:()=>n,metadata:()=>s,toc:()=>c});var o=t(85893),a=t(11151);const n={title:"Creating a Pioreactor cluster",slug:"/create-cluster"},i=void 0,s={id:"Extending your Pioreactor/cluster-management/create-cluster",title:"Creating a Pioreactor cluster",description:"Pioreactors are able to be used as individual units, or in concert with other Pioreactors. In either case, a Pioreactor needs to be assigned as a leader. The leader unit controls other Pioreactors (and that may include itself), stores the database, hosts the web interface, and is the interface between users and the hardware. A leader will communicate and control all the workers (non-leader Pioreactors) in the inventory.",source:"@site/user-guide/03-Extending your Pioreactor/01-cluster-management/01-create-cluster.md",sourceDirName:"03-Extending your Pioreactor/01-cluster-management",slug:"/create-cluster",permalink:"/user-guide/create-cluster",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"Creating a Pioreactor cluster",slug:"/create-cluster"},sidebar:"tutorialSidebar",previous:{title:"Running a self-test",permalink:"/user-guide/running-self-test"},next:{title:"Powering your Pioreactor cluster",permalink:"/user-guide/powering-cluster"}},l={},c=[{value:"Adding Pioreactors to your cluster",id:"adding-pioreactors-to-your-cluster",level:3},{value:"Active and inactive",id:"active-and-inactive",level:3},{value:"Possible cluster topologies",id:"possible-cluster-topologies",level:3},{value:"Single Pioreactor",id:"single-pioreactor",level:4},{value:"Cluster, and leader is a worker",id:"cluster-and-leader-is-a-worker",level:4},{value:"Cluster, and leader is not a worker",id:"cluster-and-leader-is-not-a-worker",level:4},{value:"Common questions",id:"common-questions",level:3},{value:"Can I change the name of a worker?",id:"can-i-change-the-name-of-a-worker",level:4},{value:"Can I change the name of a leader?",id:"can-i-change-the-name-of-a-leader",level:4}];function d(e){const r={a:"a",admonition:"admonition",code:"code",em:"em",h3:"h3",h4:"h4",img:"img",li:"li",ol:"ol",p:"p",...(0,a.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(r.p,{children:["Pioreactors are able to be used as individual units, or in concert with other Pioreactors. In either case, a Pioreactor needs to be assigned as a ",(0,o.jsx)(r.em,{children:"leader"}),". The leader unit controls other Pioreactors (and that may include itself), stores the database, hosts the web interface, and is the interface between users and the hardware. A leader will communicate and control all the ",(0,o.jsx)(r.em,{children:"workers"})," (non-leader Pioreactors) in the ",(0,o.jsx)(r.em,{children:"inventory"}),"."]}),"\n",(0,o.jsx)(r.admonition,{type:"info",children:(0,o.jsxs)(r.p,{children:["When you set up your first Pioreactor using our ",(0,o.jsx)(r.a,{href:"/user-guide/software-set-up",children:"software installation guide"}),", your Pioreactor was set up to be a leader already. You only need one leader in a Pioreactor cluster."]})}),"\n",(0,o.jsx)(r.h3,{id:"adding-pioreactors-to-your-cluster",children:"Adding Pioreactors to your cluster"}),"\n",(0,o.jsxs)(r.p,{children:["After installing the ",(0,o.jsx)(r.em,{children:"worker"})," image onto your additional Pioreactor (see the instructions ",(0,o.jsx)(r.a,{href:"/user-guide/software-set-up#adding-additional-workers-to-your-cluster",children:"here"}),"), visit the Inventory page."]}),"\n",(0,o.jsxs)(r.p,{children:["On the ",(0,o.jsx)(r.em,{children:"Inventory"}),' page, you can search for and add worker Pioreactors to your cluster. Click "Add new Pioreactor" at the top right corner of this tab.']}),"\n",(0,o.jsx)(r.p,{children:(0,o.jsx)(r.img,{src:t(51378).Z+"",width:"2973",height:"1469"})}),"\n",(0,o.jsx)(r.p,{children:'In the popup, add the name of your worker and click "Add Pioreactor".'}),"\n",(0,o.jsx)(r.p,{children:(0,o.jsx)(r.img,{src:t(43184).Z+"",width:"2973",height:"1469"})}),"\n",(0,o.jsx)(r.p,{children:"Once a new Pioreactor is added, you may need to refresh the page to see the new worker in the cluster."}),"\n",(0,o.jsx)(r.p,{children:"This Inventory tab will display metadata pertaining to each of your Pioreactors. You can use this page to identify a Pioreactor (causes the blue LED on the HAT to blink), unassign a Pioreactor from any experiment, reboot a Pioreactor, or remove it from your cluster. This page also provides a summary of which Pioreactors are assigned to which experiment, as highlighted in yellow in the image below."}),"\n",(0,o.jsx)(r.p,{children:(0,o.jsx)(r.img,{src:t(9102).Z+"",width:"2917",height:"1463"})}),"\n",(0,o.jsx)(r.h3,{id:"active-and-inactive",children:"Active and inactive"}),"\n",(0,o.jsxs)(r.p,{children:["Workers can be ",(0,o.jsx)(r.em,{children:"active"})," (available for running activities), or inactive. Inactive Pioreactors can still be assigned to experiments, but won't respond to commands to run activities or participate in experiment profiles. Inactive is a useful tool for taking a Pioreactor temporarily out of an experiment or cluster."]}),"\n",(0,o.jsx)(r.p,{children:"Turning a worker to inactive will halt all its activities."}),"\n",(0,o.jsx)(r.h3,{id:"possible-cluster-topologies",children:"Possible cluster topologies"}),"\n",(0,o.jsx)(r.p,{children:"A cluster can be made up of a single Pioreactor, or can be scaled to as many Pioreactors as you have. This gives us a few different possible topologies of what your cluster of Pioreactor(s) might look like."}),"\n",(0,o.jsx)(r.h4,{id:"single-pioreactor",children:"Single Pioreactor"}),"\n",(0,o.jsx)(r.p,{children:"The simplest topology is when you have a single Pioreactor, and by default it is both the leader and the only worker."}),"\n",(0,o.jsx)("img",{src:"/img/user-guide/single_pioreactor_cluster.png",width:"335",style:{margin:"auto",display:"block"}}),"\n",(0,o.jsx)(r.h4,{id:"cluster-and-leader-is-a-worker",children:"Cluster, and leader is a worker"}),"\n",(0,o.jsx)(r.p,{children:"When you have multiple Pioreactors, you can nominate one to be the leader, and retain it as a worker, too:"}),"\n",(0,o.jsx)(r.p,{children:(0,o.jsx)(r.img,{alt:"leader is also a worker in the cluster",src:t(28973).Z+"",width:"987",height:"363"})}),"\n",(0,o.jsxs)(r.h4,{id:"cluster-and-leader-is-not-a-worker",children:["Cluster, and leader is ",(0,o.jsx)(r.em,{children:"not"})," a worker"]}),"\n",(0,o.jsxs)(r.p,{children:["You can also choose not to have the leader be a worker. This is useful if you have a spare Raspberry Pi without the Pioreactor hardware, or the number of Pioreactors grows large and you wish to keep one out of the inventory to focus on being a leader only. We provide custom images for this ",(0,o.jsx)(r.a,{href:"http://localhost:3001/user-guide/software-set-up#id-like-to-have-the-leader-not-be-a-worker-and-only-a-standalone-leader-can-i-do-that",children:"here"}),"."]}),"\n",(0,o.jsx)(r.p,{children:(0,o.jsx)(r.img,{alt:"leader not worker",src:t(71715).Z+"",width:"987",height:"351"})}),"\n",(0,o.jsx)(r.h3,{id:"common-questions",children:"Common questions"}),"\n",(0,o.jsxs)(r.h4,{id:"can-i-change-the-name-of-a-worker",children:["Can I change the name of a ",(0,o.jsx)(r.em,{children:"worker"}),"?"]}),"\n",(0,o.jsx)(r.p,{children:"Yes, so long as that worker isn't the leader. Note: this doesn't change historical data."}),"\n",(0,o.jsxs)(r.ol,{children:["\n",(0,o.jsx)(r.li,{children:"Remove the worker from your cluster on the Inventory page."}),"\n",(0,o.jsx)(r.li,{children:"SSH into the worker (it should still be on your network, even if not part of the cluster)."}),"\n",(0,o.jsxs)(r.li,{children:["Run ",(0,o.jsx)(r.code,{children:"sudo hostnamectl set-hostname && sudo reboot"})]}),"\n",(0,o.jsx)(r.li,{children:"After a moment, the worker will turn back on with the new name. You can then use the Inventory page to add the worker again."}),"\n"]}),"\n",(0,o.jsxs)(r.h4,{id:"can-i-change-the-name-of-a-leader",children:["Can I change the name of a ",(0,o.jsx)(r.em,{children:"leader"}),"?"]}),"\n",(0,o.jsx)(r.p,{children:"This is more difficult, and our suggestion is to restart the cluster."})]})}function h(e={}){const{wrapper:r}={...(0,a.a)(),...e.components};return r?(0,o.jsx)(r,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},43184:(e,r,t)=>{t.d(r,{Z:()=>o});const o=t.p+"assets/images/add-new-pioreactor-1bbe84865bdde6f9d24e923c2437520c.png"},9102:(e,r,t)=>{t.d(r,{Z:()=>o});const o=t.p+"assets/images/inventory-multiple-pios-9af5e63a906f09ebb75d1d4f4c79baee.png"},51378:(e,r,t)=>{t.d(r,{Z:()=>o});const o=t.p+"assets/images/inventory-tab-702a21756ef0a5d34c0c012dcaf095bc.png"},28973:(e,r,t)=>{t.d(r,{Z:()=>o});const o=t.p+"assets/images/leader_as_worker_cluster-0545170277e1f3b1377ad5e0408c417d.png"},71715:(e,r,t)=>{t.d(r,{Z:()=>o});const o=t.p+"assets/images/leader_cluster-f913ccaa86e3a4394ddcb87a5f17b18c.png"},11151:(e,r,t)=>{t.d(r,{Z:()=>s,a:()=>i});var o=t(67294);const a={},n=o.createContext(a);function i(e){const r=o.useContext(n);return o.useMemo((function(){return"function"==typeof e?e(r):{...r,...e}}),[r,e])}function s(e){let r;return r=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),o.createElement(n.Provider,{value:r},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/622dee83.a95fbcd6.js b/assets/js/622dee83.a95fbcd6.js new file mode 100644 index 00000000..bb951ad4 --- /dev/null +++ b/assets/js/622dee83.a95fbcd6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkpioreactor=self.webpackChunkpioreactor||[]).push([[8596],{95980:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>s,default:()=>h,frontMatter:()=>r,metadata:()=>c,toc:()=>a});var o=i(85893),t=i(11151);const r={title:"Networking tools",slug:"/networking"},s=void 0,c={id:"Advanced/networking/networking",title:"Networking tools",description:"Previously, Raspberry Pis used a file called wpasupplicant.conf to handle wifi network connections. **This is not longer the case**. Modern Raspberry Pi software, including the Pioreactor, doesn't use wpasupplicant.conf at all. Instead, the tool nmcli replaces it. Don't follow tutorials that use wpa_supplicant.conf.",source:"@site/user-guide/30-Advanced/02-networking/10-networking.md",sourceDirName:"30-Advanced/02-networking",slug:"/networking",permalink:"/user-guide/networking",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:10,frontMatter:{title:"Networking tools",slug:"/networking"},sidebar:"tutorialSidebar",previous:{title:"Local access points",permalink:"/user-guide/local-access-point"},next:{title:"More on peristaltic pumps",permalink:"/user-guide/addition-hardware-pumps"}},l={},a=[{value:"General networking tools",id:"general-networking-tools",level:2},{value:"Connecting to a wifi network using nmcli",id:"connecting-to-a-wifi-network-using-nmcli",level:3},{value:"Connecting to multiple networks simultaneously",id:"connecting-to-multiple-networks-simultaneously",level:3},{value:"Starting the Pioreactor local access point using nmcli",id:"starting-the-pioreactor-local-access-point-using-nmcli",level:3},{value:"Changing leader_address and MQTT broker in your config.ini",id:"changing-leader_address-and-mqtt-broker-in-your-configini",level:4},{value:"Changing web UI port from 80 to something else",id:"changing-web-ui-port-from-80-to-something-else",level:3},{value:"Connecting to eduroam",id:"connecting-to-eduroam",level:2},{value:"Common questions",id:"common-questions",level:2},{value:"My Pioreactor activities start very slowly from the UI",id:"my-pioreactor-activities-start-very-slowly-from-the-ui",level:3}];function d(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",...(0,t.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.admonition,{type:"info",children:(0,o.jsxs)(n.p,{children:["Previously, Raspberry Pis used a file called ",(0,o.jsx)(n.code,{children:"wpa_supplicant.conf"})," to handle wifi network connections. ",(0,o.jsx)(n.strong,{children:"This is not longer the case"}),". Modern Raspberry Pi software, including the Pioreactor, doesn't use ",(0,o.jsx)(n.code,{children:"wpa_supplicant.conf"})," at all. Instead, the tool ",(0,o.jsx)(n.code,{children:"nmcli"})," replaces it. Don't follow tutorials that use ",(0,o.jsx)(n.code,{children:"wpa_supplicant.conf"}),"."]})}),"\n",(0,o.jsx)(n.h2,{id:"general-networking-tools",children:"General networking tools"}),"\n",(0,o.jsxs)(n.p,{children:['The main "entry point" for networking on the Pioreactor (and Raspberry Pi\'s in general) is the tool ',(0,o.jsx)(n.code,{children:"nmcli"}),". This controls discovering networks, connecting to them, and editing connections. For example, running ",(0,o.jsx)(n.code,{children:"nmcli con"})," will diplay a list of possible networking connections, and connected ones in green."]}),"\n",(0,o.jsxs)(n.h3,{id:"connecting-to-a-wifi-network-using-nmcli",children:["Connecting to a wifi network using ",(0,o.jsx)(n.code,{children:"nmcli"})]}),"\n",(0,o.jsx)(n.p,{children:"You can first discover all the visible networks with:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"sudo nmcli d wifi list\n"})}),"\n",(0,o.jsx)(n.p,{children:"If you see your network on the list, then run:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"sudo nmcli device wifi connect password ifname wlan0\n"})}),"\n",(0,o.jsxs)(n.p,{children:['(If you get a "Can\'t find" error, try running the above ',(0,o.jsx)(n.code,{children:"list"})," command again.)"]}),"\n",(0,o.jsx)(n.h3,{id:"connecting-to-multiple-networks-simultaneously",children:"Connecting to multiple networks simultaneously"}),"\n",(0,o.jsx)(n.p,{children:"First, some terminology and understanding for us: a computer, like a Pi, has networking interfaces. For example, the onboard wifi on RPi\u2019s is one such interface. The larger, model Bs, have an ethernet connector, which is another interface. Each interface can connect to 0 or 1 networks."}),"\n",(0,o.jsxs)(n.p,{children:["In order to connect to multiple networks, you need a Raspberry Pi with multiple interfaces. You can add interfaces with devices like a ",(0,o.jsx)(n.a,{href:"https://forum.pioreactor.com/t/connecting-more-workers-to-cluster/330/3",children:"USB wifi device"}),"."]}),"\n",(0,o.jsx)(n.p,{children:"To see what your current interfaces are doing, use:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"nmcli device\n"})}),"\n",(0,o.jsxs)(n.p,{children:["The right hand side shows your connected interfaces. For example, if have a ethernet connection to a router, you'll see an ",(0,o.jsx)(n.code,{children:"eth0"})," connection active. If you have an additional wifi hardware device attached to your Pi, you'll see ",(0,o.jsx)(n.code,{children:"wlan1"}),"."]}),"\n",(0,o.jsxs)(n.admonition,{type:"tip",children:[(0,o.jsxs)(n.p,{children:["To connect to another wifi network using an external ",(0,o.jsx)(n.code,{children:"wlan1"})," interface, use:"]}),(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"sudo nmcli device wifi connect password ifname wlan1\n"})})]}),"\n",(0,o.jsxs)(n.p,{children:["If your leader is connected to multiple networks ",(0,o.jsx)(n.code,{children:"A"})," and ",(0,o.jsx)(n.code,{children:"B"}),", and you access the UI over network ",(0,o.jsx)(n.code,{children:"A"}),", but your workers access over network ",(0,o.jsx)(n.code,{children:"B"}),', the leader is in the position called a "gateway". You\'ll need to make some configuration changes to your cluster. Since the leader is attached to networks ',(0,o.jsx)(n.code,{children:"A"})," and ",(0,o.jsx)(n.code,{children:"B"}),", it has two IPs (use ",(0,o.jsx)(n.code,{children:"hostname -I"})," to see all the ips), let's call them ",(0,o.jsx)(n.code,{children:"ipA"})," and ",(0,o.jsx)(n.code,{children:"ipB"})," respectively."]}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsx)(n.li,{children:"Access the configuration in the UI."}),"\n",(0,o.jsxs)(n.li,{children:["In the ",(0,o.jsx)(n.em,{children:"shared"})," config.ini, edit the ",(0,o.jsx)(n.code,{children:"[mqtt]"})," ",(0,o.jsx)(n.code,{children:"broker"})," field to be equal to ",(0,o.jsx)(n.code,{children:"ipA"}),". Also edit the ",(0,o.jsx)(n.code,{children:"leader_address"})," to be ",(0,o.jsx)(n.code,{children:"ipB"}),"."]}),"\n",(0,o.jsxs)(n.li,{children:["In each of the workers (including the leader's config.ini, if it's a worker), add the following:","\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"[mqtt]\nbroker=ipB\n"})}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"You may need to restart your cluster for these to take full effect."}),"\n",(0,o.jsxs)(n.h3,{id:"starting-the-pioreactor-local-access-point-using-nmcli",children:["Starting the ",(0,o.jsx)(n.a,{href:"/user-guide/local-access-point",children:"Pioreactor local access"})," point using ",(0,o.jsx)(n.code,{children:"nmcli"})]}),"\n",(0,o.jsx)(n.p,{children:"Note that you can only have one network connection for each network interface. So if you have only one wifi device (by default, RPi's only have one wifi device on them, which implies only one wifi interface), the following will replace any existing wifi connection."}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"sudo nmcli con up PioreactorAP\n"})}),"\n",(0,o.jsxs)(n.p,{children:["If have a second wifi device with interface ",(0,o.jsx)(n.code,{children:"wlan1"}),", you can change the interface of the local access point using:"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"sudo nmcli connection modify PioreactorAP ifname wlan1\nsudo nmcli con up PioreactorAP\n"})}),"\n",(0,o.jsxs)(n.h4,{id:"changing-leader_address-and-mqtt-broker-in-your-configini",children:["Changing ",(0,o.jsx)(n.code,{children:"leader_address"})," and MQTT ",(0,o.jsx)(n.code,{children:"broker"})," in your config.ini"]}),"\n",(0,o.jsxs)(n.p,{children:["You may need to change the ",(0,o.jsx)(n.code,{children:"leader_address"})," in your config.ini: this is the address where workers will communicate with your leader."]}),"\n",(0,o.jsxs)(n.p,{children:["Likewise, you may need to change the mqtt ",(0,o.jsx)(n.code,{children:"broker"})," in your config.ini for the same reason. It may be required to change it in the unit specific config.inis."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-ini",metastring:'title="config_worker01.ini"',children:"[mqtt]\nbroker=leader.local\n"})}),"\n",(0,o.jsxs)(n.h3,{id:"changing-web-ui-port-from-80-to-something-else",children:["Changing web UI port from ",(0,o.jsx)(n.code,{children:"80"})," to something else"]}),"\n",(0,o.jsxs)(n.p,{children:["To change the web UI port from the default of ",(0,o.jsx)(n.code,{children:"80"}),", following these instructions:"]}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"SSH into your leader Pioreactor."}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"We'll edit the lighttpd configuration first:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"sudo nano /etc/lighttpd/lighttpd.conf\n"})}),"\n",(0,o.jsxs)(n.p,{children:["and find the line starting with ",(0,o.jsx)(n.code,{children:"server.port"}),". Change this to something else (preferably not a value below 1024). Save and exit."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Restart lighttpd with:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"sudo systemctl restart lighttpd.service\n"})}),"\n",(0,o.jsxs)(n.p,{children:["You should be able to access the web UI only on http://",(0,o.jsx)(n.code,{children:"leader name"}),":",(0,o.jsx)(n.code,{children:"new port"}),", for example: ",(0,o.jsx)(n.a,{href:"http://leader.local:8080",children:"http://leader.local:8080"})]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["In your configuration, under the ",(0,o.jsx)(n.code,{children:"[ui]"})," section, change the ",(0,o.jsx)(n.code,{children:"port"})," option from ",(0,o.jsx)(n.code,{children:"80"})," to your new port value. Save. You may need to restart your cluster for this new port to propagate to all machines correctly."]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.h2,{id:"connecting-to-eduroam",children:"Connecting to eduroam"}),"\n",(0,o.jsxs)(n.p,{children:["This is a work-in-progress, but here's ",(0,o.jsx)(n.a,{href:"https://forum.pioreactor.com/t/connecting-more-workers-to-cluster/330/3#connecting-to-eduroam-2",children:"one example"}),"."]}),"\n",(0,o.jsx)(n.h2,{id:"common-questions",children:"Common questions"}),"\n",(0,o.jsx)(n.h3,{id:"my-pioreactor-activities-start-very-slowly-from-the-ui",children:"My Pioreactor activities start very slowly from the UI"}),"\n",(0,o.jsxs)(n.p,{children:['It is possible that your mDNS is being blocked or restricted. If possible, log into your router and enable settings that allow "multicast", or "mDNS", or "IGMP proxing". If you are using a the builtin ',(0,o.jsx)(n.a,{href:"/user-guide/local-access-point",children:"local access point"}),", this solution is not the correct one."]}),"\n",(0,o.jsx)(n.p,{children:"Also, if you are able to provide a permanent IPv4 address to your leader, you can get a significant performance boost by setting the configuration some config parameters to the IPv4 address."}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{children:"[cluster.topology]\n# below is an example, your IPv4 may differ:\nleader_address=192.168.0.3\n\n[mqtt]\nbroker_address=192.168.0.3\n\n"})})]})}function h(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(d,{...e})}):d(e)}},11151:(e,n,i)=>{i.d(n,{Z:()=>c,a:()=>s});var o=i(67294);const t={},r=o.createContext(t);function s(e){const n=o.useContext(r);return o.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:s(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/622dee83.e833016d.js b/assets/js/622dee83.e833016d.js deleted file mode 100644 index 52ec6656..00000000 --- a/assets/js/622dee83.e833016d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkpioreactor=self.webpackChunkpioreactor||[]).push([[8596],{95980:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>l,contentTitle:()=>s,default:()=>h,frontMatter:()=>r,metadata:()=>c,toc:()=>a});var i=o(85893),t=o(11151);const r={title:"Networking tools",slug:"/networking"},s=void 0,c={id:"Advanced/networking/networking",title:"Networking tools",description:"Previously, Raspberry Pis used a file called wpasupplicant.conf to handle wifi network connections. **This is not longer the case**. Modern Raspberry Pi software, including the Pioreactor, doesn't use wpasupplicant.conf at all. Instead, the tool nmcli replaces it. Don't follow tutorials that use wpa_supplicant.conf.",source:"@site/user-guide/30-Advanced/02-networking/10-networking.md",sourceDirName:"30-Advanced/02-networking",slug:"/networking",permalink:"/user-guide/networking",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:10,frontMatter:{title:"Networking tools",slug:"/networking"},sidebar:"tutorialSidebar",previous:{title:"Local access points",permalink:"/user-guide/local-access-point"},next:{title:"More on peristaltic pumps",permalink:"/user-guide/addition-hardware-pumps"}},l={},a=[{value:"General networking tools",id:"general-networking-tools",level:2},{value:"Connecting to a wifi network using nmcli",id:"connecting-to-a-wifi-network-using-nmcli",level:3},{value:"Connecting to multiple networks simultaneously",id:"connecting-to-multiple-networks-simultaneously",level:3},{value:"Starting the Pioreactor local access point using nmcli",id:"starting-the-pioreactor-local-access-point-using-nmcli",level:3},{value:"Changing leader_address and MQTT broker in your config.ini",id:"changing-leader_address-and-mqtt-broker-in-your-configini",level:4},{value:"Changing web UI port from 80 to something else",id:"changing-web-ui-port-from-80-to-something-else",level:3},{value:"Connecting to eduroam",id:"connecting-to-eduroam",level:2},{value:"Common questions",id:"common-questions",level:2},{value:"My Pioreactor activities start very slowly from the UI",id:"my-pioreactor-activities-start-very-slowly-from-the-ui",level:3}];function d(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",...(0,t.a)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.admonition,{type:"info",children:(0,i.jsxs)(n.p,{children:["Previously, Raspberry Pis used a file called ",(0,i.jsx)(n.code,{children:"wpa_supplicant.conf"})," to handle wifi network connections. ",(0,i.jsx)(n.strong,{children:"This is not longer the case"}),". Modern Raspberry Pi software, including the Pioreactor, doesn't use ",(0,i.jsx)(n.code,{children:"wpa_supplicant.conf"})," at all. Instead, the tool ",(0,i.jsx)(n.code,{children:"nmcli"})," replaces it. Don't follow tutorials that use ",(0,i.jsx)(n.code,{children:"wpa_supplicant.conf"}),"."]})}),"\n",(0,i.jsx)(n.h2,{id:"general-networking-tools",children:"General networking tools"}),"\n",(0,i.jsxs)(n.p,{children:['The main "entry point" for networking on the Pioreactor (and Raspberry Pi\'s in general) is the tool ',(0,i.jsx)(n.code,{children:"nmcli"}),". This controls discovering networks, connecting to them, and editing connections. For example, running ",(0,i.jsx)(n.code,{children:"nmcli con"})," will diplay a list of possible networking connections, and connected ones in green."]}),"\n",(0,i.jsxs)(n.h3,{id:"connecting-to-a-wifi-network-using-nmcli",children:["Connecting to a wifi network using ",(0,i.jsx)(n.code,{children:"nmcli"})]}),"\n",(0,i.jsx)(n.p,{children:"You can first discover all the visible networks with:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"sudo nmcli d wifi list\n"})}),"\n",(0,i.jsx)(n.p,{children:"If you see your network on the list, then run:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"sudo nmcli device wifi connect password ifname wlan0\n"})}),"\n",(0,i.jsxs)(n.p,{children:['(If you get a "Can\'t find" error, try running the above ',(0,i.jsx)(n.code,{children:"list"})," command again.)"]}),"\n",(0,i.jsx)(n.h3,{id:"connecting-to-multiple-networks-simultaneously",children:"Connecting to multiple networks simultaneously"}),"\n",(0,i.jsx)(n.p,{children:"First, some terminology and understanding for us: a computer, like a Pi, has networking interfaces. For example, the onboard wifi on RPi\u2019s is one such interface. The larger, model Bs, have an ethernet connector, which is another interface. Each interface can connect to 0 or 1 networks."}),"\n",(0,i.jsxs)(n.p,{children:["In order to connect to multiple networks, you need a Raspberry Pi with multiple interfaces. You can add interfaces with devices like a ",(0,i.jsx)(n.a,{href:"https://forum.pioreactor.com/t/connecting-more-workers-to-cluster/330/3",children:"USB wifi device"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"To see what your current interfaces are doing, use:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"nmcli device\n"})}),"\n",(0,i.jsxs)(n.p,{children:["The right hand side shows your connected interfaces. For example, if have a ethernet connection to a router, you'll see an ",(0,i.jsx)(n.code,{children:"eth0"})," connection active. If you have an additional wifi hardware device attached to your Pi, you'll see ",(0,i.jsx)(n.code,{children:"wlan1"}),"."]}),"\n",(0,i.jsxs)(n.admonition,{type:"tip",children:[(0,i.jsxs)(n.p,{children:["To connect to another wifi network using an external ",(0,i.jsx)(n.code,{children:"wlan1"})," interface, use:"]}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"sudo nmcli device wifi connect password ifname wlan1\n"})})]}),"\n",(0,i.jsxs)(n.p,{children:["If your leader is connected to multiple networks ",(0,i.jsx)(n.code,{children:"A"})," and ",(0,i.jsx)(n.code,{children:"B"}),", and you access the UI over network ",(0,i.jsx)(n.code,{children:"A"}),", but your workers access over network ",(0,i.jsx)(n.code,{children:"B"}),', the leader is in the position called a "gateway". You\'ll need to make some configuration changes to your cluster. Since the leader is attached to networks ',(0,i.jsx)(n.code,{children:"A"})," and ",(0,i.jsx)(n.code,{children:"B"}),", it has two IPs (use ",(0,i.jsx)(n.code,{children:"hostname -I"})," to see all the ips), let's call them ",(0,i.jsx)(n.code,{children:"ipA"})," and ",(0,i.jsx)(n.code,{children:"ipB"})," respectively."]}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Access the configuration in the UI."}),"\n",(0,i.jsxs)(n.li,{children:["In the ",(0,i.jsx)(n.em,{children:"shared"})," config.ini, edit the ",(0,i.jsx)(n.code,{children:"[mqtt]"})," ",(0,i.jsx)(n.code,{children:"broker"})," field to be equal to ",(0,i.jsx)(n.code,{children:"ipA"}),". Also edit the ",(0,i.jsx)(n.code,{children:"leader_address"})," to be ",(0,i.jsx)(n.code,{children:"ipB"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:["In each of the workers (including the leader's config.ini, if it's a worker), add the following:","\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"[mqtt]\nbroker=ipB\n"})}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"You may need to restart your cluster for these to take full effect."}),"\n",(0,i.jsxs)(n.h3,{id:"starting-the-pioreactor-local-access-point-using-nmcli",children:["Starting the ",(0,i.jsx)(n.a,{href:"/user-guide/local-access-point",children:"Pioreactor local access"})," point using ",(0,i.jsx)(n.code,{children:"nmcli"})]}),"\n",(0,i.jsx)(n.p,{children:"Note that you can only have 1 network connection for each network interface. So if you have only 1 wifi device (by default, RPi's only have 1 wifi device on them -> only 1 wifi interface), the following will replace any existing wifi connection."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"sudo nmcli con up PioreactorAP\n"})}),"\n",(0,i.jsxs)(n.h4,{id:"changing-leader_address-and-mqtt-broker-in-your-configini",children:["Changing ",(0,i.jsx)(n.code,{children:"leader_address"})," and MQTT ",(0,i.jsx)(n.code,{children:"broker"})," in your config.ini"]}),"\n",(0,i.jsxs)(n.p,{children:["You may need to change the ",(0,i.jsx)(n.code,{children:"leader_address"})," in your config.ini: this is the address where workers will communicate with your leader."]}),"\n",(0,i.jsxs)(n.p,{children:["Likewise, you may need to change the mqtt ",(0,i.jsx)(n.code,{children:"broker"})," in your config.ini for the same reason. It may be required to change it in the unit specific config.inis."]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-ini",metastring:'title="config_worker01.ini"',children:"[mqtt]\nbroker=leader.local\n"})}),"\n",(0,i.jsxs)(n.h3,{id:"changing-web-ui-port-from-80-to-something-else",children:["Changing web UI port from ",(0,i.jsx)(n.code,{children:"80"})," to something else"]}),"\n",(0,i.jsxs)(n.p,{children:["To change the web UI port from the default of ",(0,i.jsx)(n.code,{children:"80"}),", following these instructions:"]}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"SSH into your leader Pioreactor."}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"We'll edit the lighttpd configuration first:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"sudo nano /etc/lighttpd/lighttpd.conf\n"})}),"\n",(0,i.jsxs)(n.p,{children:["and find the line starting with ",(0,i.jsx)(n.code,{children:"server.port"}),". Change this to something else (preferably not a value below 1024). Save and exit."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Restart lighttpd with:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"sudo systemctl restart lighttpd.service\n"})}),"\n",(0,i.jsxs)(n.p,{children:["You should be able to access the web UI only on http://",(0,i.jsx)(n.code,{children:"leader name"}),":",(0,i.jsx)(n.code,{children:"new port"}),", for example: ",(0,i.jsx)(n.a,{href:"http://leader.local:8080",children:"http://leader.local:8080"})]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["In your configuration, under the ",(0,i.jsx)(n.code,{children:"[ui]"})," section, change the ",(0,i.jsx)(n.code,{children:"port"})," option from ",(0,i.jsx)(n.code,{children:"80"})," to your new port value. Save. You may need to restart your cluster for this new port to propagate to all machines correctly."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"connecting-to-eduroam",children:"Connecting to eduroam"}),"\n",(0,i.jsxs)(n.p,{children:["This is a work-in-progress, but here's ",(0,i.jsx)(n.a,{href:"https://forum.pioreactor.com/t/connecting-more-workers-to-cluster/330/3#connecting-to-eduroam-2",children:"one example"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"common-questions",children:"Common questions"}),"\n",(0,i.jsx)(n.h3,{id:"my-pioreactor-activities-start-very-slowly-from-the-ui",children:"My Pioreactor activities start very slowly from the UI"}),"\n",(0,i.jsxs)(n.p,{children:['It is possible that your mDNS is being blocked or restricted. If possible, log into your router and enable settings that allow "multicast", or "mDNS", or "IGMP proxing". If you are using a the builtin ',(0,i.jsx)(n.a,{href:"/user-guide/local-access-point",children:"local access point"}),", this solution is not the correct one."]}),"\n",(0,i.jsx)(n.p,{children:"Also, if you are able to provide a permanent IPv4 address to your leader, you can get a significant performance boost by setting the configuration some config parameters to the IPv4 address."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"[cluster.topology]\n# below is an example, your IPv4 may differ:\nleader_address=192.168.0.3\n\n[mqtt]\nbroker_address=192.168.0.3\n\n"})})]})}function h(e={}){const{wrapper:n}={...(0,t.a)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(d,{...e})}):d(e)}},11151:(e,n,o)=>{o.d(n,{Z:()=>c,a:()=>s});var i=o(67294);const t={},r=i.createContext(t);function s(e){const n=i.useContext(r);return i.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:s(e.components),i.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6293b6ce.a013be71.js b/assets/js/6293b6ce.48bdce34.js similarity index 51% rename from assets/js/6293b6ce.a013be71.js rename to assets/js/6293b6ce.48bdce34.js index a967ea8f..783b3266 100644 --- a/assets/js/6293b6ce.a013be71.js +++ b/assets/js/6293b6ce.48bdce34.js @@ -1 +1 @@ -"use strict";(self.webpackChunkpioreactor=self.webpackChunkpioreactor||[]).push([[5214],{81298:(e,a,o)=>{o.r(a),o.d(a,{assets:()=>l,contentTitle:()=>s,default:()=>u,frontMatter:()=>r,metadata:()=>d,toc:()=>m});var n=o(85893),c=o(11151),t=o(67294);function i(){const[e,a]=t.useState("");return(0,n.jsxs)("div",{children:[(0,n.jsx)("span",{children:" Select your country: "}),(0,n.jsx)("select",{name:"country",onChange:e=>a(e.target.value),style:{width:"180px"},children:[{code:"",name:"-- Select --"},{code:"AF",name:"Afghanistan"},{code:"AX",name:"Aland Islands"},{code:"AL",name:"Albania"},{code:"DZ",name:"Algeria"},{code:"AS",name:"American Samoa"},{code:"AD",name:"Andorra"},{code:"AO",name:"Angola"},{code:"AI",name:"Anguilla"},{code:"AQ",name:"Antarctica"},{code:"AG",name:"Antigua And Barbuda"},{code:"AR",name:"Argentina"},{code:"AM",name:"Armenia"},{code:"AW",name:"Aruba"},{code:"AU",name:"Australia"},{code:"AT",name:"Austria"},{code:"AZ",name:"Azerbaijan"},{code:"BS",name:"Bahamas"},{code:"BH",name:"Bahrain"},{code:"BD",name:"Bangladesh"},{code:"BB",name:"Barbados"},{code:"BY",name:"Belarus"},{code:"BE",name:"Belgium"},{code:"BZ",name:"Belize"},{code:"BJ",name:"Benin"},{code:"BM",name:"Bermuda"},{code:"BT",name:"Bhutan"},{code:"BO",name:"Bolivia"},{code:"BA",name:"Bosnia And Herzegovina"},{code:"BW",name:"Botswana"},{code:"BV",name:"Bouvet Island"},{code:"BR",name:"Brazil"},{code:"IO",name:"British Indian Ocean Territory"},{code:"BN",name:"Brunei Darussalam"},{code:"BG",name:"Bulgaria"},{code:"BF",name:"Burkina Faso"},{code:"BI",name:"Burundi"},{code:"KH",name:"Cambodia"},{code:"CM",name:"Cameroon"},{code:"CA",name:"Canada"},{code:"CV",name:"Cape Verde"},{code:"KY",name:"Cayman Islands"},{code:"CF",name:"Central African Republic"},{code:"TD",name:"Chad"},{code:"CL",name:"Chile"},{code:"CN",name:"China"},{code:"CX",name:"Christmas Island"},{code:"CC",name:"Cocos (Keeling) Islands"},{code:"CO",name:"Colombia"},{code:"KM",name:"Comoros"},{code:"CG",name:"Congo"},{code:"CD",name:"Congo, Democratic Republic"},{code:"CK",name:"Cook Islands"},{code:"CR",name:"Costa Rica"},{code:"CI",name:"Cote D'Ivoire"},{code:"HR",name:"Croatia"},{code:"CU",name:"Cuba"},{code:"CY",name:"Cyprus"},{code:"CZ",name:"Czech Republic"},{code:"DK",name:"Denmark"},{code:"DJ",name:"Djibouti"},{code:"DM",name:"Dominica"},{code:"DO",name:"Dominican Republic"},{code:"EC",name:"Ecuador"},{code:"EG",name:"Egypt"},{code:"SV",name:"El Salvador"},{code:"GQ",name:"Equatorial Guinea"},{code:"ER",name:"Eritrea"},{code:"EE",name:"Estonia"},{code:"ET",name:"Ethiopia"},{code:"FK",name:"Falkland Islands (Malvinas)"},{code:"FO",name:"Faroe Islands"},{code:"FJ",name:"Fiji"},{code:"FI",name:"Finland"},{code:"FR",name:"France"},{code:"GF",name:"French Guiana"},{code:"PF",name:"French Polynesia"},{code:"TF",name:"French Southern Territories"},{code:"GA",name:"Gabon"},{code:"GM",name:"Gambia"},{code:"GE",name:"Georgia"},{code:"DE",name:"Germany"},{code:"GH",name:"Ghana"},{code:"GI",name:"Gibraltar"},{code:"GR",name:"Greece"},{code:"GL",name:"Greenland"},{code:"GD",name:"Grenada"},{code:"GP",name:"Guadeloupe"},{code:"GU",name:"Guam"},{code:"GT",name:"Guatemala"},{code:"GG",name:"Guernsey"},{code:"GN",name:"Guinea"},{code:"GW",name:"Guinea-Bissau"},{code:"GY",name:"Guyana"},{code:"HT",name:"Haiti"},{code:"HM",name:"Heard Island & Mcdonald Islands"},{code:"VA",name:"Holy See (Vatican City State)"},{code:"HN",name:"Honduras"},{code:"HK",name:"Hong Kong"},{code:"HU",name:"Hungary"},{code:"IS",name:"Iceland"},{code:"IN",name:"India"},{code:"ID",name:"Indonesia"},{code:"IR",name:"Iran}, Islamic Republic Of"},{code:"IQ",name:"Iraq"},{code:"IE",name:"Ireland"},{code:"IM",name:"Isle Of Man"},{code:"IL",name:"Israel"},{code:"IT",name:"Italy"},{code:"JM",name:"Jamaica"},{code:"JP",name:"Japan"},{code:"JE",name:"Jersey"},{code:"JO",name:"Jordan"},{code:"KZ",name:"Kazakhstan"},{code:"KE",name:"Kenya"},{code:"KI",name:"Kiribati"},{code:"KR",name:"Korea"},{code:"KW",name:"Kuwait"},{code:"KG",name:"Kyrgyzstan"},{code:"LA",name:"Lao People's Democratic Republic"},{code:"LV",name:"Latvia"},{code:"LB",name:"Lebanon"},{code:"LS",name:"Lesotho"},{code:"LR",name:"Liberia"},{code:"LY",name:"Libyan Arab Jamahiriya"},{code:"LI",name:"Liechtenstein"},{code:"LT",name:"Lithuania"},{code:"LU",name:"Luxembourg"},{code:"MO",name:"Macao"},{code:"MK",name:"Macedonia"},{code:"MG",name:"Madagascar"},{code:"MW",name:"Malawi"},{code:"MY",name:"Malaysia"},{code:"MV",name:"Maldives"},{code:"ML",name:"Mali"},{code:"MT",name:"Malta"},{code:"MH",name:"Marshall Islands"},{code:"MQ",name:"Martinique"},{code:"MR",name:"Mauritania"},{code:"MU",name:"Mauritius"},{code:"YT",name:"Mayotte"},{code:"MX",name:"Mexico"},{code:"FM",name:"Micronesia}, Federated States Of"},{code:"MD",name:"Moldova"},{code:"MC",name:"Monaco"},{code:"MN",name:"Mongolia"},{code:"ME",name:"Montenegro"},{code:"MS",name:"Montserrat"},{code:"MA",name:"Morocco"},{code:"MZ",name:"Mozambique"},{code:"MM",name:"Myanmar"},{code:"NA",name:"Namibia"},{code:"NR",name:"Nauru"},{code:"NP",name:"Nepal"},{code:"NL",name:"Netherlands"},{code:"AN",name:"Netherlands Antilles"},{code:"NC",name:"New Caledonia"},{code:"NZ",name:"New Zealand"},{code:"NI",name:"Nicaragua"},{code:"NE",name:"Niger"},{code:"NG",name:"Nigeria"},{code:"NU",name:"Niue"},{code:"NF",name:"Norfolk Island"},{code:"MP",name:"Northern Mariana Islands"},{code:"NO",name:"Norway"},{code:"OM",name:"Oman"},{code:"PK",name:"Pakistan"},{code:"PW",name:"Palau"},{code:"PS",name:"Palestinian Territory}, Occupied"},{code:"PA",name:"Panama"},{code:"PG",name:"Papua New Guinea"},{code:"PY",name:"Paraguay"},{code:"PE",name:"Peru"},{code:"PH",name:"Philippines"},{code:"PN",name:"Pitcairn"},{code:"PL",name:"Poland"},{code:"PT",name:"Portugal"},{code:"PR",name:"Puerto Rico"},{code:"QA",name:"Qatar"},{code:"RE",name:"Reunion"},{code:"RO",name:"Romania"},{code:"RU",name:"Russian Federation"},{code:"RW",name:"Rwanda"},{code:"BL",name:"Saint Barthelemy"},{code:"SH",name:"Saint Helena"},{code:"KN",name:"Saint Kitts And Nevis"},{code:"LC",name:"Saint Lucia"},{code:"MF",name:"Saint Martin"},{code:"PM",name:"Saint Pierre And Miquelon"},{code:"VC",name:"Saint Vincent And Grenadines"},{code:"WS",name:"Samoa"},{code:"SM",name:"San Marino"},{code:"ST",name:"Sao Tome And Principe"},{code:"SA",name:"Saudi Arabia"},{code:"SN",name:"Senegal"},{code:"RS",name:"Serbia"},{code:"SC",name:"Seychelles"},{code:"SL",name:"Sierra Leone"},{code:"SG",name:"Singapore"},{code:"SK",name:"Slovakia"},{code:"SI",name:"Slovenia"},{code:"SB",name:"Solomon Islands"},{code:"SO",name:"Somalia"},{code:"ZA",name:"South Africa"},{code:"GS",name:"South Georgia And Sandwich Isl."},{code:"ES",name:"Spain"},{code:"LK",name:"Sri Lanka"},{code:"SD",name:"Sudan"},{code:"SR",name:"Suriname"},{code:"SJ",name:"Svalbard And Jan Mayen"},{code:"SZ",name:"Swaziland"},{code:"SE",name:"Sweden"},{code:"CH",name:"Switzerland"},{code:"SY",name:"Syrian Arab Republic"},{code:"TW",name:"Taiwan"},{code:"TJ",name:"Tajikistan"},{code:"TZ",name:"Tanzania"},{code:"TH",name:"Thailand"},{code:"TL",name:"Timor-Leste"},{code:"TG",name:"Togo"},{code:"TK",name:"Tokelau"},{code:"TO",name:"Tonga"},{code:"TT",name:"Trinidad And Tobago"},{code:"TN",name:"Tunisia"},{code:"TR",name:"Turkey"},{code:"TM",name:"Turkmenistan"},{code:"TC",name:"Turks And Caicos Islands"},{code:"TV",name:"Tuvalu"},{code:"UG",name:"Uganda"},{code:"UA",name:"Ukraine"},{code:"AE",name:"United Arab Emirates"},{code:"GB",name:"United Kingdom"},{code:"US",name:"United States"},{code:"UM",name:"United States Outlying Islands"},{code:"UY",name:"Uruguay"},{code:"UZ",name:"Uzbekistan"},{code:"VU",name:"Vanuatu"},{code:"VE",name:"Venezuela"},{code:"VN",name:"Vietnam"},{code:"VG",name:"Virgin Islands}, British"},{code:"VI",name:"Virgin Islands}, U.S."},{code:"WF",name:"Wallis And Futuna"},{code:"EH",name:"Western Sahara"},{code:"YE",name:"Yemen"},{code:"ZM",name:"Zambia"},{code:"ZW",name:"Zimbabwe"}].map((e=>(0,n.jsx)("option",{value:e.code,children:e.name})))}),(0,n.jsxs)("span",{children:[" and download the specific ",(0,n.jsx)("code",{children:"local_acccess_point"})," file: "]}),(0,n.jsx)("button",{onClick:()=>((a,o)=>{const n=document.createElement("a"),c=new Blob([e],{type:a}),t=URL.createObjectURL(c);n.setAttribute("href",t),n.setAttribute("download",o),n.click()})("application/octet-stream","local_access_point"),disabled:""===e,children:"Download"})]})}const r={title:"Local access points",slug:"/local-access-point"},s=void 0,d={id:"Advanced/networking/local-access-point",title:"Local access points",description:"For some use cases, you may want to create a local WiFi network just for your Pioreactors (this is called a local access point, or a hotspot). Why might you want to do this?",source:"@site/user-guide/30-Advanced/02-networking/06-local-access-point.md",sourceDirName:"30-Advanced/02-networking",slug:"/local-access-point",permalink:"/user-guide/local-access-point",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:6,frontMatter:{title:"Local access points",slug:"/local-access-point"},sidebar:"tutorialSidebar",previous:{title:"Internet sharing between a PC and a Pioreactor",permalink:"/user-guide/internet-sharing"},next:{title:"Networking tools",permalink:"/user-guide/networking"}},l={},m=[{value:"Starting a local access point",id:"starting-a-local-access-point",level:2},{value:"Access the local access point",id:"access-the-local-access-point",level:2},{value:"Connecting more Pioreactors to your local access point",id:"connecting-more-pioreactors-to-your-local-access-point",level:3},{value:"Adding internet access to your local access point",id:"adding-internet-access-to-your-local-access-point",level:2},{value:"Turning off a local access point",id:"turning-off-a-local-access-point",level:2},{value:"Changing SSID name or password for your local access point",id:"changing-ssid-name-or-password-for-your-local-access-point",level:2},{value:"Troubleshooting",id:"troubleshooting",level:2},{value:"My computer can't connect to the local-access-point",id:"my-computer-cant-connect-to-the-local-access-point",level:3},{value:"Do you see the pioreactor network in the list of available wifi networks?",id:"do-you-see-the-pioreactor-network-in-the-list-of-available-wifi-networks",level:4},{value:"Alternatively, do you not see the pioreactor network in the list of available wifi networks?",id:"alternatively-do-you-not-see-the-pioreactor-network-in-the-list-of-available-wifi-networks",level:4},{value:"I'm on the network, but can't load the Pioreactor UI at http://pioreactor.local",id:"im-on-the-network-but-cant-load-the-pioreactor-ui-at-httppioreactorlocal",level:3},{value:"I can't connect a worker to my local access point",id:"i-cant-connect-a-worker-to-my-local-access-point",level:3},{value:"I'm pretty sure I'm at the limit of ~4-8 clients on my access point - what can I do?",id:"im-pretty-sure-im-at-the-limit-of-4-8-clients-on-my-access-point---what-can-i-do",level:3}];function h(e){const a={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,c.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(a.p,{children:"For some use cases, you may want to create a local WiFi network just for your Pioreactors (this is called a local access point, or a hotspot). Why might you want to do this?"}),"\n",(0,n.jsxs)(a.ul,{children:["\n",(0,n.jsx)(a.li,{children:"If you want to get started right away, without dealing with exiting WiFi networks."}),"\n",(0,n.jsx)(a.li,{children:"If your usual WiFi network is restrictive (ex: doesn't allow Raspberry Pis, or requires IT support to host them)."}),"\n",(0,n.jsx)(a.li,{children:"If you want to take the Pioreactor, or cluster of Pioreactors, out into the field where there is no network."}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:"The Pioreactor comes with the ability to create its own local access point, which other Pioreactors can connect to. See image below:"}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"Using the Pioreactor to create a local access point",src:o(13726).Z+"",width:"1191",height:"387"})}),"\n",(0,n.jsx)(a.admonition,{type:"info",children:(0,n.jsx)(a.p,{children:"The built-in local access point is meant for small clusters of Pioreactors, and it's range and stability is limited. If you want a proper local access point, we suggest purchasing an inexpensive wifi router and using that (the router does not need to be connected to the internet - it will still create a wifi network you can connect Pioreactors to regardless)."})}),"\n",(0,n.jsx)(a.h2,{id:"starting-a-local-access-point",children:"Starting a local access point"}),"\n",(0,n.jsx)(a.p,{children:"The Pioreactor has the necessary software and hardware to create the local access point. To start the access point:"}),"\n",(0,n.jsxs)(a.ul,{children:["\n",(0,n.jsxs)(a.li,{children:["If starting with a new Pioreactor, during software set up:","\n",(0,n.jsxs)(a.ol,{children:["\n",(0,n.jsxs)(a.li,{children:['Leave the "Configure wireless LAN" unchecked. Continue with the instructions at ',(0,n.jsx)(a.a,{href:"/user-guide/software-set-up#setting-up-your-raspberry-pi",children:"Setting up your Raspberry Pi"}),"."]}),"\n",(0,n.jsxs)(a.li,{children:["After the SD card has been written to, remove the SD card from your computer, and immediately insert it back in. A ",(0,n.jsx)(a.code,{children:"boot"})," (or ",(0,n.jsx)(a.code,{children:"bootfs"}),") device should be present now that is your SD card. If asked to reformat the SD card, select NO."]}),"\n",(0,n.jsxs)(a.li,{children:["\n",(0,n.jsx)(i,{}),"\n"]}),"\n",(0,n.jsxs)(a.li,{children:["Drag/move the downloaded ",(0,n.jsx)(a.code,{children:"local_access_point"})," file to the SD card directory."]}),"\n",(0,n.jsxs)(a.li,{children:["Eject the SD card safely, and continue with instructions at ",(0,n.jsx)(a.a,{href:"/user-guide/software-set-up#setting-up-your-raspberry-pi",children:"Setting up your Raspberry Pi"}),"."]}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(a.li,{children:["If starting from an existing Pioreactor:","\n",(0,n.jsxs)(a.ol,{children:["\n",(0,n.jsx)(a.li,{children:"with the power off remove the SD card from the Pioreactor and insert it into a computer."}),"\n",(0,n.jsxs)(a.li,{children:["\n",(0,n.jsx)(i,{}),"\n"]}),"\n",(0,n.jsxs)(a.li,{children:["Drag/move the downloaded ",(0,n.jsx)(a.code,{children:"local_access_point"})," file to your SD card (called ",(0,n.jsx)(a.code,{children:"boot"})," or ",(0,n.jsx)(a.code,{children:"bootfs"}),")."]}),"\n",(0,n.jsx)(a.li,{children:"Eject the SD card safely, and put back into the Pioreactor."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(a.h2,{id:"access-the-local-access-point",children:"Access the local access point"}),"\n",(0,n.jsxs)(a.p,{children:["After plugging in the Pioreactor, the local access point will start and you should see a new network called ",(0,n.jsx)(a.code,{children:"pioreactor"}),", with password ",(0,n.jsx)(a.code,{children:"raspberry"}),". You should be able to connect to this new access point with any computer, phone, tablet, etc."]}),"\n",(0,n.jsx)("img",{src:"/img/user-guide/pioreactor_ap.png",width:"325"}),"\n",(0,n.jsxs)(a.p,{children:["Once connected, the usual urls should work: ",(0,n.jsx)(a.a,{href:"http://pioreactor.local",children:"http://pioreactor.local"})," will bring up the Pioreactor interface (having trouble? Not working? Try our troubleshooting steps below."]}),"\n",(0,n.jsx)(a.admonition,{type:"info",children:(0,n.jsxs)(a.p,{children:["Without access to the internet, the Pioreactor will have the wrong internal time. You can change this ",(0,n.jsx)(a.a,{href:"/user-guide/common-questions#how-do-i-change-the-date-or-time-on-the-pioreactor",children:"using this method"})]})}),"\n",(0,n.jsx)(a.h3,{id:"connecting-more-pioreactors-to-your-local-access-point",children:"Connecting more Pioreactors to your local access point"}),"\n",(0,n.jsx)(a.admonition,{type:"info",children:(0,n.jsxs)(a.p,{children:["Raspberry Pi 3B and Raspberry Pi Zero W have trouble connecting to these local access points. Follow instructions ",(0,n.jsx)(a.a,{href:"https://github.com/Pioreactor/pioreactor/blob/992d986881f3a3504a08b781a494b1a6e3b5a0e3/CHANGELOG.md?plain=1#L110C11-L121",children:"here"}),"."]})}),"\n",(0,n.jsxs)(a.p,{children:["Other Pioreactors will need to be reconfigured to connect to this new access point. During set up in the Raspberry Pi Imager, using the ssid / wifi credentials: ",(0,n.jsx)(a.code,{children:"pioreactor"})," and password ",(0,n.jsx)(a.code,{children:"raspberry"})," in the wireless LAN section. ",(0,n.jsxs)(a.strong,{children:["Don't add the ",(0,n.jsx)(a.code,{children:"local_access_point"})," file to these other Pioreactors - you only need to do that once"]}),"."]}),"\n",(0,n.jsxs)(a.p,{children:["The maximum number of machines (Pioreactors and computers) that can be connected to a local access point on a Pioreactor is ~4-8. There is a possibility to add more, see ",(0,n.jsx)(a.a,{href:"https://github.com/Pioreactor/pioreactor/issues/442",children:"issue here"}),"."]}),"\n",(0,n.jsx)(a.p,{children:"This network may not be connected to the internet, so you won't be able to upgrade any software on the Pioreactors. See section below on how to add internet."}),"\n",(0,n.jsx)(a.h2,{id:"adding-internet-access-to-your-local-access-point",children:"Adding internet access to your local access point"}),"\n",(0,n.jsx)(a.p,{children:"If you are hosting the local access point on a Raspberry Pi that has an ethernet port (B models), you can plug this into a router that has access to the internet to provide internet to your entire cluster."}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"Using the Pioreactor to create a local access point, and the is connected to a router",src:o(8026).Z+"",width:"578",height:"387"})}),"\n",(0,n.jsx)(a.h2,{id:"turning-off-a-local-access-point",children:"Turning off a local access point"}),"\n",(0,n.jsxs)(a.p,{children:["After SSH-ing into your Pioreactor, simply delete the ",(0,n.jsx)(a.code,{children:"local_access_point"})," file in the ",(0,n.jsx)(a.code,{children:"/boot/firmware/"})," directory, and reboot."]}),"\n",(0,n.jsx)(a.h2,{id:"changing-ssid-name-or-password-for-your-local-access-point",children:"Changing SSID name or password for your local access point"}),"\n",(0,n.jsxs)(a.p,{children:["In the ",(0,n.jsx)(a.code,{children:"config.ini"}),", the SSID and password are editable under the section ",(0,n.jsx)(a.code,{children:"local_access_point"}),". This requires a power-cycle to take effect."]}),"\n",(0,n.jsx)(a.h2,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,n.jsx)(a.h3,{id:"my-computer-cant-connect-to-the-local-access-point",children:"My computer can't connect to the local-access-point"}),"\n",(0,n.jsxs)(a.h4,{id:"do-you-see-the-pioreactor-network-in-the-list-of-available-wifi-networks",children:["Do you see the ",(0,n.jsx)(a.code,{children:"pioreactor"})," network in the list of available wifi networks?"]}),"\n",(0,n.jsxs)(a.ul,{children:["\n",(0,n.jsx)(a.li,{children:'If presented, use the option "Use security key to connect" (this is an alias for the password).'}),"\n",(0,n.jsx)(a.li,{children:"Try power-cycling your Pioreactor"}),"\n",(0,n.jsxs)(a.li,{children:["The maximum number of machines (Pioreactors and computers) that can be connected to a local access point on a Pioreactor is ~4-8. There is a possibility to add more, see ",(0,n.jsx)(a.a,{href:"https://github.com/Pioreactor/pioreactor/issues/442",children:"issue here"}),"."]}),"\n"]}),"\n",(0,n.jsxs)(a.h4,{id:"alternatively-do-you-not-see-the-pioreactor-network-in-the-list-of-available-wifi-networks",children:["Alternatively, do you ",(0,n.jsx)(a.em,{children:"not"})," see the ",(0,n.jsx)(a.code,{children:"pioreactor"})," network in the list of available wifi networks?"]}),"\n",(0,n.jsxs)(a.ul,{children:["\n",(0,n.jsx)(a.li,{children:"Try power-cycling the Raspberry Pi"}),"\n",(0,n.jsxs)(a.li,{children:["If you unplug the Pioreactor, and place the SD card back into your computer, do you see the ",(0,n.jsx)(a.code,{children:"local_access_point"})," file? If not, try adding the file again, inserting the SD card in the Pioreactor, and restarting the Pioreactor."]}),"\n"]}),"\n",(0,n.jsxs)(a.h3,{id:"im-on-the-network-but-cant-load-the-pioreactor-ui-at-httppioreactorlocal",children:["I'm on the network, but can't load the Pioreactor UI at ",(0,n.jsx)(a.code,{children:"http://pioreactor.local"})]}),"\n",(0,n.jsxs)(a.p,{children:["Try ",(0,n.jsx)(a.code,{children:"http://.local"}),". Still not working? Try ",(0,n.jsx)(a.code,{children:"http://10.42.0.1"}),")"]}),"\n",(0,n.jsx)(a.h3,{id:"i-cant-connect-a-worker-to-my-local-access-point",children:"I can't connect a worker to my local access point"}),"\n",(0,n.jsxs)(a.ul,{children:["\n",(0,n.jsxs)(a.li,{children:["confirm that you are using the right wifi name and password in the Imager (default ",(0,n.jsx)(a.code,{children:"pioreactor"})," and ",(0,n.jsx)(a.code,{children:"raspberry"}),")"]}),"\n",(0,n.jsxs)(a.li,{children:["The maximum number of access point clients (Pioreactors and computers) that can be connected to a local access point on a Pioreactor is ~4-8. There is a possibility to add more, see ",(0,n.jsx)(a.a,{href:"https://github.com/Pioreactor/pioreactor/issues/442",children:"issue here"}),"."]}),"\n"]}),"\n",(0,n.jsx)(a.h3,{id:"im-pretty-sure-im-at-the-limit-of-4-8-clients-on-my-access-point---what-can-i-do",children:"I'm pretty sure I'm at the limit of ~4-8 clients on my access point - what can I do?"}),"\n",(0,n.jsxs)(a.ul,{children:["\n",(0,n.jsx)(a.li,{children:"You can purchase an inexpensive wifi router and use that as the access point. Note that you don't need to connect this router to the internet - it will operate a network regardless."}),"\n",(0,n.jsx)(a.li,{children:"You can purchase a WIFI USB stick to improve the clients and range of your Pioreactor. For example, the Alfa AWUS036AC (take note to confirm your Raspberry Pi can has the correct USB connection)."}),"\n"]})]})}function u(e={}){const{wrapper:a}={...(0,c.a)(),...e.components};return a?(0,n.jsx)(a,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},8026:(e,a,o)=>{o.d(a,{Z:()=>n});const n=o.p+"assets/images/lap_with_internet-ac1e9e680aaeaa368935366c54db0007.png"},13726:(e,a,o)=>{o.d(a,{Z:()=>n});const n=o.p+"assets/images/local_access_point-9455ab0ce2fa6461e80fc732e06e4a0d.png"},11151:(e,a,o)=>{o.d(a,{Z:()=>r,a:()=>i});var n=o(67294);const c={},t=n.createContext(c);function i(e){const a=n.useContext(t);return n.useMemo((function(){return"function"==typeof e?e(a):{...a,...e}}),[a,e])}function r(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(c):e.components||c:i(e.components),n.createElement(t.Provider,{value:a},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkpioreactor=self.webpackChunkpioreactor||[]).push([[5214],{81298:(e,a,o)=>{o.r(a),o.d(a,{assets:()=>l,contentTitle:()=>s,default:()=>u,frontMatter:()=>r,metadata:()=>d,toc:()=>m});var n=o(85893),c=o(11151),t=o(67294);function i(){const[e,a]=t.useState("");return(0,n.jsxs)("div",{children:[(0,n.jsx)("span",{children:" Select your country: "}),(0,n.jsx)("select",{name:"country",onChange:e=>a(e.target.value),style:{width:"180px"},children:[{code:"",name:"-- Select --"},{code:"AF",name:"Afghanistan"},{code:"AX",name:"Aland Islands"},{code:"AL",name:"Albania"},{code:"DZ",name:"Algeria"},{code:"AS",name:"American Samoa"},{code:"AD",name:"Andorra"},{code:"AO",name:"Angola"},{code:"AI",name:"Anguilla"},{code:"AQ",name:"Antarctica"},{code:"AG",name:"Antigua And Barbuda"},{code:"AR",name:"Argentina"},{code:"AM",name:"Armenia"},{code:"AW",name:"Aruba"},{code:"AU",name:"Australia"},{code:"AT",name:"Austria"},{code:"AZ",name:"Azerbaijan"},{code:"BS",name:"Bahamas"},{code:"BH",name:"Bahrain"},{code:"BD",name:"Bangladesh"},{code:"BB",name:"Barbados"},{code:"BY",name:"Belarus"},{code:"BE",name:"Belgium"},{code:"BZ",name:"Belize"},{code:"BJ",name:"Benin"},{code:"BM",name:"Bermuda"},{code:"BT",name:"Bhutan"},{code:"BO",name:"Bolivia"},{code:"BA",name:"Bosnia And Herzegovina"},{code:"BW",name:"Botswana"},{code:"BV",name:"Bouvet Island"},{code:"BR",name:"Brazil"},{code:"IO",name:"British Indian Ocean Territory"},{code:"BN",name:"Brunei Darussalam"},{code:"BG",name:"Bulgaria"},{code:"BF",name:"Burkina Faso"},{code:"BI",name:"Burundi"},{code:"KH",name:"Cambodia"},{code:"CM",name:"Cameroon"},{code:"CA",name:"Canada"},{code:"CV",name:"Cape Verde"},{code:"KY",name:"Cayman Islands"},{code:"CF",name:"Central African Republic"},{code:"TD",name:"Chad"},{code:"CL",name:"Chile"},{code:"CN",name:"China"},{code:"CX",name:"Christmas Island"},{code:"CC",name:"Cocos (Keeling) Islands"},{code:"CO",name:"Colombia"},{code:"KM",name:"Comoros"},{code:"CG",name:"Congo"},{code:"CD",name:"Congo, Democratic Republic"},{code:"CK",name:"Cook Islands"},{code:"CR",name:"Costa Rica"},{code:"CI",name:"Cote D'Ivoire"},{code:"HR",name:"Croatia"},{code:"CU",name:"Cuba"},{code:"CY",name:"Cyprus"},{code:"CZ",name:"Czech Republic"},{code:"DK",name:"Denmark"},{code:"DJ",name:"Djibouti"},{code:"DM",name:"Dominica"},{code:"DO",name:"Dominican Republic"},{code:"EC",name:"Ecuador"},{code:"EG",name:"Egypt"},{code:"SV",name:"El Salvador"},{code:"GQ",name:"Equatorial Guinea"},{code:"ER",name:"Eritrea"},{code:"EE",name:"Estonia"},{code:"ET",name:"Ethiopia"},{code:"FK",name:"Falkland Islands (Malvinas)"},{code:"FO",name:"Faroe Islands"},{code:"FJ",name:"Fiji"},{code:"FI",name:"Finland"},{code:"FR",name:"France"},{code:"GF",name:"French Guiana"},{code:"PF",name:"French Polynesia"},{code:"TF",name:"French Southern Territories"},{code:"GA",name:"Gabon"},{code:"GM",name:"Gambia"},{code:"GE",name:"Georgia"},{code:"DE",name:"Germany"},{code:"GH",name:"Ghana"},{code:"GI",name:"Gibraltar"},{code:"GR",name:"Greece"},{code:"GL",name:"Greenland"},{code:"GD",name:"Grenada"},{code:"GP",name:"Guadeloupe"},{code:"GU",name:"Guam"},{code:"GT",name:"Guatemala"},{code:"GG",name:"Guernsey"},{code:"GN",name:"Guinea"},{code:"GW",name:"Guinea-Bissau"},{code:"GY",name:"Guyana"},{code:"HT",name:"Haiti"},{code:"HM",name:"Heard Island & Mcdonald Islands"},{code:"VA",name:"Holy See (Vatican City State)"},{code:"HN",name:"Honduras"},{code:"HK",name:"Hong Kong"},{code:"HU",name:"Hungary"},{code:"IS",name:"Iceland"},{code:"IN",name:"India"},{code:"ID",name:"Indonesia"},{code:"IR",name:"Iran}, Islamic Republic Of"},{code:"IQ",name:"Iraq"},{code:"IE",name:"Ireland"},{code:"IM",name:"Isle Of Man"},{code:"IL",name:"Israel"},{code:"IT",name:"Italy"},{code:"JM",name:"Jamaica"},{code:"JP",name:"Japan"},{code:"JE",name:"Jersey"},{code:"JO",name:"Jordan"},{code:"KZ",name:"Kazakhstan"},{code:"KE",name:"Kenya"},{code:"KI",name:"Kiribati"},{code:"KR",name:"Korea"},{code:"KW",name:"Kuwait"},{code:"KG",name:"Kyrgyzstan"},{code:"LA",name:"Lao People's Democratic Republic"},{code:"LV",name:"Latvia"},{code:"LB",name:"Lebanon"},{code:"LS",name:"Lesotho"},{code:"LR",name:"Liberia"},{code:"LY",name:"Libyan Arab Jamahiriya"},{code:"LI",name:"Liechtenstein"},{code:"LT",name:"Lithuania"},{code:"LU",name:"Luxembourg"},{code:"MO",name:"Macao"},{code:"MK",name:"Macedonia"},{code:"MG",name:"Madagascar"},{code:"MW",name:"Malawi"},{code:"MY",name:"Malaysia"},{code:"MV",name:"Maldives"},{code:"ML",name:"Mali"},{code:"MT",name:"Malta"},{code:"MH",name:"Marshall Islands"},{code:"MQ",name:"Martinique"},{code:"MR",name:"Mauritania"},{code:"MU",name:"Mauritius"},{code:"YT",name:"Mayotte"},{code:"MX",name:"Mexico"},{code:"FM",name:"Micronesia}, Federated States Of"},{code:"MD",name:"Moldova"},{code:"MC",name:"Monaco"},{code:"MN",name:"Mongolia"},{code:"ME",name:"Montenegro"},{code:"MS",name:"Montserrat"},{code:"MA",name:"Morocco"},{code:"MZ",name:"Mozambique"},{code:"MM",name:"Myanmar"},{code:"NA",name:"Namibia"},{code:"NR",name:"Nauru"},{code:"NP",name:"Nepal"},{code:"NL",name:"Netherlands"},{code:"AN",name:"Netherlands Antilles"},{code:"NC",name:"New Caledonia"},{code:"NZ",name:"New Zealand"},{code:"NI",name:"Nicaragua"},{code:"NE",name:"Niger"},{code:"NG",name:"Nigeria"},{code:"NU",name:"Niue"},{code:"NF",name:"Norfolk Island"},{code:"MP",name:"Northern Mariana Islands"},{code:"NO",name:"Norway"},{code:"OM",name:"Oman"},{code:"PK",name:"Pakistan"},{code:"PW",name:"Palau"},{code:"PS",name:"Palestinian Territory}, Occupied"},{code:"PA",name:"Panama"},{code:"PG",name:"Papua New Guinea"},{code:"PY",name:"Paraguay"},{code:"PE",name:"Peru"},{code:"PH",name:"Philippines"},{code:"PN",name:"Pitcairn"},{code:"PL",name:"Poland"},{code:"PT",name:"Portugal"},{code:"PR",name:"Puerto Rico"},{code:"QA",name:"Qatar"},{code:"RE",name:"Reunion"},{code:"RO",name:"Romania"},{code:"RU",name:"Russian Federation"},{code:"RW",name:"Rwanda"},{code:"BL",name:"Saint Barthelemy"},{code:"SH",name:"Saint Helena"},{code:"KN",name:"Saint Kitts And Nevis"},{code:"LC",name:"Saint Lucia"},{code:"MF",name:"Saint Martin"},{code:"PM",name:"Saint Pierre And Miquelon"},{code:"VC",name:"Saint Vincent And Grenadines"},{code:"WS",name:"Samoa"},{code:"SM",name:"San Marino"},{code:"ST",name:"Sao Tome And Principe"},{code:"SA",name:"Saudi Arabia"},{code:"SN",name:"Senegal"},{code:"RS",name:"Serbia"},{code:"SC",name:"Seychelles"},{code:"SL",name:"Sierra Leone"},{code:"SG",name:"Singapore"},{code:"SK",name:"Slovakia"},{code:"SI",name:"Slovenia"},{code:"SB",name:"Solomon Islands"},{code:"SO",name:"Somalia"},{code:"ZA",name:"South Africa"},{code:"GS",name:"South Georgia And Sandwich Isl."},{code:"ES",name:"Spain"},{code:"LK",name:"Sri Lanka"},{code:"SD",name:"Sudan"},{code:"SR",name:"Suriname"},{code:"SJ",name:"Svalbard And Jan Mayen"},{code:"SZ",name:"Swaziland"},{code:"SE",name:"Sweden"},{code:"CH",name:"Switzerland"},{code:"SY",name:"Syrian Arab Republic"},{code:"TW",name:"Taiwan"},{code:"TJ",name:"Tajikistan"},{code:"TZ",name:"Tanzania"},{code:"TH",name:"Thailand"},{code:"TL",name:"Timor-Leste"},{code:"TG",name:"Togo"},{code:"TK",name:"Tokelau"},{code:"TO",name:"Tonga"},{code:"TT",name:"Trinidad And Tobago"},{code:"TN",name:"Tunisia"},{code:"TR",name:"Turkey"},{code:"TM",name:"Turkmenistan"},{code:"TC",name:"Turks And Caicos Islands"},{code:"TV",name:"Tuvalu"},{code:"UG",name:"Uganda"},{code:"UA",name:"Ukraine"},{code:"AE",name:"United Arab Emirates"},{code:"GB",name:"United Kingdom"},{code:"US",name:"United States"},{code:"UM",name:"United States Outlying Islands"},{code:"UY",name:"Uruguay"},{code:"UZ",name:"Uzbekistan"},{code:"VU",name:"Vanuatu"},{code:"VE",name:"Venezuela"},{code:"VN",name:"Vietnam"},{code:"VG",name:"Virgin Islands}, British"},{code:"VI",name:"Virgin Islands}, U.S."},{code:"WF",name:"Wallis And Futuna"},{code:"EH",name:"Western Sahara"},{code:"YE",name:"Yemen"},{code:"ZM",name:"Zambia"},{code:"ZW",name:"Zimbabwe"}].map((e=>(0,n.jsx)("option",{value:e.code,children:e.name})))}),(0,n.jsxs)("span",{children:[" and download the specific ",(0,n.jsx)("code",{children:"local_acccess_point"})," file: "]}),(0,n.jsx)("button",{onClick:()=>((a,o)=>{const n=document.createElement("a"),c=new Blob([e],{type:a}),t=URL.createObjectURL(c);n.setAttribute("href",t),n.setAttribute("download",o),n.click()})("application/octet-stream","local_access_point"),disabled:""===e,children:"Download"})]})}const r={title:"Local access points",slug:"/local-access-point"},s=void 0,d={id:"Advanced/networking/local-access-point",title:"Local access points",description:"For some use cases, you may want to create a local WiFi network just for your Pioreactors (this is called a local access point, or a hotspot). Why might you want to do this?",source:"@site/user-guide/30-Advanced/02-networking/06-local-access-point.md",sourceDirName:"30-Advanced/02-networking",slug:"/local-access-point",permalink:"/user-guide/local-access-point",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:6,frontMatter:{title:"Local access points",slug:"/local-access-point"},sidebar:"tutorialSidebar",previous:{title:"Internet sharing between a PC and a Pioreactor",permalink:"/user-guide/internet-sharing"},next:{title:"Networking tools",permalink:"/user-guide/networking"}},l={},m=[{value:"Starting a local access point",id:"starting-a-local-access-point",level:2},{value:"Access the local access point",id:"access-the-local-access-point",level:2},{value:"Connecting more Pioreactors to your local access point",id:"connecting-more-pioreactors-to-your-local-access-point",level:3},{value:"Adding internet access to your local access point",id:"adding-internet-access-to-your-local-access-point",level:2},{value:"Turning off a local access point",id:"turning-off-a-local-access-point",level:2},{value:"Changing SSID name or password for your local access point",id:"changing-ssid-name-or-password-for-your-local-access-point",level:2},{value:"Troubleshooting",id:"troubleshooting",level:2},{value:"My computer can't connect to the local-access-point",id:"my-computer-cant-connect-to-the-local-access-point",level:3},{value:"Do you see the pioreactor network in the list of available wifi networks?",id:"do-you-see-the-pioreactor-network-in-the-list-of-available-wifi-networks",level:4},{value:"Alternatively, do you not see the pioreactor network in the list of available wifi networks?",id:"alternatively-do-you-not-see-the-pioreactor-network-in-the-list-of-available-wifi-networks",level:4},{value:"I'm on the network, but can't load the Pioreactor UI at http://pioreactor.local",id:"im-on-the-network-but-cant-load-the-pioreactor-ui-at-httppioreactorlocal",level:3},{value:"I can't connect a worker to my local access point",id:"i-cant-connect-a-worker-to-my-local-access-point",level:3},{value:"I'm pretty sure I'm at the limit of ~4-8 clients on my access point - what can I do?",id:"im-pretty-sure-im-at-the-limit-of-4-8-clients-on-my-access-point---what-can-i-do",level:3}];function h(e){const a={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,c.a)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(a.p,{children:"For some use cases, you may want to create a local WiFi network just for your Pioreactors (this is called a local access point, or a hotspot). Why might you want to do this?"}),"\n",(0,n.jsxs)(a.ul,{children:["\n",(0,n.jsx)(a.li,{children:"If you want to get started right away, without dealing with exiting WiFi networks."}),"\n",(0,n.jsx)(a.li,{children:"If your usual WiFi network is restrictive (ex: doesn't allow Raspberry Pis, or requires IT support to host them)."}),"\n",(0,n.jsx)(a.li,{children:"If you want to take the Pioreactor, or cluster of Pioreactors, out into the field where there is no network."}),"\n"]}),"\n",(0,n.jsx)(a.p,{children:"The Pioreactor comes with the ability to create its own local access point, which other Pioreactors can connect to. See image below:"}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"Using the Pioreactor to create a local access point",src:o(13726).Z+"",width:"1191",height:"387"})}),"\n",(0,n.jsx)(a.admonition,{type:"info",children:(0,n.jsx)(a.p,{children:"The built-in local access point is meant for small clusters of Pioreactors, and it's range and stability is limited. If you want a proper local access point, we suggest purchasing an inexpensive wifi router and using that (the router does not need to be connected to the internet - it will still create a wifi network you can connect Pioreactors to regardless)."})}),"\n",(0,n.jsx)(a.h2,{id:"starting-a-local-access-point",children:"Starting a local access point"}),"\n",(0,n.jsx)(a.p,{children:"The Pioreactor has the necessary software and hardware to create the local access point. To start the access point:"}),"\n",(0,n.jsxs)(a.ul,{children:["\n",(0,n.jsxs)(a.li,{children:["If starting with a new Pioreactor, during software set up:","\n",(0,n.jsxs)(a.ol,{children:["\n",(0,n.jsxs)(a.li,{children:['Leave the "Configure wireless LAN" unchecked. Continue with the instructions at ',(0,n.jsx)(a.a,{href:"/user-guide/software-set-up#setting-up-your-raspberry-pi",children:"Setting up your Raspberry Pi"}),"."]}),"\n",(0,n.jsxs)(a.li,{children:["After the SD card has been written to, remove the SD card from your computer, and immediately insert it back in. A ",(0,n.jsx)(a.code,{children:"boot"})," (or ",(0,n.jsx)(a.code,{children:"bootfs"}),") device should be present now that is your SD card. If asked to reformat the SD card, select NO."]}),"\n",(0,n.jsxs)(a.li,{children:["\n",(0,n.jsx)(i,{}),"\n"]}),"\n",(0,n.jsxs)(a.li,{children:["Drag/move the downloaded ",(0,n.jsx)(a.code,{children:"local_access_point"})," file to the SD card directory."]}),"\n",(0,n.jsxs)(a.li,{children:["Eject the SD card safely, and continue with instructions at ",(0,n.jsx)(a.a,{href:"/user-guide/software-set-up#setting-up-your-raspberry-pi",children:"Setting up your Raspberry Pi"}),"."]}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(a.li,{children:["If starting from an existing Pioreactor:","\n",(0,n.jsxs)(a.ol,{children:["\n",(0,n.jsx)(a.li,{children:"with the power off remove the SD card from the Pioreactor and insert it into a computer."}),"\n",(0,n.jsxs)(a.li,{children:["\n",(0,n.jsx)(i,{}),"\n"]}),"\n",(0,n.jsxs)(a.li,{children:["Drag/move the downloaded ",(0,n.jsx)(a.code,{children:"local_access_point"})," file to your SD card (called ",(0,n.jsx)(a.code,{children:"boot"})," or ",(0,n.jsx)(a.code,{children:"bootfs"}),")."]}),"\n",(0,n.jsx)(a.li,{children:"Eject the SD card safely, and put back into the Pioreactor."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,n.jsx)(a.h2,{id:"access-the-local-access-point",children:"Access the local access point"}),"\n",(0,n.jsxs)(a.p,{children:["After plugging in the Pioreactor, the local access point will start and you should see a new network called ",(0,n.jsx)(a.code,{children:"pioreactor"}),", with password ",(0,n.jsx)(a.code,{children:"raspberry"}),". You should be able to connect to this new access point with any computer, phone, tablet, etc."]}),"\n",(0,n.jsx)("img",{src:"/img/user-guide/pioreactor_ap.png",width:"325"}),"\n",(0,n.jsxs)(a.p,{children:["Once connected, the usual urls should work: ",(0,n.jsx)(a.a,{href:"http://pioreactor.local",children:"http://pioreactor.local"})," will bring up the Pioreactor interface (having trouble? Not working? Try our troubleshooting steps below."]}),"\n",(0,n.jsx)(a.admonition,{type:"info",children:(0,n.jsxs)(a.p,{children:["Without access to the internet, the Pioreactor will have the wrong internal time. You can change this ",(0,n.jsx)(a.a,{href:"/user-guide/common-questions#how-do-i-change-the-date-or-time-on-the-pioreactor",children:"using this method"})]})}),"\n",(0,n.jsx)(a.h3,{id:"connecting-more-pioreactors-to-your-local-access-point",children:"Connecting more Pioreactors to your local access point"}),"\n",(0,n.jsx)(a.admonition,{type:"info",children:(0,n.jsxs)(a.p,{children:["Raspberry Pi 3B and Raspberry Pi Zero W have trouble connecting to these local access points. Follow instructions ",(0,n.jsx)(a.a,{href:"https://github.com/Pioreactor/pioreactor/blob/992d986881f3a3504a08b781a494b1a6e3b5a0e3/CHANGELOG.md?plain=1#L110C11-L121",children:"here"}),"."]})}),"\n",(0,n.jsxs)(a.p,{children:["Other Pioreactors will need to be reconfigured to connect to this new access point. During set up in the Raspberry Pi Imager, using the ssid / wifi credentials: ",(0,n.jsx)(a.code,{children:"pioreactor"})," and password ",(0,n.jsx)(a.code,{children:"raspberry"})," in the wireless LAN section. ",(0,n.jsxs)(a.strong,{children:["Don't add the ",(0,n.jsx)(a.code,{children:"local_access_point"})," file to these other Pioreactors - you only need to do that once"]}),"."]}),"\n",(0,n.jsxs)(a.p,{children:["The maximum number of machines (Pioreactors and computers) that can be connected to a local access point on a Pioreactor is ~4-8. There is a possibility to add more, see ",(0,n.jsx)(a.a,{href:"https://github.com/Pioreactor/pioreactor/issues/442",children:"issue here"}),"."]}),"\n",(0,n.jsx)(a.p,{children:"This network may not be connected to the internet, so you won't be able to upgrade any software on the Pioreactors. See section below on how to add internet."}),"\n",(0,n.jsx)(a.h2,{id:"adding-internet-access-to-your-local-access-point",children:"Adding internet access to your local access point"}),"\n",(0,n.jsx)(a.p,{children:"If you are hosting the local access point on a Raspberry Pi that has an ethernet port (B models), you can plug this into a router that has access to the internet to provide internet to your entire cluster."}),"\n",(0,n.jsx)(a.p,{children:(0,n.jsx)(a.img,{alt:"Using the Pioreactor to create a local access point, and the is connected to a router",src:o(8026).Z+"",width:"578",height:"387"})}),"\n",(0,n.jsx)(a.h2,{id:"turning-off-a-local-access-point",children:"Turning off a local access point"}),"\n",(0,n.jsxs)(a.p,{children:["After SSH-ing into your Pioreactor, simply delete the ",(0,n.jsx)(a.code,{children:"local_access_point"})," file in the ",(0,n.jsx)(a.code,{children:"/boot/firmware/"})," directory, and reboot."]}),"\n",(0,n.jsx)(a.h2,{id:"changing-ssid-name-or-password-for-your-local-access-point",children:"Changing SSID name or password for your local access point"}),"\n",(0,n.jsxs)(a.p,{children:["In the ",(0,n.jsx)(a.code,{children:"config.ini"}),", the SSID and password are editable under the section ",(0,n.jsx)(a.code,{children:"local_access_point"}),". This requires a power-cycle to take effect."]}),"\n",(0,n.jsx)(a.h2,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,n.jsx)(a.h3,{id:"my-computer-cant-connect-to-the-local-access-point",children:"My computer can't connect to the local-access-point"}),"\n",(0,n.jsxs)(a.h4,{id:"do-you-see-the-pioreactor-network-in-the-list-of-available-wifi-networks",children:["Do you see the ",(0,n.jsx)(a.code,{children:"pioreactor"})," network in the list of available wifi networks?"]}),"\n",(0,n.jsxs)(a.ul,{children:["\n",(0,n.jsx)(a.li,{children:'If presented, use the option "Use security key to connect" (this is an alias for the password).'}),"\n",(0,n.jsx)(a.li,{children:"Try power-cycling your Pioreactor"}),"\n",(0,n.jsxs)(a.li,{children:["The maximum number of machines (Pioreactors and computers) that can be connected to a local access point on a Pioreactor is ~4-8. There is a possibility to add more, see ",(0,n.jsx)(a.a,{href:"https://github.com/Pioreactor/pioreactor/issues/442",children:"issue here"}),"."]}),"\n"]}),"\n",(0,n.jsxs)(a.h4,{id:"alternatively-do-you-not-see-the-pioreactor-network-in-the-list-of-available-wifi-networks",children:["Alternatively, do you ",(0,n.jsx)(a.em,{children:"not"})," see the ",(0,n.jsx)(a.code,{children:"pioreactor"})," network in the list of available wifi networks?"]}),"\n",(0,n.jsxs)(a.ul,{children:["\n",(0,n.jsx)(a.li,{children:"Try power-cycling the Raspberry Pi"}),"\n",(0,n.jsxs)(a.li,{children:["If you unplug the Pioreactor, and place the SD card back into your computer, do you see the ",(0,n.jsx)(a.code,{children:"local_access_point"})," file? If not, try adding the file again, inserting the SD card in the Pioreactor, and restarting the Pioreactor."]}),"\n"]}),"\n",(0,n.jsxs)(a.h3,{id:"im-on-the-network-but-cant-load-the-pioreactor-ui-at-httppioreactorlocal",children:["I'm on the network, but can't load the Pioreactor UI at ",(0,n.jsx)(a.code,{children:"http://pioreactor.local"})]}),"\n",(0,n.jsxs)(a.p,{children:["Try ",(0,n.jsx)(a.code,{children:"http://.local"}),". Still not working? Try ",(0,n.jsx)(a.code,{children:"http://10.42.0.1"}),")"]}),"\n",(0,n.jsx)(a.h3,{id:"i-cant-connect-a-worker-to-my-local-access-point",children:"I can't connect a worker to my local access point"}),"\n",(0,n.jsxs)(a.ul,{children:["\n",(0,n.jsxs)(a.li,{children:["confirm that you are using the right wifi name and password in the Imager (default ",(0,n.jsx)(a.code,{children:"pioreactor"})," and ",(0,n.jsx)(a.code,{children:"raspberry"}),")"]}),"\n",(0,n.jsxs)(a.li,{children:["The maximum number of access point clients (Pioreactors and computers) that can be connected to a local access point on a Pioreactor is ~4-8. There is a possibility to add more, see ",(0,n.jsx)(a.a,{href:"https://github.com/Pioreactor/pioreactor/issues/442",children:"issue here"}),"."]}),"\n"]}),"\n",(0,n.jsx)(a.h3,{id:"im-pretty-sure-im-at-the-limit-of-4-8-clients-on-my-access-point---what-can-i-do",children:"I'm pretty sure I'm at the limit of ~4-8 clients on my access point - what can I do?"}),"\n",(0,n.jsxs)(a.ul,{children:["\n",(0,n.jsx)(a.li,{children:"You can purchase an inexpensive wifi router and use that as the access point. Note that you don't need to connect this router to the internet - it will operate a network regardless."}),"\n",(0,n.jsxs)(a.li,{children:["You can purchase a Wifi USB stick to improve the number clients and range of your local-access-point. For example, the Alfa AWUS036AC (take note to confirm your Raspberry Pi can has the correct USB connection). To check if the device is active, use ",(0,n.jsx)(a.code,{children:"nmcli device"})," and look for a ",(0,n.jsx)(a.code,{children:"wlan1"})," (which represents the USB stick). To move the local access point to this USB stick, use","\n",(0,n.jsx)(a.pre,{children:(0,n.jsx)(a.code,{children:"sudo nmcli connection modify PioreactorAP ifname wlan1\n"})}),"\n"]}),"\n"]})]})}function u(e={}){const{wrapper:a}={...(0,c.a)(),...e.components};return a?(0,n.jsx)(a,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},8026:(e,a,o)=>{o.d(a,{Z:()=>n});const n=o.p+"assets/images/lap_with_internet-ac1e9e680aaeaa368935366c54db0007.png"},13726:(e,a,o)=>{o.d(a,{Z:()=>n});const n=o.p+"assets/images/local_access_point-9455ab0ce2fa6461e80fc732e06e4a0d.png"},11151:(e,a,o)=>{o.d(a,{Z:()=>r,a:()=>i});var n=o(67294);const c={},t=n.createContext(c);function i(e){const a=n.useContext(t);return n.useMemo((function(){return"function"==typeof e?e(a):{...a,...e}}),[a,e])}function r(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(c):e.components||c:i(e.components),n.createElement(t.Provider,{value:a},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d5df4937.4b44201b.js b/assets/js/d5df4937.2d3691a5.js similarity index 64% rename from assets/js/d5df4937.4b44201b.js rename to assets/js/d5df4937.2d3691a5.js index b82cfeb1..f413be21 100644 --- a/assets/js/d5df4937.4b44201b.js +++ b/assets/js/d5df4937.2d3691a5.js @@ -1 +1 @@ -"use strict";(self.webpackChunkpioreactor=self.webpackChunkpioreactor||[]).push([[1179],{1017:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>u,frontMatter:()=>a,metadata:()=>h,toc:()=>d});var r=i(85893),o=i(11151),n=i(3901);const a={title:"Common questions",slug:"/common-questions"},s=void 0,h={id:"common-questions",title:"Common questions",description:"Pioreactor operation",source:"@site/user-guide/99-common-questions.mdx",sourceDirName:".",slug:"/common-questions",permalink:"/user-guide/common-questions",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:99,frontMatter:{title:"Common questions",slug:"/common-questions"},sidebar:"tutorialSidebar",previous:{title:"User interface",permalink:"/user-guide/troubleshooting-ui"}},l={},d=[{value:"Pioreactor operation",id:"pioreactor-operation",level:2},{value:"How can I restart my Pioreactor? Is pulling the power plug out safe?",id:"how-can-i-restart-my-pioreactor-is-pulling-the-power-plug-out-safe",level:3},{value:"Can I still use the Pioreactor software without the hardware?",id:"can-i-still-use-the-pioreactor-software-without-the-hardware",level:3},{value:"Why does the onboard blue LED keep flashing?",id:"why-does-the-onboard-blue-led-keep-flashing",level:3},{value:"What does the onboard button do?",id:"what-does-the-onboard-button-do",level:3},{value:"How do I change the date or time on the Pioreactor?",id:"how-do-i-change-the-date-or-time-on-the-pioreactor",level:3},{value:"Optical density and LEDs",id:"optical-density-and-leds",level:2},{value:"How does optical density work on the Pioreactor?",id:"how-does-optical-density-work-on-the-pioreactor",level:3},{value:"What are the units of Pioreactor's optical density",id:"what-are-the-units-of-pioreactors-optical-density",level:3},{value:"How can I change the frequency (rate) of optical density measurements?",id:"how-can-i-change-the-frequency-rate-of-optical-density-measurements",level:3},{value:"Why does the intensity for LED A turn on & off during an experiment?",id:"why-does-the-intensity-for-led-a-turn-on--off-during-an-experiment",level:3},{value:"Why does my optical density flatten, or even decrease? What is a saturation point?",id:"why-does-my-optical-density-flatten-or-even-decrease-what-is-a-saturation-point",level:3},{value:"What does the effect of the scatter angle have on optical density?",id:"what-does-the-effect-of-the-scatter-angle-have-on-optical-density",level:3},{value:"Can I use my own 5mm LEDs and photodiodes for optical density?",id:"can-i-use-my-own-5mm-leds-and-photodiodes-for-optical-density",level:3},{value:"Is optical density the same as turbidity?",id:"is-optical-density-the-same-as-turbidity",level:3},{value:"Heating and Temperature control",id:"heating-and-temperature-control",level:2},{value:"Why does the Pioreactor only provide a temperature reading every few minutes?",id:"why-does-the-pioreactor-only-provide-a-temperature-reading-every-few-minutes",level:3},{value:"Why does the Pioreactor's heating keep shutting off?",id:"why-does-the-pioreactors-heating-keep-shutting-off",level:3},{value:"How does heating work on the Pioreactor?",id:"how-does-heating-work-on-the-pioreactor",level:3},{value:"Mixing and stirring in the Pioreactor",id:"mixing-and-stirring-in-the-pioreactor",level:2},{value:"How is mixing / stirring performed in the Pioreactor?",id:"how-is-mixing--stirring-performed-in-the-pioreactor",level:3},{value:"Can I use my own stir bar?",id:"can-i-use-my-own-stir-bar",level:3},{value:"The magnets rubs against the plastic screws above them, causing the stirring performance to be degraded / stop. How do I fix this?",id:"the-magnets-rubs-against-the-plastic-screws-above-them-causing-the-stirring-performance-to-be-degraded--stop-how-do-i-fix-this",level:3},{value:"How can I increase the strength of the magnetic force applied to the stirbar?",id:"how-can-i-increase-the-strength-of-the-magnetic-force-applied-to-the-stirbar",level:3},{value:"How can I improve mixing and aeration?",id:"how-can-i-improve-mixing-and-aeration",level:3},{value:"Can I plot the RPM in a chart in the UI?",id:"can-i-plot-the-rpm-in-a-chart-in-the-ui",level:3},{value:"Raspberry Pi Hardware",id:"raspberry-pi-hardware",level:2},{value:"What Raspberry Pi hardware can I use? I see Raspberry Pi 1, 2, 3, 4, 5, A, B, +, Zero - it's confusing!",id:"what-raspberry-pi-hardware-can-i-use-i-see-raspberry-pi-1-2-3-4-5-a-b--zero---its-confusing",level:3},{value:"What microSD cards do you recommend?",id:"what-microsd-cards-do-you-recommend",level:3},{value:"What power supply unit (PSU) do I need?",id:"what-power-supply-unit-psu-do-i-need",level:3},{value:"Do I need any cooling for the Raspberry Pi?",id:"do-i-need-any-cooling-for-the-raspberry-pi",level:3},{value:"Could a Raspberry Pi-compatible board work, like Rock Pi 4?",id:"could-a-raspberry-pi-compatible-board-work-like-rock-pi-4",level:3},{value:"What is the username/password for the Raspberry Pi?",id:"what-is-the-usernamepassword-for-the-raspberry-pi",level:3},{value:"Can I use the desktop interface (with a display) with the Pioreactor?",id:"can-i-use-the-desktop-interface-with-a-display-with-the-pioreactor",level:3},{value:"Dosing",id:"dosing",level:2},{value:"Why does the Media card in the UI not update when I run a dosing command?",id:"why-does-the-media-card-in-the-ui-not-update-when-i-run-a-dosing-command",level:3},{value:"Data storage, access and recovery",id:"data-storage-access-and-recovery",level:2},{value:"Where are logs stored?",id:"where-are-logs-stored",level:3},{value:"How do I access raw experiment data?",id:"how-do-i-access-raw-experiment-data",level:3},{value:"My microSD card is corrupted - what can I do?",id:"my-microsd-card-is-corrupted---what-can-i-do",level:3},{value:"Networking",id:"networking",level:2},{value:"How do I change/edit the network the Pioreactor on?",id:"how-do-i-changeedit-the-network-the-pioreactor-on",level:3},{value:"Can I use Ethernet cable connections instead of Wifi connections?",id:"can-i-use-ethernet-cable-connections-instead-of-wifi-connections",level:3},{value:"How can I determine the Pioreactor's IP address? Or the MAC address?",id:"how-can-i-determine-the-pioreactors-ip-address-or-the-mac-address",level:3},{value:"I'm using a local access point, but I'd like to install plugins, update software, etc.",id:"im-using-a-local-access-point-but-id-like-to-install-plugins-update-software-etc",level:3},{value:"To install a plugin",id:"to-install-a-plugin",level:4},{value:"To upgrade the Pioreactor software",id:"to-upgrade-the-pioreactor-software",level:4},{value:"If I have multiple Pioreactor leaders on my network, what leader does http://pioreactor.local point to?",id:"if-i-have-multiple-pioreactor-leaders-on-my-network-what-leader-does-httppioreactorlocal-point-to",level:3}];function c(e){const t={a:"a",admonition:"admonition",blockquote:"blockquote",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.Z,{toc:d}),"\n",(0,r.jsx)(t.h2,{id:"pioreactor-operation",children:"Pioreactor operation"}),"\n",(0,r.jsx)(t.h3,{id:"how-can-i-restart-my-pioreactor-is-pulling-the-power-plug-out-safe",children:"How can I restart my Pioreactor? Is pulling the power plug out safe?"}),"\n",(0,r.jsx)(t.p,{children:"We suggest using the UI to reboot a Pioreactor:"}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.img,{alt:"Rebooting your pi",src:i(15713).Z+"",width:"3010",height:"1440"})}),"\n",(0,r.jsx)(t.p,{children:"Pulling the plug is usually fine, but try to avoid doing it as it does risk data corruption."}),"\n",(0,r.jsx)(t.h3,{id:"can-i-still-use-the-pioreactor-software-without-the-hardware",children:"Can I still use the Pioreactor software without the hardware?"}),"\n",(0,r.jsxs)(t.p,{children:['Yes - the Pioreactor UI and software will still work. We provide a "leader-only" image that is designed to only host a cluster, and not be an active worker. The leader-only image, ',(0,r.jsx)(t.code,{children:"pioreactor_leader.zip "}),", are available ",(0,r.jsx)(t.a,{href:"https://github.com/Pioreactor/CustoPiZer/releases",children:"here"}),"."]}),"\n",(0,r.jsx)(t.h3,{id:"why-does-the-onboard-blue-led-keep-flashing",children:"Why does the onboard blue LED keep flashing?"}),"\n",(0,r.jsxs)(t.p,{children:["There may be a problem. You can diagnose the problem by ",(0,r.jsx)(t.a,{href:"/user-guide/error-codes",children:"counting the number of flashes observed"}),"."]}),"\n",(0,r.jsx)(t.h3,{id:"what-does-the-onboard-button-do",children:"What does the onboard button do?"}),"\n",(0,r.jsx)(t.p,{children:'The button on the Pioreactor HAT sends a signal to the web UI to display a "hello" message. This is useful to know which Pioreactor in a cluster you are interacting with.'}),"\n",(0,r.jsxs)(t.p,{children:["The button can be ",(0,r.jsx)(t.a,{href:"/developer-guide/hat-button",children:"reprogrammed"}),", too."]}),"\n",(0,r.jsx)(t.h3,{id:"how-do-i-change-the-date-or-time-on-the-pioreactor",children:"How do I change the date or time on the Pioreactor?"}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.a,{href:"/user-guide/accessing-raspberry-pi",children:"SSH"})," into your Pioreactor, and run:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:'sudo date --set "2023-11-02 09:46:50"\n\n'})}),"\n",(0,r.jsx)(t.h2,{id:"optical-density-and-leds",children:"Optical density and LEDs"}),"\n",(0,r.jsx)(t.h3,{id:"how-does-optical-density-work-on-the-pioreactor",children:"How does optical density work on the Pioreactor?"}),"\n",(0,r.jsxs)(t.p,{children:["The Pioreactor uses turbidity to measure optical density (other systems, like spectrophotometers, use attenuation). Specifically, the Pioreactor uses ",(0,r.jsx)(t.em,{children:"scattering"})," of light. The system will shine infrared light into the culture, and measure the amount of light that is scattered off cells. The scattering has a good linear range (see below for more), and higher saturation point than attenuation for cultures of 20ml volume. If you have an instrument that measures OD600 or some other measurement of optical density, and you wish to calibrate to that, the Pioreactor has a routine to perform a calibration and record in the instruments units. See ",(0,r.jsx)(t.a,{href:"/user-guide/calibrate-od600",children:"docs here"}),"."]}),"\n",(0,r.jsx)(t.h3,{id:"what-are-the-units-of-pioreactors-optical-density",children:"What are the units of Pioreactor's optical density"}),"\n",(0,r.jsxs)(t.p,{children:["The ",(0,r.jsx)(t.em,{children:"uncalibrated"})," optical densities reported the UI and recorded in the database are have an arbitrary unit, and are per Pioreactor (so they can't be compared to each other). However, the ",(0,r.jsx)(t.em,{children:"normalized optical density"}),", generated after starting the activity ",(0,r.jsx)(t.strong,{children:"Growth rate"})," in the UI, is comparable, which is why we suggest using it for inferences (especially if you haven't calibrated to some OD600 machine). Read more about our ",(0,r.jsx)(t.a,{href:"https://docs.pioreactor.com/user-guide/od-normal-growth-rate",children:"optical density measurements here"}),"."]}),"\n",(0,r.jsx)(t.h3,{id:"how-can-i-change-the-frequency-rate-of-optical-density-measurements",children:"How can I change the frequency (rate) of optical density measurements?"}),"\n",(0,r.jsxs)(t.p,{children:["In the configuration, you can edit the parameter ",(0,r.jsx)(t.code,{children:"samples_per_second"}),' to adjust the how often the Pioreactor takes an optical density snapshot. Note that this parameter is the inverse of "duration between readings". For example, if you wish to record a measurement every 60 seconds, then ',(0,r.jsx)(t.code,{children:"samples_per_second=0.01666667"})," (which is 1/60)."]}),"\n",(0,r.jsxs)(t.admonition,{type:"tip",children:[(0,r.jsxs)(t.p,{children:["If you put a large gap between readings, like 1 reading / 60 seconds, then we also suggest turning off the ",(0,r.jsx)(t.em,{children:"downsampling"})," on the UI's charts (it's on by default to avoid plotting thousands of points). To do this, ",(0,r.jsx)(t.a,{href:"/user-guide/accessing-raspberry-pi",children:"SSH"})," into your leader, and we'll edit the following files:"]}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"nano /var/www/pioreactorui/contrib/charts/05_od.yaml\n"})}),(0,r.jsxs)(t.p,{children:["And change the field ",(0,r.jsx)(t.code,{children:"down_sample"})," from ",(0,r.jsx)(t.code,{children:"true"})," to ",(0,r.jsx)(t.code,{children:"false"}),". Do the same for the following files:"]}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"nano /var/www/pioreactorui/contrib/charts/01_implied_growth_rate.yaml\n"})}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"nano /var/www/pioreactorui/contrib/charts/04_normalized_od.yaml\n"})})]}),"\n",(0,r.jsx)(t.h3,{id:"why-does-the-intensity-for-led-a-turn-on--off-during-an-experiment",children:"Why does the intensity for LED A turn on & off during an experiment?"}),"\n",(0,r.jsx)(t.p,{children:"You may have noticed that the LED labelled A turns on & off every 5 seconds or so. This is (normally) the channel for the infrared (IR) LED, which is used in the optical density measurements. We only take reading every 5 seconds (the default), we don't need the IR LED on all the time. The Pioreactor will only turn on LED when needed. This preserves the strength of the LED over longer periods of time. For more advanced use cases, it also allows other optical measurements to take place without the IR LED interfering with them."}),"\n",(0,r.jsx)(t.h3,{id:"why-does-my-optical-density-flatten-or-even-decrease-what-is-a-saturation-point",children:"Why does my optical density flatten, or even decrease? What is a saturation point?"}),"\n",(0,r.jsxs)(t.p,{children:["For some experiments, especially when using a scatter angle of 135\xb0, you may notice that the optical density starts to flatten, and even decrease, ",(0,r.jsx)(t.em,{children:"when you know the culture should still be growing"}),". This is not a property of the culture, but occurs because the culture is getting too dense, and light is now being interrupted before it reaches the photodiodes. Prior to this point, called the saturation point, the relationship between culture density and optical density is nearly linear. But after this point, there is a flattening, even negative, relationship between culture density and optical density. For all analysis, we recommend only studying when the culture is in the linear regime. You can mitigate the problem by choosing a smaller scatter angle (like 90\xb0 or 45\xb0), diluting the culture using an automation like the turbidostat, or using a lower concentration of nutrient(s) in the media. Read more about Pioreactor's optical system ",(0,r.jsx)(t.a,{href:"https://pioreactor.com/blogs/pioreactor/estimating-growth-rates-with-kalman-filters",children:"here"}),"."]}),"\n",(0,r.jsx)(t.h3,{id:"what-does-the-effect-of-the-scatter-angle-have-on-optical-density",children:"What does the effect of the scatter angle have on optical density?"}),"\n",(0,r.jsxs)(t.p,{children:["The scatter angle is the angle between the IR LED and a photodiode. This angle can be 45\xb0, 90\xb0, or 135\xb0 (although 180\xb0 is possible, we don't consider it here). What is there to consider when choosing an angle. In general, the trend is shorter angles => less sensitive at low densities, but higher saturation point. By default, we suggest 45\xb0 as a good trade off between sensitivity and saturation. You can mix angles, and the Pioreactor's internal algorithm will still combine them into a single growth rate. Read more about Pioreactor's optical system ",(0,r.jsx)(t.a,{href:"https://pioreactor.com/blogs/pioreactor/estimating-growth-rates-with-kalman-filters",children:"here"}),"."]}),"\n",(0,r.jsx)(t.h3,{id:"can-i-use-my-own-5mm-leds-and-photodiodes-for-optical-density",children:"Can I use my own 5mm LEDs and photodiodes for optical density?"}),"\n",(0,r.jsx)(t.p,{children:"Of course! The only two requirements are that the spectrum of the LED overlaps with the spectrum of the photodiode, and that the LED light won't be absorbed by media/culture, nor damage the media/culture. Thus, the often-used 600nm light source works in the Pioreactor. None of our internal algorithms or analytics are dependent on the wavelength of light chosen."}),"\n",(0,r.jsx)(t.p,{children:"When you are using additional LEDs outside of the optical density LED & photodiode pair, you may worry that your additional LEDs will interfere with the optical density measurement. This won't happen, as we turn off all non-optical density LEDs before taking an optical density measurement."}),"\n",(0,r.jsx)(t.h3,{id:"is-optical-density-the-same-as-turbidity",children:"Is optical density the same as turbidity?"}),"\n",(0,r.jsx)(t.p,{children:"Turbidity is a measure of optical density, like how decibels are a measurement of sound intensity. Similarly, absorbance is a measure of optical density."}),"\n",(0,r.jsx)(t.h2,{id:"heating-and-temperature-control",children:"Heating and Temperature control"}),"\n",(0,r.jsx)(t.h3,{id:"why-does-the-pioreactor-only-provide-a-temperature-reading-every-few-minutes",children:"Why does the Pioreactor only provide a temperature reading every few minutes?"}),"\n",(0,r.jsxs)(t.p,{children:["We made a design choice early on to make preparation as error-free as possible. This involved thinking about sensors being ",(0,r.jsx)(t.em,{children:"in situ"})," (in place), versus the sensors being on the outside of the vial. The temperature sensor in the Pioreactor is outside the vial, which means less chance of contamination, but there's a tradeoff (as you could guess): we have to rely on an estimation algorithm that requires a gew minutes to gather data on. We think this is a fair trade-off, as high frequency temperature readings are not that important in an experiment that lasts 12 hours or more."]}),"\n",(0,r.jsx)(t.h3,{id:"why-does-the-pioreactors-heating-keep-shutting-off",children:"Why does the Pioreactor's heating keep shutting off?"}),"\n",(0,r.jsx)(t.p,{children:"If you find that the Pioreactor's heating is shutting off, typically with an accompanying error and flashing blue light, then likely the temperature is becoming too high for safe handling. We restrict the onboard PCB's temperature to be no higher than 63\u2103. Temperature's higher than this can deform the plastic, and possibly cause burns. If the Pioreactor detects a temperature near or above this value, the software will shut off the heating, and possible the entire Raspberry Pi in extreme cases."}),"\n",(0,r.jsxs)(t.p,{children:["To avoid this occurring, we suggest not setting the target temperature too high - not more than 20\u2103 above ambient temperature. Also, reducing the ",(0,r.jsx)(t.code,{children:"Kd"})," parameter in ",(0,r.jsx)(t.code,{children:"[temperature_automation.stable]"})," section in the config.ini would help."]}),"\n",(0,r.jsx)(t.h3,{id:"how-does-heating-work-on-the-pioreactor",children:"How does heating work on the Pioreactor?"}),"\n",(0,r.jsx)(t.p,{children:"The Pioreactor has an onboard PCB, called the heating PCB, that sits below the glass vial. On the PCB are resistors that convert current from PWM outputs into heat. By varying the duty cycle of the PWM, we vary the amount of energy converted to heat."}),"\n",(0,r.jsx)(t.h2,{id:"mixing-and-stirring-in-the-pioreactor",children:"Mixing and stirring in the Pioreactor"}),"\n",(0,r.jsx)(t.h3,{id:"how-is-mixing--stirring-performed-in-the-pioreactor",children:"How is mixing / stirring performed in the Pioreactor?"}),"\n",(0,r.jsx)(t.p,{children:"Stirring is performed with a micro stir bar inside the vial, controlled by a pair of magnets spinning below the vial. The rotation speed, RPM, of the stir bar can be controlled using the Pioreactor software. This stirring is also how aeration is done."}),"\n",(0,r.jsx)(t.h3,{id:"can-i-use-my-own-stir-bar",children:"Can I use my own stir bar?"}),"\n",(0,r.jsx)(t.p,{children:"Of course! The maximum length of a stir bar is 20mm. Keep the height low as to not interfere with the optics. (The provided stir bar is 3mm high). Try using other stir bar shapes / designs!"}),"\n",(0,r.jsx)(t.h3,{id:"the-magnets-rubs-against-the-plastic-screws-above-them-causing-the-stirring-performance-to-be-degraded--stop-how-do-i-fix-this",children:"The magnets rubs against the plastic screws above them, causing the stirring performance to be degraded / stop. How do I fix this?"}),"\n",(0,r.jsx)(t.p,{children:"Dis-attach the top faceplate. Under the faceplate, slightly unscrew each of the four metal screws. This will add more space between the magnets and the plastic screws."}),"\n",(0,r.jsx)(t.h3,{id:"how-can-i-increase-the-strength-of-the-magnetic-force-applied-to-the-stirbar",children:"How can I increase the strength of the magnetic force applied to the stirbar?"}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"For Pioreactor 20ml v1.0"}),": Try to reduce the distance between the stirring magnets and the stir bar by carefully raising the stirring fan a small amount. Going even further, you can remove the 4mm screws in the bottom of the vial holder (but find another way to secure the PCB), thereby be able to bring the magnets even closer."]}),"\n",(0,r.jsx)(t.h3,{id:"how-can-i-improve-mixing-and-aeration",children:"How can I improve mixing and aeration?"}),"\n",(0,r.jsx)(t.p,{children:"If the standard mixing and aeration with the stir bar is not enough for your application, you can do a few things, (in increasing order of complication, not necessarily effectiveness):"}),"\n",(0,r.jsxs)(t.ol,{children:["\n",(0,r.jsx)(t.li,{children:"If the tubes in the cap are submerged during operation, this is reduce the transfer of air. Pull them up from the top of the cap to keep them out of the liquid. Even more effective: shorten them with scissors."}),"\n",(0,r.jsx)(t.li,{children:"Increase the RPM of the stirring. This will increase the surface area exposed to the air. Be warned though: too high of an RPM will cause either a large enough vortex to interfere with the optical systems, or will causing the stir bar to fall out of sync."}),"\n",(0,r.jsxs)(t.li,{children:["Add a ",(0,r.jsx)(t.a,{href:"https://www.printables.com/model/575292-baffle-for-pioreactor-vial-cap-a/files",children:"baffle"})," to the vial cap. A simple cylinder that rests into the liquid causes disturbance in the rotating liquid that both mixing and aeration are significantly improved. A tube can be removed from the cap, and a autoclavable rod can be inserted such that it enters the media, but won't interfere with the optics."]}),"\n",(0,r.jsx)(t.li,{children:"Adding external aeration to your Pioreactor. In the simplest case, using an air pump."}),"\n"]}),"\n",(0,r.jsx)(t.h3,{id:"can-i-plot-the-rpm-in-a-chart-in-the-ui",children:"Can I plot the RPM in a chart in the UI?"}),"\n",(0,r.jsxs)(t.p,{children:["Yes, follow the instructions ",(0,r.jsx)(t.a,{href:"https://forum.pioreactor.com/t/creating-stirring-rpm-and-pwm-duty-cycle-charts-on-the-ui/339",children:"here"}),"."]}),"\n",(0,r.jsx)(t.h2,{id:"raspberry-pi-hardware",children:"Raspberry Pi Hardware"}),"\n",(0,r.jsx)(t.h3,{id:"what-raspberry-pi-hardware-can-i-use-i-see-raspberry-pi-1-2-3-4-5-a-b--zero---its-confusing",children:"What Raspberry Pi hardware can I use? I see Raspberry Pi 1, 2, 3, 4, 5, A, B, +, Zero - it's confusing!"}),"\n",(0,r.jsx)(t.p,{children:"We've designed the hardware and software to be compatible with most Raspberry Pis that have an onboard Wifi and a 40 pin header. That includes (at the time of writing):"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:"Raspberry Pi 3 Model B & B+"}),"\n",(0,r.jsx)(t.li,{children:"Raspberry Pi 3 Model A+"}),"\n",(0,r.jsx)(t.li,{children:"Raspberry Pi 4 Model B \xb2 \xb3"}),"\n",(0,r.jsx)(t.li,{children:"Raspberry Pi 5 \xb2 \xb3"}),"\n",(0,r.jsx)(t.li,{children:"Raspberry Pi Zero 2 (with headers)"}),"\n"]}),"\n",(0,r.jsxs)(t.p,{children:["Although you can use any above, ",(0,r.jsx)(t.strong,{children:"we like the Raspberry Pi 3 B+, Raspberry Pi 4 B 2GB and Raspberry Pi Zero 2"}),". All have the necessary CPU power and memory for the Pioreactor workload, and are generally easy to source. However, they don't a ethernet connector built-in. So talk to your team about if you need to use ethernet or wifi. If you need ethernet, we like the model RPi 3 B+ or 4 B, or purchase some microUSB-to-ethernet dongles for the RPi Zero 2."]}),"\n",(0,r.jsx)(t.p,{children:"\xb2 You don't need a lot of RAM for the Pioreactor, so we recommend getting the lower RAM RPi if offered a choice. 2GB or less is fine. Also, if you are going to buy a Raspberry Pi 4, you should consider just upgrading for the Raspberry Pi 5 2GB (it's only a few dollars more, and much more performant)."}),"\n",(0,r.jsx)(t.p,{children:"\xb3 These have a USB-C power connector, whereas the other Pis have a microUSB power connector."}),"\n",(0,r.jsx)(t.h3,{id:"what-microsd-cards-do-you-recommend",children:"What microSD cards do you recommend?"}),"\n",(0,r.jsx)(t.p,{children:"At least 16GB. We like 16GB or 32GB SanDisk Edge or Samsung microSD cards for their longevity, but any good quality, class 10 SD card will do."}),"\n",(0,r.jsx)(t.h3,{id:"what-power-supply-unit-psu-do-i-need",children:"What power supply unit (PSU) do I need?"}),"\n",(0,r.jsxs)(t.p,{children:["If you look at the power rating, it should be about 5 V and at least 2.25 A, or above 12 W. We really like the ",(0,r.jsx)(t.a,{href:"https://www.raspberrypi.com/products/#power-supplies-and-cables",children:"official Raspberry Pi PSUs"}),", available at most places you can purchase Raspberry Pis."]}),"\n",(0,r.jsxs)(t.p,{children:["If you need to power multiple Pioreactors, you might consider a single PSU with USB ports ",(0,r.jsx)(t.a,{href:"/user-guide/powering-cluster",children:"detailed here"}),"."]}),"\n",(0,r.jsx)(t.h3,{id:"do-i-need-any-cooling-for-the-raspberry-pi",children:"Do I need any cooling for the Raspberry Pi?"}),"\n",(0,r.jsx)(t.p,{children:"Nope, you shouldn't. However, extra heat sinks are never a bad idea!"}),"\n",(0,r.jsx)(t.h3,{id:"could-a-raspberry-pi-compatible-board-work-like-rock-pi-4",children:"Could a Raspberry Pi-compatible board work, like Rock Pi 4?"}),"\n",(0,r.jsx)(t.p,{children:"Maybe? We haven't tested them, but so long as i) the GPIO pins are identical, and ii) Raspberry Pi OS can be installed, it should work."}),"\n",(0,r.jsx)(t.h3,{id:"what-is-the-usernamepassword-for-the-raspberry-pi",children:"What is the username/password for the Raspberry Pi?"}),"\n",(0,r.jsxs)(t.p,{children:["When setting up your Raspberry Pi with the Pioreactor software, you would have chosen a password. Try the recommended username: ",(0,r.jsx)(t.code,{children:"pioreactor"}),", and password: ",(0,r.jsx)(t.code,{children:"raspberry"}),"."]}),"\n",(0,r.jsx)(t.h3,{id:"can-i-use-the-desktop-interface-with-a-display-with-the-pioreactor",children:"Can I use the desktop interface (with a display) with the Pioreactor?"}),"\n",(0,r.jsx)(t.p,{children:'Not currently. Our software is based of the "headless" operating-system, which doesn\'t have display output.'}),"\n",(0,r.jsx)(t.h2,{id:"dosing",children:"Dosing"}),"\n",(0,r.jsx)(t.h3,{id:"why-does-the-media-card-in-the-ui-not-update-when-i-run-a-dosing-command",children:"Why does the Media card in the UI not update when I run a dosing command?"}),"\n",(0,r.jsxs)(t.p,{children:["The Media card will ",(0,r.jsx)(t.em,{children:"only"})," update when an ",(0,r.jsx)(t.a,{href:"/user-guide/dosing-automations",children:"Dosing Automation"})," is active (even the ",(0,r.jsx)(t.code,{children:"Silent"})," automation). Why is it done this way? Often, you don't want volumes to be recorded there: during cleaning, during testing, etc. Often you only want volumes associated with the experiment to be there."]}),"\n",(0,r.jsx)(t.admonition,{type:"note",children:(0,r.jsxs)(t.p,{children:['All dosing events ares recorded to the database however, and with a record of when the event occurred, and source of action. This data is available in the "Export data" web page, under ',(0,r.jsx)(t.code,{children:"Dosing event log"}),"."]})}),"\n",(0,r.jsx)(t.h2,{id:"data-storage-access-and-recovery",children:"Data storage, access and recovery"}),"\n",(0,r.jsxs)(t.blockquote,{children:["\n",(0,r.jsx)(t.p,{children:"\ud83d\udca1 For any important project, we suggest manually exporting or backing up critical data multiple different places. This doesn't just apply to using the Pioreactor, but is good advice in general."}),"\n"]}),"\n",(0,r.jsx)(t.h3,{id:"where-are-logs-stored",children:"Where are logs stored?"}),"\n",(0,r.jsxs)(t.p,{children:["For the logs that you see in the Log Table in the ",(0,r.jsx)(t.em,{children:"Experiment Overview"})," page, these can be download on the ",(0,r.jsx)(t.em,{children:"Download experiment data"})," page in the Pioreactor web interface. Other logs are also available, including dosing event and algorithm change-logs."]}),"\n",(0,r.jsxs)(t.p,{children:["More granular logs per Pioreactor are available in ",(0,r.jsx)(t.code,{children:"/var/log/pioreactor.log"})," on the Raspberry Pis."]}),"\n",(0,r.jsx)(t.h3,{id:"how-do-i-access-raw-experiment-data",children:"How do I access raw experiment data?"}),"\n",(0,r.jsxs)(t.ol,{children:["\n",(0,r.jsxs)(t.li,{children:["The ",(0,r.jsx)(t.em,{children:"Export data"})," page in the Pioreactor UI provides CSV exports of common datasets from a pre-selected experiment."]}),"\n",(0,r.jsxs)(t.li,{children:["All data eventually lands in a SQLite3 database on the leader Pioreactor, by default located in ",(0,r.jsx)(t.code,{children:"/home/pioreactor/.pioreactor/storage/pioreactor.sqlite"}),". This can be download using a tool like ",(0,r.jsx)(t.code,{children:"scp"}),"."]}),"\n",(0,r.jsxs)(t.li,{children:["To access the SQLite3 database from the command line, try ",(0,r.jsx)(t.code,{children:"pio db"}),"."]}),"\n"]}),"\n",(0,r.jsx)(t.h3,{id:"my-microsd-card-is-corrupted---what-can-i-do",children:"My microSD card is corrupted - what can I do?"}),"\n",(0,r.jsx)(t.p,{children:"Unfortunately, the microSD card becoming corrupted or damaged is an infrequent but possible risk with using Raspberry Pis."}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["If the microSD card was inside a non-leader Pioreactor, it's best to try to reformat the microSD card and start fresh (i.e. ",(0,r.jsx)(t.a,{href:"/user-guide/software-set-up#adding-workers-to-your-cluster",children:"reinstall the Pioreactor software and reintroduce it to the cluster"}),"). This is usually okay as no critical data is stored locally in workers, only log files and hardware calibrations will be lost."]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["If the microSD was inside the leader Raspberry Pi, this is a bigger problem. Likely any running experiment will have to be restarted. Fortunately, if you have more than one Pioreactor in your cluster, then the leader's SQLite database has been periodically backing itself up to other Pioreactors in the cluster every few days. Using the command line, check other Pioreactors' ",(0,r.jsx)(t.code,{children:"/home/pioreactor/.pioreactor/storage"})," directory for the ",(0,r.jsx)(t.em,{children:"latest"})," backup named ",(0,r.jsx)(t.code,{children:"pioreactor.sqlite.backup"})," (should be from within the past few days hours). You can use this database to restart a new leader."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"networking",children:"Networking"}),"\n",(0,r.jsx)(t.h3,{id:"how-do-i-changeedit-the-network-the-pioreactor-on",children:"How do I change/edit the network the Pioreactor on?"}),"\n",(0,r.jsxs)(t.p,{children:["See documentation on networking ",(0,r.jsx)(t.a,{href:"/user-guide/networking#general-networking-tools",children:"here"}),"."]}),"\n",(0,r.jsx)(t.h3,{id:"can-i-use-ethernet-cable-connections-instead-of-wifi-connections",children:"Can I use Ethernet cable connections instead of Wifi connections?"}),"\n",(0,r.jsxs)(t.p,{children:["Yes, so long as the Raspberry Pi's are connected to the same network and discoverable, this should work. Even mixing Ethernet and Wifi is fine. You can read more about networking Pioreactors ",(0,r.jsx)(t.a,{href:"/user-guide/networking",children:"here"}),"."]}),"\n",(0,r.jsx)(t.h3,{id:"how-can-i-determine-the-pioreactors-ip-address-or-the-mac-address",children:"How can I determine the Pioreactor's IP address? Or the MAC address?"}),"\n",(0,r.jsx)(t.p,{children:"Depending on your access to the Pioreactor, there are a few ways:"}),"\n",(0,r.jsxs)(t.ol,{children:["\n",(0,r.jsx)(t.li,{children:"In the UI's Inventory page."}),"\n",(0,r.jsxs)(t.li,{children:["If you can't access the Pioreactor's UI or SSH in: the software will write the IP address to the ",(0,r.jsx)(t.code,{children:"/boot"})," directory on the SD card. After the Pioreactor's blue LED has blinked, you can unplug the Pioreactor, remove the SD card, and place the SD card in another computer. Navigate to the card, and in the directory you should see a file called ",(0,r.jsx)(t.code,{children:"ip"}),". Open this file, and the IP address should be there. Place the SD card back into the Pioreactor and plug it back in."]}),"\n"]}),"\n",(0,r.jsx)(t.h3,{id:"im-using-a-local-access-point-but-id-like-to-install-plugins-update-software-etc",children:"I'm using a local access point, but I'd like to install plugins, update software, etc."}),"\n",(0,r.jsx)(t.h4,{id:"to-install-a-plugin",children:"To install a plugin"}),"\n",(0,r.jsxs)(t.p,{children:["On a computer that is connected to the internet, download the ",(0,r.jsx)(t.code,{children:".whl"})," file from the plugins webpage on PyPI. Then, connect that computer to your Pioreactor's local access point's network. To each Pioreactor you wish to install the plugin on, transfer the ",(0,r.jsx)(t.code,{children:".whl"})," file to the Pioreactor (using SFTP or FTP). Then, run ",(0,r.jsx)(t.code,{children:"pio plugins install --source "})]}),"\n",(0,r.jsx)(t.h4,{id:"to-upgrade-the-pioreactor-software",children:"To upgrade the Pioreactor software"}),"\n",(0,r.jsxs)(t.p,{children:["See steps ",(0,r.jsx)(t.a,{href:"/user-guide/updating-software#method-2-update-using-a-zip-file-and-the-ui",children:"here"}),"."]}),"\n",(0,r.jsxs)(t.h3,{id:"if-i-have-multiple-pioreactor-leaders-on-my-network-what-leader-does-httppioreactorlocal-point-to",children:["If I have multiple Pioreactor leaders on my network, what leader does ",(0,r.jsx)(t.code,{children:"http://pioreactor.local"})," point to?"]}),"\n",(0,r.jsxs)(t.p,{children:["If there are multiple leaders on the same network, then each will override the other's ",(0,r.jsx)(t.code,{children:"pioreactor.local"})," alias, and the alias will be unreliable. You can either access the leaders by their hostnames: ",(0,r.jsx)(t.code,{children:"http://.local"}),", or you can change the alias in the config.ini, too, by editing ",(0,r.jsx)(t.code,{children:"domain_alias"})," under section ",(0,r.jsx)(t.code,{children:"[ui]"})," (changing this requires a restart of the machine)."]})]})}function u(e={}){const{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},3901:(e,t,i)=>{i.d(t,{Z:()=>a});i(67294);var r=i(93743);const o={tableOfContentsInline:"tableOfContentsInline_prmo"};var n=i(85893);function a(e){let{toc:t,minHeadingLevel:i,maxHeadingLevel:a}=e;return(0,n.jsx)("div",{className:o.tableOfContentsInline,children:(0,n.jsx)(r.Z,{toc:t,minHeadingLevel:i,maxHeadingLevel:a,className:"table-of-contents",linkClassName:null})})}},93743:(e,t,i)=>{i.d(t,{Z:()=>g});var r=i(67294),o=i(86668);function n(e){const t=e.map((e=>({...e,parentIndex:-1,children:[]}))),i=Array(7).fill(-1);t.forEach(((e,t)=>{const r=i.slice(2,e.level);e.parentIndex=Math.max(...r),i[e.level]=t}));const r=[];return t.forEach((e=>{const{parentIndex:i,...o}=e;i>=0?t[i].children.push(o):r.push(o)})),r}function a(e){let{toc:t,minHeadingLevel:i,maxHeadingLevel:r}=e;return t.flatMap((e=>{const t=a({toc:e.children,minHeadingLevel:i,maxHeadingLevel:r});return function(e){return e.level>=i&&e.level<=r}(e)?[{...e,children:t}]:t}))}function s(e){const t=e.getBoundingClientRect();return t.top===t.bottom?s(e.parentNode):t}function h(e,t){let{anchorTopOffset:i}=t;const r=e.find((e=>s(e).top>=i));if(r){return function(e){return e.top>0&&e.bottom{e.current=t?0:document.querySelector(".navbar").clientHeight}),[t]),e}function d(e){const t=(0,r.useRef)(void 0),i=l();(0,r.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:r,linkActiveClassName:o,minHeadingLevel:n,maxHeadingLevel:a}=e;function s(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(r),s=function(e){let{minHeadingLevel:t,maxHeadingLevel:i}=e;const r=[];for(let o=t;o<=i;o+=1)r.push(`h${o}.anchor`);return Array.from(document.querySelectorAll(r.join()))}({minHeadingLevel:n,maxHeadingLevel:a}),l=h(s,{anchorTopOffset:i.current}),d=e.find((e=>l&&l.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,i){i?(t.current&&t.current!==e&&t.current.classList.remove(o),e.classList.add(o),t.current=e):e.classList.remove(o)}(e,e===d)}))}return document.addEventListener("scroll",s),document.addEventListener("resize",s),s(),()=>{document.removeEventListener("scroll",s),document.removeEventListener("resize",s)}}),[e,i])}var c=i(39960),u=i(85893);function p(e){let{toc:t,className:i,linkClassName:r,isChild:o}=e;return t.length?(0,u.jsx)("ul",{className:o?void 0:i,children:t.map((e=>(0,u.jsxs)("li",{children:[(0,u.jsx)(c.Z,{to:`#${e.id}`,className:r??void 0,dangerouslySetInnerHTML:{__html:e.value}}),(0,u.jsx)(p,{isChild:!0,toc:e.children,className:i,linkClassName:r})]},e.id)))}):null}const m=r.memo(p);function g(e){let{toc:t,className:i="table-of-contents table-of-contents__left-border",linkClassName:s="table-of-contents__link",linkActiveClassName:h,minHeadingLevel:l,maxHeadingLevel:c,...p}=e;const g=(0,o.L)(),f=l??g.tableOfContents.minHeadingLevel,w=c??g.tableOfContents.maxHeadingLevel,y=function(e){let{toc:t,minHeadingLevel:i,maxHeadingLevel:o}=e;return(0,r.useMemo)((()=>a({toc:n(t),minHeadingLevel:i,maxHeadingLevel:o})),[t,i,o])}({toc:t,minHeadingLevel:f,maxHeadingLevel:w});return d((0,r.useMemo)((()=>{if(s&&h)return{linkClassName:s,linkActiveClassName:h,minHeadingLevel:f,maxHeadingLevel:w}}),[s,h,f,w])),(0,u.jsx)(m,{toc:y,className:i,linkClassName:s,...p})}},15713:(e,t,i)=>{i.d(t,{Z:()=>r});const r=i.p+"assets/images/reboot-76282e6704cc04bdd5fb187efb1986d1.png"},11151:(e,t,i)=>{i.d(t,{Z:()=>s,a:()=>a});var r=i(67294);const o={},n=r.createContext(o);function a(e){const t=r.useContext(n);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),r.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkpioreactor=self.webpackChunkpioreactor||[]).push([[1179],{1017:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>u,frontMatter:()=>a,metadata:()=>h,toc:()=>d});var r=i(85893),o=i(11151),n=i(3901);const a={title:"Common questions",slug:"/common-questions"},s=void 0,h={id:"common-questions",title:"Common questions",description:"Pioreactor operation",source:"@site/user-guide/99-common-questions.mdx",sourceDirName:".",slug:"/common-questions",permalink:"/user-guide/common-questions",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:99,frontMatter:{title:"Common questions",slug:"/common-questions"},sidebar:"tutorialSidebar",previous:{title:"User interface",permalink:"/user-guide/troubleshooting-ui"}},l={},d=[{value:"Pioreactor operation",id:"pioreactor-operation",level:2},{value:"How can I restart my Pioreactor? Is pulling the power plug out safe?",id:"how-can-i-restart-my-pioreactor-is-pulling-the-power-plug-out-safe",level:3},{value:"Can I still use the Pioreactor software without the hardware?",id:"can-i-still-use-the-pioreactor-software-without-the-hardware",level:3},{value:"Why does the onboard blue LED keep flashing?",id:"why-does-the-onboard-blue-led-keep-flashing",level:3},{value:"What does the onboard button do?",id:"what-does-the-onboard-button-do",level:3},{value:"How do I change the date or time on the Pioreactor?",id:"how-do-i-change-the-date-or-time-on-the-pioreactor",level:3},{value:"Optical density and LEDs",id:"optical-density-and-leds",level:2},{value:"How does optical density work on the Pioreactor?",id:"how-does-optical-density-work-on-the-pioreactor",level:3},{value:"What are the units of Pioreactor's optical density",id:"what-are-the-units-of-pioreactors-optical-density",level:3},{value:"How can I change the frequency (rate) of optical density measurements?",id:"how-can-i-change-the-frequency-rate-of-optical-density-measurements",level:3},{value:"Why does the intensity for LED A turn on & off during an experiment?",id:"why-does-the-intensity-for-led-a-turn-on--off-during-an-experiment",level:3},{value:"Why does my optical density flatten, or even decrease? What is a saturation point?",id:"why-does-my-optical-density-flatten-or-even-decrease-what-is-a-saturation-point",level:3},{value:"What does the effect of the scatter angle have on optical density?",id:"what-does-the-effect-of-the-scatter-angle-have-on-optical-density",level:3},{value:"Can I use my own 5mm LEDs and photodiodes for optical density?",id:"can-i-use-my-own-5mm-leds-and-photodiodes-for-optical-density",level:3},{value:"Is optical density the same as turbidity?",id:"is-optical-density-the-same-as-turbidity",level:3},{value:"Heating and Temperature control",id:"heating-and-temperature-control",level:2},{value:"Why does the Pioreactor only provide a temperature reading every few minutes?",id:"why-does-the-pioreactor-only-provide-a-temperature-reading-every-few-minutes",level:3},{value:"Why does the Pioreactor's heating keep shutting off?",id:"why-does-the-pioreactors-heating-keep-shutting-off",level:3},{value:"How does heating work on the Pioreactor?",id:"how-does-heating-work-on-the-pioreactor",level:3},{value:"Mixing and stirring in the Pioreactor",id:"mixing-and-stirring-in-the-pioreactor",level:2},{value:"How is mixing / stirring performed in the Pioreactor?",id:"how-is-mixing--stirring-performed-in-the-pioreactor",level:3},{value:"Can I use my own stir bar?",id:"can-i-use-my-own-stir-bar",level:3},{value:"The magnets rubs against the plastic screws above them, causing the stirring performance to be degraded / stop. How do I fix this?",id:"the-magnets-rubs-against-the-plastic-screws-above-them-causing-the-stirring-performance-to-be-degraded--stop-how-do-i-fix-this",level:3},{value:"How can I increase the strength of the magnetic force applied to the stirbar?",id:"how-can-i-increase-the-strength-of-the-magnetic-force-applied-to-the-stirbar",level:3},{value:"How can I improve mixing and aeration?",id:"how-can-i-improve-mixing-and-aeration",level:3},{value:"Can I plot the RPM in a chart in the UI?",id:"can-i-plot-the-rpm-in-a-chart-in-the-ui",level:3},{value:"Raspberry Pi Hardware",id:"raspberry-pi-hardware",level:2},{value:"What Raspberry Pi hardware can I use? I see Raspberry Pi 1, 2, 3, 4, 5, A, B, +, Zero - it's confusing!",id:"what-raspberry-pi-hardware-can-i-use-i-see-raspberry-pi-1-2-3-4-5-a-b--zero---its-confusing",level:3},{value:"What microSD cards do you recommend?",id:"what-microsd-cards-do-you-recommend",level:3},{value:"What power supply unit (PSU) do I need?",id:"what-power-supply-unit-psu-do-i-need",level:3},{value:"Do I need any cooling for the Raspberry Pi?",id:"do-i-need-any-cooling-for-the-raspberry-pi",level:3},{value:"Could a Raspberry Pi-compatible board work, like Rock Pi 4?",id:"could-a-raspberry-pi-compatible-board-work-like-rock-pi-4",level:3},{value:"What is the username/password for the Raspberry Pi?",id:"what-is-the-usernamepassword-for-the-raspberry-pi",level:3},{value:"Can I use the desktop interface (with a display) with the Pioreactor?",id:"can-i-use-the-desktop-interface-with-a-display-with-the-pioreactor",level:3},{value:"Dosing",id:"dosing",level:2},{value:"Why does the Media card in the UI not update when I run a dosing command?",id:"why-does-the-media-card-in-the-ui-not-update-when-i-run-a-dosing-command",level:3},{value:"Data storage, access and recovery",id:"data-storage-access-and-recovery",level:2},{value:"Where are logs stored?",id:"where-are-logs-stored",level:3},{value:"How do I access raw experiment data?",id:"how-do-i-access-raw-experiment-data",level:3},{value:"My microSD card is corrupted - what can I do?",id:"my-microsd-card-is-corrupted---what-can-i-do",level:3},{value:"Networking",id:"networking",level:2},{value:"How do I change/edit the network the Pioreactor on?",id:"how-do-i-changeedit-the-network-the-pioreactor-on",level:3},{value:"Can I use Ethernet cable connections instead of Wifi connections?",id:"can-i-use-ethernet-cable-connections-instead-of-wifi-connections",level:3},{value:"How can I determine the Pioreactor's IP address? Or the MAC address?",id:"how-can-i-determine-the-pioreactors-ip-address-or-the-mac-address",level:3},{value:"I'm using a local access point, but I'd like to install plugins, update software, etc.",id:"im-using-a-local-access-point-but-id-like-to-install-plugins-update-software-etc",level:3},{value:"To install a plugin",id:"to-install-a-plugin",level:4},{value:"To upgrade the Pioreactor software",id:"to-upgrade-the-pioreactor-software",level:4},{value:"If I have multiple Pioreactor leaders on my network, what leader does http://pioreactor.local point to?",id:"if-i-have-multiple-pioreactor-leaders-on-my-network-what-leader-does-httppioreactorlocal-point-to",level:3}];function c(e){const t={a:"a",admonition:"admonition",blockquote:"blockquote",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.Z,{toc:d}),"\n",(0,r.jsx)(t.h2,{id:"pioreactor-operation",children:"Pioreactor operation"}),"\n",(0,r.jsx)(t.h3,{id:"how-can-i-restart-my-pioreactor-is-pulling-the-power-plug-out-safe",children:"How can I restart my Pioreactor? Is pulling the power plug out safe?"}),"\n",(0,r.jsx)(t.p,{children:"We suggest using the UI to reboot a Pioreactor:"}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.img,{alt:"Rebooting your pi",src:i(15713).Z+"",width:"3010",height:"1440"})}),"\n",(0,r.jsx)(t.p,{children:"Pulling the plug is usually fine, but try to avoid doing it as it does risk data corruption."}),"\n",(0,r.jsx)(t.h3,{id:"can-i-still-use-the-pioreactor-software-without-the-hardware",children:"Can I still use the Pioreactor software without the hardware?"}),"\n",(0,r.jsxs)(t.p,{children:['Yes - the Pioreactor UI and software will still work. We provide a "leader-only" image that is designed to only host a cluster, and not be an active worker. The leader-only image, ',(0,r.jsx)(t.code,{children:"pioreactor_leader.zip "}),", are available ",(0,r.jsx)(t.a,{href:"https://github.com/Pioreactor/CustoPiZer/releases",children:"here"}),"."]}),"\n",(0,r.jsx)(t.h3,{id:"why-does-the-onboard-blue-led-keep-flashing",children:"Why does the onboard blue LED keep flashing?"}),"\n",(0,r.jsxs)(t.p,{children:["There may be a problem. You can diagnose the problem by ",(0,r.jsx)(t.a,{href:"/user-guide/error-codes",children:"counting the number of flashes observed"}),"."]}),"\n",(0,r.jsx)(t.h3,{id:"what-does-the-onboard-button-do",children:"What does the onboard button do?"}),"\n",(0,r.jsx)(t.p,{children:'The button on the Pioreactor HAT sends a signal to the web UI to display a "hello" message. This is useful to know which Pioreactor in a cluster you are interacting with.'}),"\n",(0,r.jsxs)(t.p,{children:["The button can be ",(0,r.jsx)(t.a,{href:"/developer-guide/hat-button",children:"reprogrammed"}),", too."]}),"\n",(0,r.jsx)(t.h3,{id:"how-do-i-change-the-date-or-time-on-the-pioreactor",children:"How do I change the date or time on the Pioreactor?"}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.a,{href:"/user-guide/accessing-raspberry-pi",children:"SSH"})," into your Pioreactor, and run:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:'sudo date --set "2023-11-02 09:46:50"\n\n'})}),"\n",(0,r.jsx)(t.h2,{id:"optical-density-and-leds",children:"Optical density and LEDs"}),"\n",(0,r.jsx)(t.h3,{id:"how-does-optical-density-work-on-the-pioreactor",children:"How does optical density work on the Pioreactor?"}),"\n",(0,r.jsxs)(t.p,{children:["The Pioreactor uses turbidity to measure optical density (other systems, like spectrophotometers, use attenuation). Specifically, the Pioreactor uses ",(0,r.jsx)(t.em,{children:"scattering"})," of light. The system will shine infrared light into the culture, and measure the amount of light that is scattered off cells. The scattering has a good linear range (see below for more), and higher saturation point than attenuation for cultures of 20ml volume. If you have an instrument that measures OD600 or some other measurement of optical density, and you wish to calibrate to that, the Pioreactor has a routine to perform a calibration and record in the instruments units. See ",(0,r.jsx)(t.a,{href:"/user-guide/calibrate-od600",children:"docs here"}),"."]}),"\n",(0,r.jsx)(t.h3,{id:"what-are-the-units-of-pioreactors-optical-density",children:"What are the units of Pioreactor's optical density"}),"\n",(0,r.jsxs)(t.p,{children:["The ",(0,r.jsx)(t.em,{children:"uncalibrated"})," optical densities reported the UI and recorded in the database are have an arbitrary unit, and are per Pioreactor (so they can't be compared to each other). However, the ",(0,r.jsx)(t.em,{children:"normalized optical density"}),", generated after starting the activity ",(0,r.jsx)(t.strong,{children:"Growth rate"})," in the UI, is comparable, which is why we suggest using it for inferences (especially if you haven't calibrated to some OD600 machine). Read more about our ",(0,r.jsx)(t.a,{href:"https://docs.pioreactor.com/user-guide/od-normal-growth-rate",children:"optical density measurements here"}),"."]}),"\n",(0,r.jsx)(t.h3,{id:"how-can-i-change-the-frequency-rate-of-optical-density-measurements",children:"How can I change the frequency (rate) of optical density measurements?"}),"\n",(0,r.jsxs)(t.p,{children:["In the configuration, you can edit the parameter ",(0,r.jsx)(t.code,{children:"samples_per_second"}),' to adjust the how often the Pioreactor takes an optical density snapshot. Note that this parameter is the inverse of "duration between readings". For example, if you wish to record a measurement every 60 seconds, then ',(0,r.jsx)(t.code,{children:"samples_per_second=0.01666667"})," (which is 1/60)."]}),"\n",(0,r.jsxs)(t.admonition,{type:"tip",children:[(0,r.jsxs)(t.p,{children:["If you put a large gap between readings, like 1 reading / 60 seconds, then we also suggest turning off the ",(0,r.jsx)(t.em,{children:"downsampling"})," on the UI's charts (it's on by default to avoid plotting thousands of points). To do this, ",(0,r.jsx)(t.a,{href:"/user-guide/accessing-raspberry-pi",children:"SSH"})," into your leader, and we'll edit the following files:"]}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"nano /var/www/pioreactorui/contrib/charts/05_od.yaml\n"})}),(0,r.jsxs)(t.p,{children:["And change the field ",(0,r.jsx)(t.code,{children:"down_sample"})," from ",(0,r.jsx)(t.code,{children:"true"})," to ",(0,r.jsx)(t.code,{children:"false"}),". Do the same for the following files:"]}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"nano /var/www/pioreactorui/contrib/charts/01_implied_growth_rate.yaml\n"})}),(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"nano /var/www/pioreactorui/contrib/charts/04_normalized_od.yaml\n"})})]}),"\n",(0,r.jsx)(t.h3,{id:"why-does-the-intensity-for-led-a-turn-on--off-during-an-experiment",children:"Why does the intensity for LED A turn on & off during an experiment?"}),"\n",(0,r.jsx)(t.p,{children:"You may have noticed that the LED labelled A turns on & off every 5 seconds or so. This is (normally) the channel for the infrared (IR) LED, which is used in the optical density measurements. We only take reading every 5 seconds (the default), we don't need the IR LED on all the time. The Pioreactor will only turn on LED when needed. This preserves the strength of the LED over longer periods of time. For more advanced use cases, it also allows other optical measurements to take place without the IR LED interfering with them."}),"\n",(0,r.jsx)(t.h3,{id:"why-does-my-optical-density-flatten-or-even-decrease-what-is-a-saturation-point",children:"Why does my optical density flatten, or even decrease? What is a saturation point?"}),"\n",(0,r.jsxs)(t.p,{children:["For some experiments, especially when using a scatter angle of 135\xb0, you may notice that the optical density starts to flatten, and even decrease, ",(0,r.jsx)(t.em,{children:"when you know the culture should still be growing"}),". This is not a property of the culture, but occurs because the culture is getting too dense, and light is now being interrupted before it reaches the photodiodes. Prior to this point, called the saturation point, the relationship between culture density and optical density is nearly linear. But after this point, there is a flattening, even negative, relationship between culture density and optical density. For all analysis, we recommend only studying when the culture is in the linear regime. You can mitigate the problem by choosing a smaller scatter angle (like 90\xb0 or 45\xb0), diluting the culture using an automation like the turbidostat, or using a lower concentration of nutrient(s) in the media. Read more about Pioreactor's optical system ",(0,r.jsx)(t.a,{href:"https://pioreactor.com/blogs/pioreactor/estimating-growth-rates-with-kalman-filters",children:"here"}),"."]}),"\n",(0,r.jsx)(t.h3,{id:"what-does-the-effect-of-the-scatter-angle-have-on-optical-density",children:"What does the effect of the scatter angle have on optical density?"}),"\n",(0,r.jsxs)(t.p,{children:["The scatter angle is the angle between the IR LED and a photodiode. This angle can be 45\xb0, 90\xb0, or 135\xb0 (although 180\xb0 is possible, we don't consider it here). What is there to consider when choosing an angle. In general, the trend is shorter angles => less sensitive at low densities, but higher saturation point. By default, we suggest 45\xb0 as a good trade off between sensitivity and saturation. You can mix angles, and the Pioreactor's internal algorithm will still combine them into a single growth rate. Read more about Pioreactor's optical system ",(0,r.jsx)(t.a,{href:"https://pioreactor.com/blogs/pioreactor/estimating-growth-rates-with-kalman-filters",children:"here"}),"."]}),"\n",(0,r.jsx)(t.h3,{id:"can-i-use-my-own-5mm-leds-and-photodiodes-for-optical-density",children:"Can I use my own 5mm LEDs and photodiodes for optical density?"}),"\n",(0,r.jsx)(t.p,{children:"Of course! The only two requirements are that the spectrum of the LED overlaps with the spectrum of the photodiode, and that the LED light won't be absorbed by media/culture, nor damage the media/culture. Thus, the often-used 600nm light source works in the Pioreactor. None of our internal algorithms or analytics are dependent on the wavelength of light chosen."}),"\n",(0,r.jsx)(t.p,{children:"When you are using additional LEDs outside of the optical density LED & photodiode pair, you may worry that your additional LEDs will interfere with the optical density measurement. This won't happen, as we turn off all non-optical density LEDs before taking an optical density measurement."}),"\n",(0,r.jsx)(t.h3,{id:"is-optical-density-the-same-as-turbidity",children:"Is optical density the same as turbidity?"}),"\n",(0,r.jsx)(t.p,{children:"Turbidity is a measure of optical density, like how decibels are a measurement of sound intensity. Similarly, absorbance is a measure of optical density."}),"\n",(0,r.jsx)(t.h2,{id:"heating-and-temperature-control",children:"Heating and Temperature control"}),"\n",(0,r.jsx)(t.h3,{id:"why-does-the-pioreactor-only-provide-a-temperature-reading-every-few-minutes",children:"Why does the Pioreactor only provide a temperature reading every few minutes?"}),"\n",(0,r.jsxs)(t.p,{children:["We made a design choice early on to make preparation as error-free as possible. This involved thinking about sensors being ",(0,r.jsx)(t.em,{children:"in situ"})," (in place), versus the sensors being on the outside of the vial. The temperature sensor in the Pioreactor is outside the vial, which means less chance of contamination, but there's a tradeoff (as you could guess): we have to rely on an estimation algorithm that requires a gew minutes to gather data on. We think this is a fair trade-off, as high frequency temperature readings are not that important in an experiment that lasts 12 hours or more."]}),"\n",(0,r.jsx)(t.h3,{id:"why-does-the-pioreactors-heating-keep-shutting-off",children:"Why does the Pioreactor's heating keep shutting off?"}),"\n",(0,r.jsx)(t.p,{children:"If you find that the Pioreactor's heating is shutting off, typically with an accompanying error and flashing blue light, then likely the temperature is becoming too high for safe handling. We restrict the onboard PCB's temperature to be no higher than 63\u2103. Temperature's higher than this can deform the plastic, and possibly cause burns. If the Pioreactor detects a temperature near or above this value, the software will shut off the heating, and possible the entire Raspberry Pi in extreme cases."}),"\n",(0,r.jsxs)(t.p,{children:["To avoid this occurring, we suggest not setting the target temperature too high - not more than 20\u2103 above ambient temperature. Also, reducing the ",(0,r.jsx)(t.code,{children:"Kd"})," parameter in ",(0,r.jsx)(t.code,{children:"[temperature_automation.stable]"})," section in the config.ini would help."]}),"\n",(0,r.jsx)(t.h3,{id:"how-does-heating-work-on-the-pioreactor",children:"How does heating work on the Pioreactor?"}),"\n",(0,r.jsx)(t.p,{children:"The Pioreactor has an onboard PCB, called the heating PCB, that sits below the glass vial. On the PCB are resistors that convert current from PWM outputs into heat. By varying the duty cycle of the PWM, we vary the amount of energy converted to heat."}),"\n",(0,r.jsx)(t.h2,{id:"mixing-and-stirring-in-the-pioreactor",children:"Mixing and stirring in the Pioreactor"}),"\n",(0,r.jsx)(t.h3,{id:"how-is-mixing--stirring-performed-in-the-pioreactor",children:"How is mixing / stirring performed in the Pioreactor?"}),"\n",(0,r.jsx)(t.p,{children:"Stirring is performed with a micro stir bar inside the vial, controlled by a pair of magnets spinning below the vial. The rotation speed, RPM, of the stir bar can be controlled using the Pioreactor software. This stirring is also how aeration is done."}),"\n",(0,r.jsx)(t.h3,{id:"can-i-use-my-own-stir-bar",children:"Can I use my own stir bar?"}),"\n",(0,r.jsx)(t.p,{children:"Of course! The maximum length of a stir bar is 20mm. Keep the height low as to not interfere with the optics. (The provided stir bar is 3mm high). Try using other stir bar shapes / designs!"}),"\n",(0,r.jsx)(t.h3,{id:"the-magnets-rubs-against-the-plastic-screws-above-them-causing-the-stirring-performance-to-be-degraded--stop-how-do-i-fix-this",children:"The magnets rubs against the plastic screws above them, causing the stirring performance to be degraded / stop. How do I fix this?"}),"\n",(0,r.jsx)(t.p,{children:"Dis-attach the top faceplate. Under the faceplate, slightly unscrew each of the four metal screws. This will add more space between the magnets and the plastic screws."}),"\n",(0,r.jsx)(t.h3,{id:"how-can-i-increase-the-strength-of-the-magnetic-force-applied-to-the-stirbar",children:"How can I increase the strength of the magnetic force applied to the stirbar?"}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"For Pioreactor 20ml v1.0"}),": Try to reduce the distance between the stirring magnets and the stir bar by carefully raising the stirring fan a small amount. Going even further, you can remove the 4mm screws in the bottom of the vial holder (but find another way to secure the PCB), thereby be able to bring the magnets even closer."]}),"\n",(0,r.jsx)(t.h3,{id:"how-can-i-improve-mixing-and-aeration",children:"How can I improve mixing and aeration?"}),"\n",(0,r.jsx)(t.p,{children:"If the standard mixing and aeration with the stir bar is not enough for your application, you can do a few things, (in increasing order of complication, not necessarily effectiveness):"}),"\n",(0,r.jsxs)(t.ol,{children:["\n",(0,r.jsx)(t.li,{children:"If the tubes in the cap are submerged during operation, this is reduce the transfer of air. Pull them up from the top of the cap to keep them out of the liquid. Even more effective: shorten them with scissors."}),"\n",(0,r.jsx)(t.li,{children:"Increase the RPM of the stirring. This will increase the surface area exposed to the air. Be warned though: too high of an RPM will cause either a large enough vortex to interfere with the optical systems, or will causing the stir bar to fall out of sync."}),"\n",(0,r.jsxs)(t.li,{children:["Add a ",(0,r.jsx)(t.a,{href:"https://www.printables.com/model/575292-baffle-for-pioreactor-vial-cap-a/files",children:"baffle"})," to the vial cap. A simple cylinder that rests into the liquid causes disturbance in the rotating liquid that both mixing and aeration are significantly improved. A tube can be removed from the cap, and a autoclavable rod can be inserted such that it enters the media, but won't interfere with the optics."]}),"\n",(0,r.jsx)(t.li,{children:"Adding external aeration to your Pioreactor. In the simplest case, using an air pump."}),"\n"]}),"\n",(0,r.jsx)(t.h3,{id:"can-i-plot-the-rpm-in-a-chart-in-the-ui",children:"Can I plot the RPM in a chart in the UI?"}),"\n",(0,r.jsxs)(t.p,{children:["Yes, follow the instructions ",(0,r.jsx)(t.a,{href:"https://forum.pioreactor.com/t/creating-stirring-rpm-and-pwm-duty-cycle-charts-on-the-ui/339",children:"here"}),"."]}),"\n",(0,r.jsx)(t.h2,{id:"raspberry-pi-hardware",children:"Raspberry Pi Hardware"}),"\n",(0,r.jsx)(t.h3,{id:"what-raspberry-pi-hardware-can-i-use-i-see-raspberry-pi-1-2-3-4-5-a-b--zero---its-confusing",children:"What Raspberry Pi hardware can I use? I see Raspberry Pi 1, 2, 3, 4, 5, A, B, +, Zero - it's confusing!"}),"\n",(0,r.jsx)(t.p,{children:"We've designed the hardware and software to be compatible with most Raspberry Pis that have an onboard Wifi and a 40 pin header. That includes (at the time of writing):"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:"Raspberry Pi 3 Model B & B+"}),"\n",(0,r.jsx)(t.li,{children:"Raspberry Pi 3 Model A+"}),"\n",(0,r.jsx)(t.li,{children:"Raspberry Pi 4 Model B \xb2 \xb3"}),"\n",(0,r.jsx)(t.li,{children:"Raspberry Pi 5 \xb2 \xb3"}),"\n",(0,r.jsx)(t.li,{children:"Raspberry Pi Zero 2 (with headers)"}),"\n"]}),"\n",(0,r.jsxs)(t.p,{children:["Although you can use any above, ",(0,r.jsx)(t.strong,{children:"we like the Raspberry Pi 3 B+, Raspberry Pi 4 B 2GB and Raspberry Pi Zero 2"}),". All have the necessary CPU power and memory for the Pioreactor workload, and are generally easy to source. However, they don't a ethernet connector built-in. So talk to your team about if you need to use ethernet or wifi. If you need ethernet, we like the model RPi 3 B+ or 4 B, or purchase some microUSB-to-ethernet dongles for the RPi Zero 2."]}),"\n",(0,r.jsx)(t.p,{children:"\xb2 You don't need a lot of RAM for the Pioreactor, so we recommend getting the lower RAM RPi if offered a choice. 2GB or less is fine. Also, if you are going to buy a Raspberry Pi 4, you should consider just upgrading for the Raspberry Pi 5 2GB (it's only a few dollars more, and much more performant)."}),"\n",(0,r.jsx)(t.p,{children:"\xb3 These have a USB-C power connector, whereas the other Pis have a microUSB power connector."}),"\n",(0,r.jsx)(t.h3,{id:"what-microsd-cards-do-you-recommend",children:"What microSD cards do you recommend?"}),"\n",(0,r.jsxs)(t.p,{children:["The Raspberry Pi has an ",(0,r.jsx)(t.em,{children:"official Raspberry Pi microSD card"})," that we recommend for its high quality. You can likely purchase it at the same place you purchase PSUs and Pis. The 32 GB, blank, version is fine."]}),"\n",(0,r.jsx)(t.p,{children:"In general: at least 16GB. We like 16GB or 32GB SanDisk Edge or Samsung microSD cards for their longevity, but any good quality, class 10 microSD card will do."}),"\n",(0,r.jsx)(t.h3,{id:"what-power-supply-unit-psu-do-i-need",children:"What power supply unit (PSU) do I need?"}),"\n",(0,r.jsxs)(t.p,{children:["If you look at the power rating, it should be about 5 V and at least 2.25 A, or above 12 W. We really like the ",(0,r.jsx)(t.a,{href:"https://www.raspberrypi.com/products/#power-supplies-and-cables",children:"official Raspberry Pi PSUs"}),", available at most places you can purchase Raspberry Pis."]}),"\n",(0,r.jsxs)(t.p,{children:["If you need to power multiple Pioreactors, you might consider a single PSU with USB ports ",(0,r.jsx)(t.a,{href:"/user-guide/powering-cluster",children:"detailed here"}),"."]}),"\n",(0,r.jsx)(t.h3,{id:"do-i-need-any-cooling-for-the-raspberry-pi",children:"Do I need any cooling for the Raspberry Pi?"}),"\n",(0,r.jsx)(t.p,{children:"Nope, you shouldn't. However, extra heat sinks are never a bad idea!"}),"\n",(0,r.jsx)(t.h3,{id:"could-a-raspberry-pi-compatible-board-work-like-rock-pi-4",children:"Could a Raspberry Pi-compatible board work, like Rock Pi 4?"}),"\n",(0,r.jsx)(t.p,{children:"Maybe? We haven't tested them, but so long as i) the GPIO pins are identical, and ii) Raspberry Pi OS can be installed, it should work."}),"\n",(0,r.jsx)(t.h3,{id:"what-is-the-usernamepassword-for-the-raspberry-pi",children:"What is the username/password for the Raspberry Pi?"}),"\n",(0,r.jsxs)(t.p,{children:["When setting up your Raspberry Pi with the Pioreactor software, you would have chosen a password. Try the recommended username: ",(0,r.jsx)(t.code,{children:"pioreactor"}),", and password: ",(0,r.jsx)(t.code,{children:"raspberry"}),"."]}),"\n",(0,r.jsx)(t.h3,{id:"can-i-use-the-desktop-interface-with-a-display-with-the-pioreactor",children:"Can I use the desktop interface (with a display) with the Pioreactor?"}),"\n",(0,r.jsx)(t.p,{children:'Not currently. Our software is based of the "headless" operating-system, which doesn\'t have display output.'}),"\n",(0,r.jsx)(t.h2,{id:"dosing",children:"Dosing"}),"\n",(0,r.jsx)(t.h3,{id:"why-does-the-media-card-in-the-ui-not-update-when-i-run-a-dosing-command",children:"Why does the Media card in the UI not update when I run a dosing command?"}),"\n",(0,r.jsxs)(t.p,{children:["The Media card will ",(0,r.jsx)(t.em,{children:"only"})," update when an ",(0,r.jsx)(t.a,{href:"/user-guide/dosing-automations",children:"Dosing Automation"})," is active (even the ",(0,r.jsx)(t.code,{children:"Silent"})," automation). Why is it done this way? Often, you don't want volumes to be recorded there: during cleaning, during testing, etc. Often you only want volumes associated with the experiment to be there."]}),"\n",(0,r.jsx)(t.admonition,{type:"note",children:(0,r.jsxs)(t.p,{children:['All dosing events ares recorded to the database however, and with a record of when the event occurred, and source of action. This data is available in the "Export data" web page, under ',(0,r.jsx)(t.code,{children:"Dosing event log"}),"."]})}),"\n",(0,r.jsx)(t.h2,{id:"data-storage-access-and-recovery",children:"Data storage, access and recovery"}),"\n",(0,r.jsxs)(t.blockquote,{children:["\n",(0,r.jsx)(t.p,{children:"\ud83d\udca1 For any important project, we suggest manually exporting or backing up critical data multiple different places. This doesn't just apply to using the Pioreactor, but is good advice in general."}),"\n"]}),"\n",(0,r.jsx)(t.h3,{id:"where-are-logs-stored",children:"Where are logs stored?"}),"\n",(0,r.jsxs)(t.p,{children:["For the logs that you see in the Log Table in the ",(0,r.jsx)(t.em,{children:"Experiment Overview"})," page, these can be download on the ",(0,r.jsx)(t.em,{children:"Download experiment data"})," page in the Pioreactor web interface. Other logs are also available, including dosing event and algorithm change-logs."]}),"\n",(0,r.jsxs)(t.p,{children:["More granular logs per Pioreactor are available in ",(0,r.jsx)(t.code,{children:"/var/log/pioreactor.log"})," on the Raspberry Pis."]}),"\n",(0,r.jsx)(t.h3,{id:"how-do-i-access-raw-experiment-data",children:"How do I access raw experiment data?"}),"\n",(0,r.jsxs)(t.ol,{children:["\n",(0,r.jsxs)(t.li,{children:["The ",(0,r.jsx)(t.em,{children:"Export data"})," page in the Pioreactor UI provides CSV exports of common datasets from a pre-selected experiment."]}),"\n",(0,r.jsxs)(t.li,{children:["All data eventually lands in a SQLite3 database on the leader Pioreactor, by default located in ",(0,r.jsx)(t.code,{children:"/home/pioreactor/.pioreactor/storage/pioreactor.sqlite"}),". This can be download using a tool like ",(0,r.jsx)(t.code,{children:"scp"}),"."]}),"\n",(0,r.jsxs)(t.li,{children:["To access the SQLite3 database from the command line, try ",(0,r.jsx)(t.code,{children:"pio db"}),"."]}),"\n"]}),"\n",(0,r.jsx)(t.h3,{id:"my-microsd-card-is-corrupted---what-can-i-do",children:"My microSD card is corrupted - what can I do?"}),"\n",(0,r.jsx)(t.p,{children:"Unfortunately, the microSD card becoming corrupted or damaged is an infrequent but possible risk with using Raspberry Pis."}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["If the microSD card was inside a non-leader Pioreactor, it's best to try to reformat the microSD card and start fresh (i.e. ",(0,r.jsx)(t.a,{href:"/user-guide/software-set-up#adding-workers-to-your-cluster",children:"reinstall the Pioreactor software and reintroduce it to the cluster"}),"). This is usually okay as no critical data is stored locally in workers, only log files and hardware calibrations will be lost."]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["If the microSD was inside the leader Raspberry Pi, this is a bigger problem. Likely any running experiment will have to be restarted. Fortunately, if you have more than one Pioreactor in your cluster, then the leader's SQLite database has been periodically backing itself up to other Pioreactors in the cluster every few days. Using the command line, check other Pioreactors' ",(0,r.jsx)(t.code,{children:"/home/pioreactor/.pioreactor/storage"})," directory for the ",(0,r.jsx)(t.em,{children:"latest"})," backup named ",(0,r.jsx)(t.code,{children:"pioreactor.sqlite.backup"})," (should be from within the past few days hours). You can use this database to restart a new leader."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"networking",children:"Networking"}),"\n",(0,r.jsx)(t.h3,{id:"how-do-i-changeedit-the-network-the-pioreactor-on",children:"How do I change/edit the network the Pioreactor on?"}),"\n",(0,r.jsxs)(t.p,{children:["See documentation on networking ",(0,r.jsx)(t.a,{href:"/user-guide/networking#general-networking-tools",children:"here"}),"."]}),"\n",(0,r.jsx)(t.h3,{id:"can-i-use-ethernet-cable-connections-instead-of-wifi-connections",children:"Can I use Ethernet cable connections instead of Wifi connections?"}),"\n",(0,r.jsxs)(t.p,{children:["Yes, so long as the Raspberry Pi's are connected to the same network and discoverable, this should work. Even mixing Ethernet and Wifi is fine. You can read more about networking Pioreactors ",(0,r.jsx)(t.a,{href:"/user-guide/networking",children:"here"}),"."]}),"\n",(0,r.jsx)(t.h3,{id:"how-can-i-determine-the-pioreactors-ip-address-or-the-mac-address",children:"How can I determine the Pioreactor's IP address? Or the MAC address?"}),"\n",(0,r.jsx)(t.p,{children:"Depending on your access to the Pioreactor, there are a few ways:"}),"\n",(0,r.jsxs)(t.ol,{children:["\n",(0,r.jsx)(t.li,{children:"In the UI's Inventory page."}),"\n",(0,r.jsxs)(t.li,{children:["If you can't access the Pioreactor's UI or SSH in: the software will write the IP address to the ",(0,r.jsx)(t.code,{children:"/boot"})," directory on the SD card. After the Pioreactor's blue LED has blinked, you can unplug the Pioreactor, remove the SD card, and place the SD card in another computer. Navigate to the card, and in the directory you should see a file called ",(0,r.jsx)(t.code,{children:"ip"}),". Open this file, and the IP address should be there. Place the SD card back into the Pioreactor and plug it back in."]}),"\n"]}),"\n",(0,r.jsx)(t.h3,{id:"im-using-a-local-access-point-but-id-like-to-install-plugins-update-software-etc",children:"I'm using a local access point, but I'd like to install plugins, update software, etc."}),"\n",(0,r.jsx)(t.h4,{id:"to-install-a-plugin",children:"To install a plugin"}),"\n",(0,r.jsxs)(t.p,{children:["On a computer that is connected to the internet, download the ",(0,r.jsx)(t.code,{children:".whl"})," file from the plugins webpage on PyPI. Then, connect that computer to your Pioreactor's local access point's network. To each Pioreactor you wish to install the plugin on, transfer the ",(0,r.jsx)(t.code,{children:".whl"})," file to the Pioreactor (using SFTP or FTP). Then, run ",(0,r.jsx)(t.code,{children:"pio plugins install --source "})]}),"\n",(0,r.jsx)(t.h4,{id:"to-upgrade-the-pioreactor-software",children:"To upgrade the Pioreactor software"}),"\n",(0,r.jsxs)(t.p,{children:["See steps ",(0,r.jsx)(t.a,{href:"/user-guide/updating-software#method-2-update-using-a-zip-file-and-the-ui",children:"here"}),"."]}),"\n",(0,r.jsxs)(t.h3,{id:"if-i-have-multiple-pioreactor-leaders-on-my-network-what-leader-does-httppioreactorlocal-point-to",children:["If I have multiple Pioreactor leaders on my network, what leader does ",(0,r.jsx)(t.code,{children:"http://pioreactor.local"})," point to?"]}),"\n",(0,r.jsxs)(t.p,{children:["If there are multiple leaders on the same network, then each will override the other's ",(0,r.jsx)(t.code,{children:"pioreactor.local"})," alias, and the alias will be unreliable. You can either access the leaders by their hostnames: ",(0,r.jsx)(t.code,{children:"http://.local"}),", or you can change the alias in the config.ini, too, by editing ",(0,r.jsx)(t.code,{children:"domain_alias"})," under section ",(0,r.jsx)(t.code,{children:"[ui]"})," (changing this requires a restart of the machine)."]})]})}function u(e={}){const{wrapper:t}={...(0,o.a)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},3901:(e,t,i)=>{i.d(t,{Z:()=>a});i(67294);var r=i(93743);const o={tableOfContentsInline:"tableOfContentsInline_prmo"};var n=i(85893);function a(e){let{toc:t,minHeadingLevel:i,maxHeadingLevel:a}=e;return(0,n.jsx)("div",{className:o.tableOfContentsInline,children:(0,n.jsx)(r.Z,{toc:t,minHeadingLevel:i,maxHeadingLevel:a,className:"table-of-contents",linkClassName:null})})}},93743:(e,t,i)=>{i.d(t,{Z:()=>g});var r=i(67294),o=i(86668);function n(e){const t=e.map((e=>({...e,parentIndex:-1,children:[]}))),i=Array(7).fill(-1);t.forEach(((e,t)=>{const r=i.slice(2,e.level);e.parentIndex=Math.max(...r),i[e.level]=t}));const r=[];return t.forEach((e=>{const{parentIndex:i,...o}=e;i>=0?t[i].children.push(o):r.push(o)})),r}function a(e){let{toc:t,minHeadingLevel:i,maxHeadingLevel:r}=e;return t.flatMap((e=>{const t=a({toc:e.children,minHeadingLevel:i,maxHeadingLevel:r});return function(e){return e.level>=i&&e.level<=r}(e)?[{...e,children:t}]:t}))}function s(e){const t=e.getBoundingClientRect();return t.top===t.bottom?s(e.parentNode):t}function h(e,t){let{anchorTopOffset:i}=t;const r=e.find((e=>s(e).top>=i));if(r){return function(e){return e.top>0&&e.bottom{e.current=t?0:document.querySelector(".navbar").clientHeight}),[t]),e}function d(e){const t=(0,r.useRef)(void 0),i=l();(0,r.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:r,linkActiveClassName:o,minHeadingLevel:n,maxHeadingLevel:a}=e;function s(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(r),s=function(e){let{minHeadingLevel:t,maxHeadingLevel:i}=e;const r=[];for(let o=t;o<=i;o+=1)r.push(`h${o}.anchor`);return Array.from(document.querySelectorAll(r.join()))}({minHeadingLevel:n,maxHeadingLevel:a}),l=h(s,{anchorTopOffset:i.current}),d=e.find((e=>l&&l.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,i){i?(t.current&&t.current!==e&&t.current.classList.remove(o),e.classList.add(o),t.current=e):e.classList.remove(o)}(e,e===d)}))}return document.addEventListener("scroll",s),document.addEventListener("resize",s),s(),()=>{document.removeEventListener("scroll",s),document.removeEventListener("resize",s)}}),[e,i])}var c=i(39960),u=i(85893);function p(e){let{toc:t,className:i,linkClassName:r,isChild:o}=e;return t.length?(0,u.jsx)("ul",{className:o?void 0:i,children:t.map((e=>(0,u.jsxs)("li",{children:[(0,u.jsx)(c.Z,{to:`#${e.id}`,className:r??void 0,dangerouslySetInnerHTML:{__html:e.value}}),(0,u.jsx)(p,{isChild:!0,toc:e.children,className:i,linkClassName:r})]},e.id)))}):null}const m=r.memo(p);function g(e){let{toc:t,className:i="table-of-contents table-of-contents__left-border",linkClassName:s="table-of-contents__link",linkActiveClassName:h,minHeadingLevel:l,maxHeadingLevel:c,...p}=e;const g=(0,o.L)(),f=l??g.tableOfContents.minHeadingLevel,w=c??g.tableOfContents.maxHeadingLevel,y=function(e){let{toc:t,minHeadingLevel:i,maxHeadingLevel:o}=e;return(0,r.useMemo)((()=>a({toc:n(t),minHeadingLevel:i,maxHeadingLevel:o})),[t,i,o])}({toc:t,minHeadingLevel:f,maxHeadingLevel:w});return d((0,r.useMemo)((()=>{if(s&&h)return{linkClassName:s,linkActiveClassName:h,minHeadingLevel:f,maxHeadingLevel:w}}),[s,h,f,w])),(0,u.jsx)(m,{toc:y,className:i,linkClassName:s,...p})}},15713:(e,t,i)=>{i.d(t,{Z:()=>r});const r=i.p+"assets/images/reboot-76282e6704cc04bdd5fb187efb1986d1.png"},11151:(e,t,i)=>{i.d(t,{Z:()=>s,a:()=>a});var r=i(67294);const o={},n=r.createContext(o);function a(e){const t=r.useContext(n);return r.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function s(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),r.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e4b799f3.68099310.js b/assets/js/e4b799f3.a57487ae.js similarity index 50% rename from assets/js/e4b799f3.68099310.js rename to assets/js/e4b799f3.a57487ae.js index c0a1a439..20e86fdb 100644 --- a/assets/js/e4b799f3.68099310.js +++ b/assets/js/e4b799f3.a57487ae.js @@ -1 +1 @@ -"use strict";(self.webpackChunkpioreactor=self.webpackChunkpioreactor||[]).push([[8688],{10784:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>d,contentTitle:()=>l,default:()=>p,frontMatter:()=>a,metadata:()=>c,toc:()=>h});var t=r(85893),i=r(11151),o=(r(3901),r(67294));function s(e){let{type:n}=e;const[r,i]=o.useState(""),[s,a]=o.useState([]);o.useEffect((()=>{(async()=>{try{const e=await fetch("https://api.github.com/repos/pioreactor/custopizer/releases?per_page=40");if(!e.ok)throw new Error("Failed to fetch releases");const n=(await e.json()).filter((e=>!e.prerelease&&!e.draft)).map((e=>({version:e.tag_name})));a(n)}catch(e){console.error("Error fetching releases:",e)}})()}),[]);return(0,t.jsxs)("div",{children:[(0,t.jsx)("span",{children:" Select software version: "}),(0,t.jsxs)("select",{name:"version",onChange:e=>i(e.target.value),style:{width:"100px"},children:[(0,t.jsx)("option",{value:"",children:"version"}),s.map(((e,n)=>(0,t.jsxs)("option",{value:e.version,children:[e.version,0===n?" (latest)":""]},n)))]}),(0,t.jsxs)("button",{onClick:()=>{if(r){const e=`https://github.com/Pioreactor/CustoPiZer/releases/download/${r}/pioreactor_${n}.zip`;window.open(e,"_blank")}},disabled:""===r,style:{marginLeft:"10px"},children:["Download ",n," image"]})]})}const a={id:"software-set-up",description:"Install the Pioreactor software onto the Raspberry Pi",title:"Software installation",slug:"/software-set-up"},l=void 0,c={id:"getting-started/software-set-up",title:"Software installation",description:"Install the Pioreactor software onto the Raspberry Pi",source:"@site/user-guide/01-getting-started/02-software-set-up.mdx",sourceDirName:"01-getting-started",slug:"/software-set-up",permalink:"/user-guide/software-set-up",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:2,frontMatter:{id:"software-set-up",description:"Install the Pioreactor software onto the Raspberry Pi",title:"Software installation",slug:"/software-set-up"},sidebar:"tutorialSidebar",previous:{title:"Connect the optics system",permalink:"/user-guide/optics-assembly"},next:{title:"Preparing your vial for cultures",permalink:"/user-guide/prepare-vial-for-cultures"}},d={},h=[{value:"Before you begin",id:"before-you-begin",level:3},{value:"Setting up your Raspberry Pi",id:"setting-up-your-raspberry-pi",level:3},{value:"Adding additional workers to your cluster",id:"adding-additional-workers-to-your-cluster",level:2},{value:"Step 1. Install the worker software",id:"step-1-install-the-worker-software",level:4},{value:"Step 2. Add worker to cluster using the UI",id:"step-2-add-worker-to-cluster-using-the-ui",level:4},{value:"From the command line (Alternative)",id:"from-the-command-line-alternative",level:4},{value:"Troubleshooting",id:"troubleshooting",level:2},{value:"My leader Pioreactor never flashes the blue LED",id:"my-leader-pioreactor-never-flashes-the-blue-led",level:4},{value:"My Pioreactor keeps flashing the blue LED",id:"my-pioreactor-keeps-flashing-the-blue-led",level:4},{value:"My RPi won't connect to my WiFi.",id:"my-rpi-wont-connect-to-my-wifi",level:4},{value:"I want to change the Pioreactor name on installation of leader",id:"i-want-to-change-the-pioreactor-name-on-installation-of-leader",level:4},{value:"http://pioreactor.local in a web browser is not showing up",id:"httppioreactorlocal-in-a-web-browser-is-not-showing-up",level:4},{value:"Can I plug a monitor into the Raspberry Pi's HDMI port?",id:"can-i-plug-a-monitor-into-the-raspberry-pis-hdmi-port",level:4},{value:"I want a different leader-worker software version.",id:"i-want-a-different-leader-worker-software-version",level:4},{value:"I'd like to have the leader not be a worker, and only a standalone leader. Can I do that?",id:"id-like-to-have-the-leader-not-be-a-worker-and-only-a-standalone-leader-can-i-do-that",level:4}];function u(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h3,{id:"before-you-begin",children:"Before you begin"}),"\n",(0,t.jsxs)(n.p,{children:["You can expect the setup process to take 10-15 minutes. If you encounter any problems, feel free to email us for support at ",(0,t.jsx)(n.a,{href:"mailto:hello@pioreactor.com",children:"hello@pioreactor.com"}),"."]}),"\n",(0,t.jsxs)(n.admonition,{type:"info",children:[(0,t.jsx)(n.p,{children:"Before you get started, you'll need to have the following:"}),(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["A Raspberry Pi (our list of recommended Raspberry Pis is ",(0,t.jsx)(n.a,{href:"/user-guide/common-questions#what-raspberry-pi-hardware-can-i-use-i-see-raspberry-pi-1-2-3-4-a-b--zero---its-confusing",children:"here"}),")"]}),"\n",(0,t.jsxs)(n.li,{children:["A blank microSD card (our recommended microSD cards is ",(0,t.jsx)(n.a,{href:"/user-guide/common-questions#what-microsd-cards-do-you-recommend",children:"here"}),")"]}),"\n",(0,t.jsxs)(n.li,{children:["A suitable power supply for the Raspberry Pi (our recommended power supply units are ",(0,t.jsx)(n.a,{href:"/user-guide/common-questions#what-power-supply-unit-do-i-need",children:"here"}),")"]}),"\n",(0,t.jsx)(n.li,{children:"A computer with internet access and ability to read & write to a microSD card"}),"\n"]})]}),"\n",(0,t.jsx)(n.h3,{id:"setting-up-your-raspberry-pi",children:"Setting up your Raspberry Pi"}),"\n",(0,t.jsx)(n.p,{children:"We'll start your blank microSD card."}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["Download the ",(0,t.jsx)(n.a,{href:"https://github.com/pioreactor/custopizer/releases/latest/download/pioreactor_leader_worker.zip",children:"Pioreactor leader and worker image file"}),". Leave it as a zip (no need to unzip it)."]}),"\n"]}),"\n",(0,t.jsx)(n.admonition,{type:"info",children:(0,t.jsx)(n.p,{children:"What is an image file? It's a file that contains all the required software preinstalled on it, including an operating system and our custom Pioreactor software. The image will be installed on the microSD card."})}),"\n",(0,t.jsxs)(n.ol,{start:"2",children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Download the latest version of ",(0,t.jsx)(n.a,{href:"https://www.raspberrypi.org/software/",children:"Raspberry Pi Imager"})," for your operating system and install it."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Open the newly-installed Raspberry Pi Imager."}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Click ",(0,t.jsx)(n.strong,{children:"Choose Device"}),', and "No filtering" at the top.\n',(0,t.jsx)(n.img,{alt:"Click "Choose Device"",src:r(91461).Z+"",width:"1584",height:"1180"})]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Click ",(0,t.jsx)(n.strong,{children:"Choose OS"}),". Click on ",(0,t.jsx)(n.strong,{children:"Use custom"})," towards the bottom:\n",(0,t.jsx)(n.img,{alt:"Click "Choose OS"",src:r(50318).Z+"",width:"1584",height:"1180"}),"\n",(0,t.jsx)(n.img,{alt:"Select the "Use custom" option",src:r(18808).Z+"",width:"1584",height:"1120"}),"\nSelect the downloaded Pioreactor image from step 1."]}),"\n",(0,t.jsx)("img",{src:"/img/user-guide/select_new_image.png",alt:"Screenshot of the local computer's directory, selecting the downloaded image",width:"555",style:{margin:"auto",display:"block"}}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Insert your microSD card to your computer. After your microSD card is recognized by your computer, click ",(0,t.jsx)(n.strong,{children:"Choose Storage"})," and select it.\n",(0,t.jsx)(n.img,{alt:"Click "Choose storage"",src:r(54142).Z+"",width:"1584",height:"1180"})]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Click ",(0,t.jsx)(n.strong,{children:"Next"}),".\n",(0,t.jsx)(n.img,{alt:"Click Next",src:r(89994).Z+"",width:"1584",height:"1180"})]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Click ",(0,t.jsx)(n.strong,{children:"Edit settings"}),":"]}),"\n",(0,t.jsx)("img",{src:"/img/user-guide/choose-edit-settings.png",width:"525",alt:"Click edit settings",style:{margin:"auto",display:"block"}}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["Check ",(0,t.jsx)(n.strong,{children:"Set hostname"}),". Input a unique name for this Pioreactor. Some names that we use for our first Pioreactor: ",(0,t.jsx)(n.code,{children:"pioreactor01"}),", or ",(0,t.jsx)(n.code,{children:"leader"}),", or ",(0,t.jsx)(n.code,{children:"pio01"}),". ",(0,t.jsx)(n.em,{children:"Don't"})," use ",(0,t.jsx)(n.code,{children:"pioreactor"})," or ",(0,t.jsx)(n.code,{children:"raspberrypi"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["Check ",(0,t.jsx)(n.strong,{children:"Set username and password"}),". Enter the following:","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"username"}),": ",(0,t.jsx)(n.code,{children:"pioreactor"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"password"}),": ",(0,t.jsx)(n.code,{children:"raspberry"}),"."]}),"\n",(0,t.jsx)(n.li,{children:"Note: You can change the username and password later."}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["Check ",(0,t.jsx)(n.strong,{children:"Configure wireless LAN"})," and enter your network name into SSID network name, WiFi password, and country. Or leave blank if using ethernet."]}),"\n"]}),"\n",(0,t.jsx)(n.admonition,{type:"tip",children:(0,t.jsxs)(n.p,{children:["If you are having difficulty connecting to a network, like at a university that may not easily incorporate Raspberry Pi's, ",(0,t.jsx)(n.a,{href:"/user-guide/local-access-point",children:"there's a built-in solution for creating a local access point"}),") and a ",(0,t.jsx)(n.a,{href:"/user-guide/internet-sharing",children:"solution for internet-sharing from a PC via ethernet"}),"."]})}),"\n",(0,t.jsxs)(n.ol,{start:"5",children:["\n",(0,t.jsx)(n.li,{children:"Change timezone to your local timezone."}),"\n",(0,t.jsxs)(n.li,{children:['Under the "Services" tab, check ',(0,t.jsx)(n.strong,{children:"Enable SSH"}),", and select ",(0,t.jsx)(n.strong,{children:"Use password authentication"}),"."]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Your settings should look something like this:"}),"\n",(0,t.jsx)("img",{src:"/img/user-guide/rpi-imager-settings.png",width:"625",alt:"Screenshot of what your settings should look like",style:{margin:"auto",display:"block"}}),"\n",(0,t.jsx)("img",{src:"/img/user-guide/rpi-imager-settings-2.png",width:"625",alt:"Screenshot of what your settings should look like",style:{margin:"auto",display:"block"}}),"\n",(0,t.jsxs)(n.ol,{start:"6",children:["\n",(0,t.jsxs)(n.li,{children:["Click ",(0,t.jsx)(n.strong,{children:"Save"})," to save and exit the dialog box."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:['Click "Yes" to begin writing. A prompt ',(0,t.jsx)(n.em,{children:"may"})," appear asking for permission to write, accept it. Writing will take up to 5 minutes. Perfect time for a tea break."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Once writing is complete, remove the microSD card, and place it into the Raspberry Pi. ",(0,t.jsx)(n.strong,{children:"Your Raspberry Pi's power should be unplugged before inserting the microSD card"}),". The microSD slot is located on the PWM side of the Pioreactor. Example for a Raspberry Pi A model:"]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Insert the microSD card into a Raspberry Pi A model",src:r(89935).Z+"",width:"1000",height:"375"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Plug power into your Raspberry Pi. LEDs onboard the Raspberry Pi may start to light up momentarily. After ",(0,t.jsx)(n.strong,{children:"a few minutes"}),", your Pioreactor HAT will briefly blink a blue LED, telling us it is ready."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)("p",{align:"center",children:(0,t.jsx)("video",{width:"520",muted:!0,loop:"true",autoplay:"autoplay",children:(0,t.jsx)("source",{src:"/vid/flashing.mp4",type:"video/mp4"})})}),"\n",(0,t.jsx)(n.admonition,{type:"info",children:(0,t.jsxs)(n.p,{children:["Waited, but didn't see a blue LED blink, or maybe you missed it? Try pressing on the onboard button, near the side labelled \"PWM\", and pictured above. If this lights up the blue LED, you're good to move on. Still not working? Try power-cycling the Raspberry Pi, or email us at ",(0,t.jsx)(n.a,{href:"mailto:hello@pioreactor.com",children:"hello@pioreactor.com"}),"."]})}),"\n",(0,t.jsxs)(n.ol,{start:"9",children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["After observing the blue LED flashing, navigate to ",(0,t.jsx)(n.a,{href:"http://pioreactor.local",children:"http://pioreactor.local"})," in a web browser to visit the web interface. If you are using local-access-point, looking for a ",(0,t.jsx)(n.code,{children:"pioreactor"})," wifi network and then visit the link. (Not able to load ",(0,t.jsx)(n.a,{href:"http://pioreactor.local",children:"http://pioreactor.local"}),"? Read ",(0,t.jsx)(n.a,{href:"#pioreactorlocal-in-a-web-browser-is-not-showing-up",children:"Troubleshooting"})," below)."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["The Pioreactor is now ready for use! Follow ",(0,t.jsx)(n.a,{href:"/user-guide/prepare-vial-for-cultures",children:"this guide"})," to set up your first experiment."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"If you're using a Pioreactor 20ml v1.0 (sold prior to May 2024) edit your config.ini to"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"[pioreactor]\nmodel=pioreactor_20ml\nversion=1.0\n"})}),"\n",(0,t.jsxs)(n.p,{children:["You can find this in the UI -> Configuration -> select your Pioreactor's config.ini from the dropdown, edit, and save. Finally ",(0,t.jsx)(n.strong,{children:"reboot your Pioreactor"}),"."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"adding-additional-workers-to-your-cluster",children:"Adding additional workers to your cluster"}),"\n",(0,t.jsx)(n.p,{children:"Workers are additional Pioreactors that you can control from a single UI. Together, a leader and workers form a Pioreactor cluster."}),"\n",(0,t.jsx)(n.h4,{id:"step-1-install-the-worker-software",children:"Step 1. Install the worker software"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Download a ",(0,t.jsx)(n.em,{children:"worker image"}),":"]}),"\n",(0,t.jsx)(n.admonition,{type:"tip",children:(0,t.jsxs)(n.p,{children:["Check the software version of your leader first (you can find that on the Updates page, or the Inventory Page, or use ",(0,t.jsx)(n.code,{children:"pio version"})," on the command line). It's recommended to download the associated worker image for that same version."]})}),"\n",(0,t.jsx)(s,{type:"worker"}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Follow the same instructions above to write the image to an SD card. All the settings are the same, including ",(0,t.jsx)(n.em,{children:"username"})," and ",(0,t.jsx)(n.em,{children:"password"}),", ",(0,t.jsx)(n.strong,{children:"but choose a new hostname"}),". See note below:"]}),"\n",(0,t.jsxs)(n.admonition,{type:"tip",children:[(0,t.jsxs)(n.p,{children:["Choose a hostname that isn't currently being used in your cluster, ex: ",(0,t.jsx)(n.code,{children:"worker01"}),", ",(0,t.jsx)(n.code,{children:"worker02"}),", etc. Re-using old names is fine, so long as that worker isn't present in your cluster."]}),(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Tip"}),": if you plan to have many Pioreactors, use a leading zero in any numbers, like ",(0,t.jsx)(n.code,{children:"pio01"}),", or ",(0,t.jsx)(n.code,{children:"worker01"}),", etc."]})]}),"\n",(0,t.jsx)(n.p,{children:"Below is a screenshot of example settings, your settings might be slightly different."}),"\n",(0,t.jsx)("img",{src:"/img/user-guide/rpi-imager-settings-worker.png",width:"625",alt:"Screenshot of what your settings may look like",style:{margin:"auto",display:"block"}}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["If using a local-access-point on your leader Pioreactor, use the wifi ssid ",(0,t.jsx)(n.code,{children:"pioreactor"})," and password ",(0,t.jsx)(n.code,{children:"raspberry"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"After the image is written to the microSD card, place the microSD card into the Raspberry Pi and power it on."}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"The Pioreactor's blue LED will light up and stay on, indicating that it's ready to be connected. Move onto the next step."}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h4,{id:"step-2-add-worker-to-cluster-using-the-ui",children:"Step 2. Add worker to cluster using the UI"}),"\n",(0,t.jsxs)(n.p,{children:["Follow the instructions ",(0,t.jsx)(n.a,{href:"/user-guide/create-cluster#adding-pioreactors-to-your-cluster",children:"here to add your worker to your Pioreactor cluster"}),"."]}),"\n",(0,t.jsxs)(n.h4,{id:"from-the-command-line-alternative",children:["From the command line ",(0,t.jsx)(n.em,{children:"(Alternative)"})]}),"\n",(0,t.jsxs)(n.p,{children:["On the leader's command line, the command ",(0,t.jsx)(n.code,{children:"pio add-pioreactor "})," will connect the new Pioreactor to the cluster."]}),"\n",(0,t.jsx)(n.admonition,{type:"tip",children:(0,t.jsxs)(n.p,{children:["We recommend running a ",(0,t.jsx)(n.a,{href:"/user-guide/running-self-test",children:"self-test"})," on all Pioreactors after your initial setup to detect any hardware bugs at this point."]})}),"\n",(0,t.jsx)(n.h2,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,t.jsx)(n.h4,{id:"my-leader-pioreactor-never-flashes-the-blue-led",children:"My leader Pioreactor never flashes the blue LED"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"First, confirm that when you press the HAT button, the blue LED does not show up. If it does, you're good to go."}),"\n",(0,t.jsx)(n.li,{children:"It's likely that the installation failed (due to a settings issue), or there is a problem with the SD card. Double check the settings that you used and try reinstalling the image."}),"\n",(0,t.jsxs)(n.li,{children:["Are you using a microSD card with a size ",(0,t.jsx)(n.em,{children:"larger"}),' than 32GB? You may need to reformat it to FAT32. To do this, in the Raspberry Pi Imager, first select "Erase: format card as FAT32" under "Choose OS". Then proceed with writing the image.']}),"\n"]}),"\n",(0,t.jsx)(n.h4,{id:"my-pioreactor-keeps-flashing-the-blue-led",children:"My Pioreactor keeps flashing the blue LED"}),"\n",(0,t.jsxs)(n.p,{children:["On a successful start, the Pioreactor will flash its blue LED for about 2 seconds. If you observe the blue LED flashing for longer, something may be wrong. You can diagnose the problem by ",(0,t.jsx)(n.a,{href:"/user-guide/error-codes",children:"counting the number of flashes observed"}),"."]}),"\n",(0,t.jsx)(n.h4,{id:"my-rpi-wont-connect-to-my-wifi",children:"My RPi won't connect to my WiFi."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Some Raspberry Pis can't connect to Wifi natively, and some Raspberry Pis can only connect to 2.4GHz connections. See table below: ",(0,t.jsx)(n.a,{href:"https://user-images.githubusercontent.com/884032/105118696-e945dd00-5a9c-11eb-91f5-0cc77cdc1422.png",children:(0,t.jsx)(n.img,{src:"https://user-images.githubusercontent.com/884032/105118696-e945dd00-5a9c-11eb-91f5-0cc77cdc1422.png",alt:"Rpi and wifi"})}),(0,t.jsx)(n.a,{href:"https://user-images.githubusercontent.com/884032/105118696-e945dd00-5a9c-11eb-91f5-0cc77cdc1422.png"})]}),"\n",(0,t.jsx)(n.li,{children:"If you are using the built-in WiFi in a Raspberry Pi3, a Pi3B+, or Pi Zero W, be aware that the signal strength from the tiny internal antenna may be weaker than other WiFi devices. Try moving your Pioreactor closer to the router as a test."}),"\n",(0,t.jsxs)(n.li,{children:["If your network hidden? You will need to check ",(0,t.jsx)(n.code,{children:"hidden SSID"})," in the configuration in the Raspberry Pi imager. To fix this, you'll need to restart the image installation from the Raspberry Pi Imager."]}),"\n",(0,t.jsx)(n.li,{children:"Try power-cycling the Raspberry Pi (unplug and plug back in)."}),"\n",(0,t.jsxs)(n.li,{children:["If you are on a restrictive network (like at a university), and wish to avoid the network, ",(0,t.jsx)(n.a,{href:"/user-guide/local-access-point",children:"creating a local access point"})," may be a better option."]}),"\n",(0,t.jsx)(n.li,{children:"You may have mis-typed your WiFi credentials. To fix this, you'll need to restart the image installation from the Raspberry Pi Imager."}),"\n",(0,t.jsxs)(n.li,{children:["If connecting to a 5GHz WiFi connection, you ",(0,t.jsx)(n.em,{children:"need"})," to supply a valid country code. See the list here: ",(0,t.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2",title:"Link to country codes on wikipedia",children:"https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2/"}),"."]}),"\n",(0,t.jsx)(n.li,{children:"It's possible your SD card is damaged. This can cause all sorts of problems (including failing to boot), not just WiFi issues. The most common cause of SD card failure is probably inserting or removing the SD card while the Pi is powered up."}),"\n",(0,t.jsxs)(n.li,{children:["Check out some other possibilities ",(0,t.jsx)(n.a,{href:"https://community.octoprint.org/t/wifi-setup-and-troubleshooting/184#heading--troubleshooting",children:"here"}),"."]}),"\n"]}),"\n",(0,t.jsx)(n.h4,{id:"i-want-to-change-the-pioreactor-name-on-installation-of-leader",children:"I want to change the Pioreactor name on installation of leader"}),"\n",(0,t.jsx)(n.p,{children:"Easiest solution is to start over. You can edit the name in the RPi Imager, and reflash the image onto the microSD card to remove all previous data."}),"\n",(0,t.jsxs)(n.h4,{id:"httppioreactorlocal-in-a-web-browser-is-not-showing-up",children:[(0,t.jsx)(n.a,{href:"http://pioreactor.local",children:"http://pioreactor.local"})," in a web browser is not showing up"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["In your browser's address bar, add the ",(0,t.jsx)(n.code,{children:"http://"})," in front of the url, like so: ",(0,t.jsx)(n.code,{children:"http://pioreactor.local"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["Try appending a backslash as well: ",(0,t.jsx)(n.code,{children:"http://pioreactor.local/"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["The UI is hosted on ",(0,t.jsx)(n.strong,{children:"http"}),", not ",(0,t.jsx)(n.strong,{children:"https"}),". Check if you are accessing ",(0,t.jsx)(n.code,{children:"http"})," ",(0,t.jsx)(n.code,{children:"://pioreactor.local"}),", and ",(0,t.jsx)(n.em,{children:"not"})," ",(0,t.jsx)(n.code,{children:"https"})," ",(0,t.jsx)(n.code,{children:"://pioreactor.local"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["Try accessing using the url ",(0,t.jsx)(n.code,{children:"http://.local"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["If you know your Raspberry Pi's IP, try ",(0,t.jsx)(n.code,{children:"http://"}),". Here's ",(0,t.jsx)(n.a,{href:"/user-guide/common-questions#how-can-i-determine-the-pioreactors-ip-address",children:"information to determine the IP address"}),"."]}),"\n",(0,t.jsx)(n.li,{children:"When pressing the button on the HAT, does the blue LED show up? If not, installation may have failed. Try installing the image again, and double check the settings."}),"\n",(0,t.jsx)(n.li,{children:"Try power-cycling the Raspberry Pi (unplug and plug back in)."}),"\n",(0,t.jsxs)(n.li,{children:['In your Raspberry Pi Imager settings, confirm that you clicked "Set username and password", and used the username ',(0,t.jsx)(n.code,{children:"pioreactor"}),". If not, try ",(0,t.jsx)(n.a,{href:"/user-guide/software-set-up#setting-up-your-raspberry-pi",children:"reinstalling the image"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["Are you on an older Windows machine? You may need to install a DNS ",(0,t.jsx)(n.a,{href:"https://learn.adafruit.com/bonjour-zeroconf-networking-for-windows-and-linux/overview#microsoft-windows-914263-8",children:"service"}),", but also see workarounds ",(0,t.jsx)(n.a,{href:"https://github.com/OutsourcedGuru/octoprint-name-resolution-hacks",children:"here"}),"."]}),"\n"]}),"\n",(0,t.jsx)(n.h4,{id:"can-i-plug-a-monitor-into-the-raspberry-pis-hdmi-port",children:"Can I plug a monitor into the Raspberry Pi's HDMI port?"}),"\n",(0,t.jsx)(n.p,{children:"Our current software turns off all external displays (for power and compute reasons), so any external monitor attached to the Pi won't work."}),"\n",(0,t.jsx)(n.h4,{id:"i-want-a-different-leader-worker-software-version",children:"I want a different leader-worker software version."}),"\n",(0,t.jsx)(s,{type:"leader_worker"}),"\n",(0,t.jsxs)(n.h4,{id:"id-like-to-have-the-leader-not-be-a-worker-and-only-a-standalone-leader-can-i-do-that",children:["I'd like to have the leader ",(0,t.jsx)(n.em,{children:"not be a worker"}),", and only a standalone leader. Can I do that?"]}),"\n",(0,t.jsx)(n.p,{children:"Sure, we have a custom image that only has the leader software on it. See below:"}),"\n",(0,t.jsx)(s,{type:"leader"})]})}function p(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(u,{...e})}):u(e)}},3901:(e,n,r)=>{r.d(n,{Z:()=>s});r(67294);var t=r(93743);const i={tableOfContentsInline:"tableOfContentsInline_prmo"};var o=r(85893);function s(e){let{toc:n,minHeadingLevel:r,maxHeadingLevel:s}=e;return(0,o.jsx)("div",{className:i.tableOfContentsInline,children:(0,o.jsx)(t.Z,{toc:n,minHeadingLevel:r,maxHeadingLevel:s,className:"table-of-contents",linkClassName:null})})}},93743:(e,n,r)=>{r.d(n,{Z:()=>g});var t=r(67294),i=r(86668);function o(e){const n=e.map((e=>({...e,parentIndex:-1,children:[]}))),r=Array(7).fill(-1);n.forEach(((e,n)=>{const t=r.slice(2,e.level);e.parentIndex=Math.max(...t),r[e.level]=n}));const t=[];return n.forEach((e=>{const{parentIndex:r,...i}=e;r>=0?n[r].children.push(i):t.push(i)})),t}function s(e){let{toc:n,minHeadingLevel:r,maxHeadingLevel:t}=e;return n.flatMap((e=>{const n=s({toc:e.children,minHeadingLevel:r,maxHeadingLevel:t});return function(e){return e.level>=r&&e.level<=t}(e)?[{...e,children:n}]:n}))}function a(e){const n=e.getBoundingClientRect();return n.top===n.bottom?a(e.parentNode):n}function l(e,n){let{anchorTopOffset:r}=n;const t=e.find((e=>a(e).top>=r));if(t){return function(e){return e.top>0&&e.bottom{e.current=n?0:document.querySelector(".navbar").clientHeight}),[n]),e}function d(e){const n=(0,t.useRef)(void 0),r=c();(0,t.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:t,linkActiveClassName:i,minHeadingLevel:o,maxHeadingLevel:s}=e;function a(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(t),a=function(e){let{minHeadingLevel:n,maxHeadingLevel:r}=e;const t=[];for(let i=n;i<=r;i+=1)t.push(`h${i}.anchor`);return Array.from(document.querySelectorAll(t.join()))}({minHeadingLevel:o,maxHeadingLevel:s}),c=l(a,{anchorTopOffset:r.current}),d=e.find((e=>c&&c.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,r){r?(n.current&&n.current!==e&&n.current.classList.remove(i),e.classList.add(i),n.current=e):e.classList.remove(i)}(e,e===d)}))}return document.addEventListener("scroll",a),document.addEventListener("resize",a),a(),()=>{document.removeEventListener("scroll",a),document.removeEventListener("resize",a)}}),[e,r])}var h=r(39960),u=r(85893);function p(e){let{toc:n,className:r,linkClassName:t,isChild:i}=e;return n.length?(0,u.jsx)("ul",{className:i?void 0:r,children:n.map((e=>(0,u.jsxs)("li",{children:[(0,u.jsx)(h.Z,{to:`#${e.id}`,className:t??void 0,dangerouslySetInnerHTML:{__html:e.value}}),(0,u.jsx)(p,{isChild:!0,toc:e.children,className:r,linkClassName:t})]},e.id)))}):null}const m=t.memo(p);function g(e){let{toc:n,className:r="table-of-contents table-of-contents__left-border",linkClassName:a="table-of-contents__link",linkActiveClassName:l,minHeadingLevel:c,maxHeadingLevel:h,...p}=e;const g=(0,i.L)(),f=c??g.tableOfContents.minHeadingLevel,x=h??g.tableOfContents.maxHeadingLevel,j=function(e){let{toc:n,minHeadingLevel:r,maxHeadingLevel:i}=e;return(0,t.useMemo)((()=>s({toc:o(n),minHeadingLevel:r,maxHeadingLevel:i})),[n,r,i])}({toc:n,minHeadingLevel:f,maxHeadingLevel:x});return d((0,t.useMemo)((()=>{if(a&&l)return{linkClassName:a,linkActiveClassName:l,minHeadingLevel:f,maxHeadingLevel:x}}),[a,l,f,x])),(0,u.jsx)(m,{toc:j,className:r,linkClassName:a,...p})}},89994:(e,n,r)=>{r.d(n,{Z:()=>t});const t=r.p+"assets/images/choose-next-99e08c2f61c36e8235d1bac55d00ee89.png"},50318:(e,n,r)=>{r.d(n,{Z:()=>t});const t=r.p+"assets/images/choose-os-8124b1a42967a03237503524a6c8158c.png"},54142:(e,n,r)=>{r.d(n,{Z:()=>t});const t=r.p+"assets/images/choose-storage-da40660e2e7e9617ccfe235182066c99.png"},91461:(e,n,r)=>{r.d(n,{Z:()=>t});const t=r.p+"assets/images/choose_device-ba938d12596af89f9ab4f0f9b3806a49.png"},89935:(e,n,r)=>{r.d(n,{Z:()=>t});const t=r.p+"assets/images/place-micro-sd-card-77d8eb409d37006ac7742f9ec021307a.JPG"},18808:(e,n,r)=>{r.d(n,{Z:()=>t});const t=r.p+"assets/images/use_custom_image-33932c04d19243c39bb50742de143726.png"},11151:(e,n,r)=>{r.d(n,{Z:()=>a,a:()=>s});var t=r(67294);const i={},o=t.createContext(i);function s(e){const n=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkpioreactor=self.webpackChunkpioreactor||[]).push([[8688],{10784:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>d,contentTitle:()=>l,default:()=>p,frontMatter:()=>a,metadata:()=>c,toc:()=>h});var t=r(85893),i=r(11151),o=(r(3901),r(67294));function s(e){let{type:n}=e;const[r,i]=o.useState(""),[s,a]=o.useState([]);o.useEffect((()=>{(async()=>{try{const e=await fetch("https://api.github.com/repos/pioreactor/custopizer/releases?per_page=40");if(!e.ok)throw new Error("Failed to fetch releases");const n=(await e.json()).filter((e=>!e.prerelease&&!e.draft)).map((e=>({version:e.tag_name})));a(n)}catch(e){console.error("Error fetching releases:",e)}})()}),[]);return(0,t.jsxs)("div",{children:[(0,t.jsx)("span",{children:" Select software version: "}),(0,t.jsxs)("select",{name:"version",onChange:e=>i(e.target.value),style:{width:"100px"},children:[(0,t.jsx)("option",{value:"",children:"version"}),s.map(((e,n)=>(0,t.jsxs)("option",{value:e.version,children:[e.version,0===n?" (latest)":""]},n)))]}),(0,t.jsxs)("button",{onClick:()=>{if(r){const e=`https://github.com/Pioreactor/CustoPiZer/releases/download/${r}/pioreactor_${n}.zip`;window.open(e,"_blank")}},disabled:""===r,style:{marginLeft:"10px"},children:["Download ",n," image"]})]})}const a={id:"software-set-up",description:"Install the Pioreactor software onto the Raspberry Pi",title:"Software installation",slug:"/software-set-up"},l=void 0,c={id:"getting-started/software-set-up",title:"Software installation",description:"Install the Pioreactor software onto the Raspberry Pi",source:"@site/user-guide/01-getting-started/02-software-set-up.mdx",sourceDirName:"01-getting-started",slug:"/software-set-up",permalink:"/user-guide/software-set-up",draft:!1,unlisted:!1,tags:[],version:"current",sidebarPosition:2,frontMatter:{id:"software-set-up",description:"Install the Pioreactor software onto the Raspberry Pi",title:"Software installation",slug:"/software-set-up"},sidebar:"tutorialSidebar",previous:{title:"Connect the optics system",permalink:"/user-guide/optics-assembly"},next:{title:"Preparing your vial for cultures",permalink:"/user-guide/prepare-vial-for-cultures"}},d={},h=[{value:"Before you begin",id:"before-you-begin",level:3},{value:"Setting up your Raspberry Pi",id:"setting-up-your-raspberry-pi",level:3},{value:"Adding additional workers to your cluster",id:"adding-additional-workers-to-your-cluster",level:2},{value:"Step 1. Install the worker software",id:"step-1-install-the-worker-software",level:4},{value:"Step 2. Add worker to cluster using the UI",id:"step-2-add-worker-to-cluster-using-the-ui",level:4},{value:"From the command line (Alternative)",id:"from-the-command-line-alternative",level:4},{value:"Troubleshooting",id:"troubleshooting",level:2},{value:"My leader Pioreactor never flashes the blue LED",id:"my-leader-pioreactor-never-flashes-the-blue-led",level:4},{value:"My Pioreactor keeps flashing the blue LED",id:"my-pioreactor-keeps-flashing-the-blue-led",level:4},{value:"My RPi won't connect to my WiFi.",id:"my-rpi-wont-connect-to-my-wifi",level:4},{value:"I want to change the Pioreactor name on installation of leader",id:"i-want-to-change-the-pioreactor-name-on-installation-of-leader",level:4},{value:"http://pioreactor.local in a web browser is not showing up",id:"httppioreactorlocal-in-a-web-browser-is-not-showing-up",level:4},{value:"Can I plug a monitor into the Raspberry Pi's HDMI port?",id:"can-i-plug-a-monitor-into-the-raspberry-pis-hdmi-port",level:4},{value:"I want a different leader-worker software version.",id:"i-want-a-different-leader-worker-software-version",level:4},{value:"I'd like to have the leader not be a worker, and only a standalone leader. Can I do that?",id:"id-like-to-have-the-leader-not-be-a-worker-and-only-a-standalone-leader-can-i-do-that",level:4}];function u(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h3,{id:"before-you-begin",children:"Before you begin"}),"\n",(0,t.jsxs)(n.p,{children:["You can expect the setup process to take 10-15 minutes. If you encounter any problems, feel free to email us for support at ",(0,t.jsx)(n.a,{href:"mailto:hello@pioreactor.com",children:"hello@pioreactor.com"}),"."]}),"\n",(0,t.jsxs)(n.admonition,{type:"info",children:[(0,t.jsx)(n.p,{children:"Before you get started, you'll need to have the following:"}),(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["A Raspberry Pi (our list of recommended Raspberry Pis is ",(0,t.jsx)(n.a,{href:"/user-guide/common-questions#what-raspberry-pi-hardware-can-i-use-i-see-raspberry-pi-1-2-3-4-a-b--zero---its-confusing",children:"here"}),")"]}),"\n",(0,t.jsxs)(n.li,{children:["A blank microSD card (our recommended microSD cards is ",(0,t.jsx)(n.a,{href:"/user-guide/common-questions#what-microsd-cards-do-you-recommend",children:"here"}),")"]}),"\n",(0,t.jsxs)(n.li,{children:["A suitable power supply for the Raspberry Pi (our recommended power supply units are ",(0,t.jsx)(n.a,{href:"/user-guide/common-questions#what-power-supply-unit-do-i-need",children:"here"}),")"]}),"\n",(0,t.jsx)(n.li,{children:"A computer with internet access and ability to read & write to a microSD card"}),"\n"]})]}),"\n",(0,t.jsx)(n.h3,{id:"setting-up-your-raspberry-pi",children:"Setting up your Raspberry Pi"}),"\n",(0,t.jsx)(n.p,{children:"We'll start your blank microSD card."}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["Download the ",(0,t.jsx)(n.a,{href:"https://github.com/pioreactor/custopizer/releases/latest/download/pioreactor_leader_worker.zip",children:"Pioreactor leader and worker image file"}),". Leave it as a zip (no need to unzip it)."]}),"\n"]}),"\n",(0,t.jsx)(n.admonition,{type:"info",children:(0,t.jsx)(n.p,{children:"What is an image file? It's a file that contains all the required software preinstalled on it, including an operating system and our custom Pioreactor software. The image will be installed on the microSD card."})}),"\n",(0,t.jsxs)(n.ol,{start:"2",children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Download the latest version of ",(0,t.jsx)(n.a,{href:"https://www.raspberrypi.org/software/",children:"Raspberry Pi Imager"})," for your operating system and install it."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Open the newly-installed Raspberry Pi Imager."}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Click ",(0,t.jsx)(n.strong,{children:"Choose Device"}),', and "No filtering" at the top.\n',(0,t.jsx)(n.img,{alt:"Click "Choose Device"",src:r(91461).Z+"",width:"1584",height:"1180"})]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Click ",(0,t.jsx)(n.strong,{children:"Choose OS"}),". Click on ",(0,t.jsx)(n.strong,{children:"Use custom"})," towards the bottom:\n",(0,t.jsx)(n.img,{alt:"Click "Choose OS"",src:r(50318).Z+"",width:"1584",height:"1180"}),"\n",(0,t.jsx)(n.img,{alt:"Select the "Use custom" option",src:r(18808).Z+"",width:"1584",height:"1120"}),"\nSelect the downloaded Pioreactor image from step 1."]}),"\n",(0,t.jsx)("img",{src:"/img/user-guide/select_new_image.png",alt:"Screenshot of the local computer's directory, selecting the downloaded image",width:"555",style:{margin:"auto",display:"block"}}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Insert your microSD card to your computer. After your microSD card is recognized by your computer, click ",(0,t.jsx)(n.strong,{children:"Choose Storage"})," and select it.\n",(0,t.jsx)(n.img,{alt:"Click "Choose storage"",src:r(54142).Z+"",width:"1584",height:"1180"})]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Click ",(0,t.jsx)(n.strong,{children:"Next"}),".\n",(0,t.jsx)(n.img,{alt:"Click Next",src:r(89994).Z+"",width:"1584",height:"1180"})]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Click ",(0,t.jsx)(n.strong,{children:"Edit settings"}),":"]}),"\n",(0,t.jsx)("img",{src:"/img/user-guide/choose-edit-settings.png",width:"525",alt:"Click edit settings",style:{margin:"auto",display:"block"}}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["Check ",(0,t.jsx)(n.strong,{children:"Set hostname"}),". Input a unique name for this Pioreactor. Some names that we use for our first Pioreactor: ",(0,t.jsx)(n.code,{children:"pioreactor01"}),", or ",(0,t.jsx)(n.code,{children:"leader"}),", or ",(0,t.jsx)(n.code,{children:"pio01"}),". ",(0,t.jsx)(n.em,{children:"Don't"})," use ",(0,t.jsx)(n.code,{children:"pioreactor"})," or ",(0,t.jsx)(n.code,{children:"raspberrypi"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["Check ",(0,t.jsx)(n.strong,{children:"Set username and password"}),". Enter the following:","\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"username"}),": ",(0,t.jsx)(n.code,{children:"pioreactor"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"password"}),": ",(0,t.jsx)(n.code,{children:"raspberry"}),"."]}),"\n",(0,t.jsx)(n.li,{children:"Note: You can change the username and password later."}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["Check ",(0,t.jsx)(n.strong,{children:"Configure wireless LAN"})," and enter your network name into SSID network name, WiFi password, and country. Or leave blank if using ethernet."]}),"\n"]}),"\n",(0,t.jsx)(n.admonition,{type:"tip",children:(0,t.jsxs)(n.p,{children:["If you are having difficulty connecting to a network, like at a university that may not easily incorporate Raspberry Pi's, ",(0,t.jsx)(n.a,{href:"/user-guide/local-access-point",children:"there's a built-in solution for creating a local access point"}),") and a ",(0,t.jsx)(n.a,{href:"/user-guide/internet-sharing",children:"solution for internet-sharing from a PC via ethernet"}),"."]})}),"\n",(0,t.jsxs)(n.ol,{start:"5",children:["\n",(0,t.jsx)(n.li,{children:"Change timezone to your local timezone."}),"\n",(0,t.jsxs)(n.li,{children:['Under the "Services" tab, check ',(0,t.jsx)(n.strong,{children:"Enable SSH"}),", and select ",(0,t.jsx)(n.strong,{children:"Use password authentication"}),"."]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"Your settings should look something like this:"}),"\n",(0,t.jsx)("img",{src:"/img/user-guide/rpi-imager-settings.png",width:"625",alt:"Screenshot of what your settings should look like",style:{margin:"auto",display:"block"}}),"\n",(0,t.jsx)("img",{src:"/img/user-guide/rpi-imager-settings-2.png",width:"625",alt:"Screenshot of what your settings should look like",style:{margin:"auto",display:"block"}}),"\n",(0,t.jsxs)(n.ol,{start:"6",children:["\n",(0,t.jsxs)(n.li,{children:["Click ",(0,t.jsx)(n.strong,{children:"Save"})," to save and exit the dialog box."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:['Click "Yes" to begin writing. A prompt ',(0,t.jsx)(n.em,{children:"may"})," appear asking for permission to write, accept it. Writing will take up to 5 minutes. Perfect time for a tea break."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Once writing is complete, remove the microSD card, and place it into the Raspberry Pi. ",(0,t.jsx)(n.strong,{children:"Your Raspberry Pi's power should be unplugged before inserting the microSD card"}),". The microSD slot is located on the PWM side of the Pioreactor. Example for a Raspberry Pi A model:"]}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"Insert the microSD card into a Raspberry Pi A model",src:r(89935).Z+"",width:"1000",height:"375"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Plug power into your Raspberry Pi. LEDs onboard the Raspberry Pi may start to light up momentarily. After ",(0,t.jsx)(n.strong,{children:"a few minutes"}),", your Pioreactor HAT will briefly blink a blue LED, telling us it is ready."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)("p",{align:"center",children:(0,t.jsx)("video",{width:"520",muted:!0,loop:"true",autoplay:"autoplay",children:(0,t.jsx)("source",{src:"/vid/flashing.mp4",type:"video/mp4"})})}),"\n",(0,t.jsx)(n.admonition,{type:"info",children:(0,t.jsxs)(n.p,{children:["Waited, but didn't see a blue LED blink, or maybe you missed it? Try pressing on the onboard button, near the side labelled \"PWM\", and pictured above. If this lights up the blue LED, you're good to move on. Still not working? Try power-cycling the Raspberry Pi, or email us at ",(0,t.jsx)(n.a,{href:"mailto:hello@pioreactor.com",children:"hello@pioreactor.com"}),"."]})}),"\n",(0,t.jsxs)(n.ol,{start:"9",children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["After observing the blue LED flashing, navigate to ",(0,t.jsx)(n.a,{href:"http://pioreactor.local",children:"http://pioreactor.local"})," in a web browser to visit the web interface. If you are using local-access-point, looking for a ",(0,t.jsx)(n.code,{children:"pioreactor"})," wifi network and then visit the link. (Not able to load ",(0,t.jsx)(n.a,{href:"http://pioreactor.local",children:"http://pioreactor.local"}),"? Read ",(0,t.jsx)(n.a,{href:"#pioreactorlocal-in-a-web-browser-is-not-showing-up",children:"Troubleshooting"})," below)."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["The Pioreactor is now ready for use! Follow ",(0,t.jsx)(n.a,{href:"/user-guide/prepare-vial-for-cultures",children:"this guide"})," to set up your first experiment."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.strong,{children:"If you're using a Pioreactor 20ml v1.0 (sold prior to May 2024) edit your config.ini to"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{children:"[pioreactor]\nmodel=pioreactor_20ml\nversion=1.0\n"})}),"\n",(0,t.jsxs)(n.p,{children:["You can find this in the UI -> Configuration -> select your Pioreactor's config.ini from the dropdown, edit, and save. Finally ",(0,t.jsx)(n.strong,{children:"reboot your Pioreactor"}),"."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"adding-additional-workers-to-your-cluster",children:"Adding additional workers to your cluster"}),"\n",(0,t.jsx)(n.p,{children:"Workers are additional Pioreactors that you can control from a single UI. Together, a leader and workers form a Pioreactor cluster."}),"\n",(0,t.jsx)(n.h4,{id:"step-1-install-the-worker-software",children:"Step 1. Install the worker software"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Download a ",(0,t.jsx)(n.em,{children:"worker image"}),":"]}),"\n",(0,t.jsx)(n.admonition,{type:"tip",children:(0,t.jsxs)(n.p,{children:["Check the software version of your leader first (you can find that on the Updates page, or the Inventory Page, or use ",(0,t.jsx)(n.code,{children:"pio version"})," on the command line). It's recommended to download the associated worker image for that same version."]})}),"\n",(0,t.jsx)(s,{type:"worker"}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Follow the same instructions above to write the image to an microSD card. All the settings are the same, including ",(0,t.jsx)(n.em,{children:"username"})," and ",(0,t.jsx)(n.em,{children:"password"}),", ",(0,t.jsx)(n.strong,{children:"but choose a new hostname"}),". See note below:"]}),"\n",(0,t.jsxs)(n.admonition,{type:"tip",children:[(0,t.jsxs)(n.p,{children:["Choose a hostname that isn't currently being used in your cluster, ex: ",(0,t.jsx)(n.code,{children:"worker01"}),", ",(0,t.jsx)(n.code,{children:"worker02"}),", etc. Re-using old names is fine, so long as that worker isn't present in your cluster."]}),(0,t.jsxs)(n.p,{children:["If you plan to have many Pioreactors, use a leading zero in any numbers, like ",(0,t.jsx)(n.code,{children:"pio01"}),", or ",(0,t.jsx)(n.code,{children:"worker01"}),", etc."]})]}),"\n",(0,t.jsx)(n.p,{children:"Below is a screenshot of example settings, your settings might be slightly different."}),"\n",(0,t.jsx)("img",{src:"/img/user-guide/rpi-imager-settings-worker.png",width:"625",alt:"Screenshot of what your settings may look like",style:{margin:"auto",display:"block"}}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["If using a local-access-point on your leader Pioreactor, use the wifi ssid ",(0,t.jsx)(n.code,{children:"pioreactor"})," and password ",(0,t.jsx)(n.code,{children:"raspberry"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"After the image is written to the microSD card, place the microSD card into the Raspberry Pi and power it on."}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"The Pioreactor's blue LED will light up and stay on, indicating that it's ready to be connected. Move onto the next step."}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h4,{id:"step-2-add-worker-to-cluster-using-the-ui",children:"Step 2. Add worker to cluster using the UI"}),"\n",(0,t.jsxs)(n.p,{children:["Follow the instructions ",(0,t.jsx)(n.a,{href:"/user-guide/create-cluster#adding-pioreactors-to-your-cluster",children:"here to add your worker to your Pioreactor cluster"}),"."]}),"\n",(0,t.jsxs)(n.h4,{id:"from-the-command-line-alternative",children:["From the command line ",(0,t.jsx)(n.em,{children:"(Alternative)"})]}),"\n",(0,t.jsxs)(n.p,{children:["On the leader's command line, the command ",(0,t.jsx)(n.code,{children:"pio add-pioreactor "})," will connect the new Pioreactor to the cluster."]}),"\n",(0,t.jsx)(n.admonition,{type:"tip",children:(0,t.jsxs)(n.p,{children:["We recommend running a ",(0,t.jsx)(n.a,{href:"/user-guide/running-self-test",children:"self-test"})," on all Pioreactors after your initial setup to detect any hardware bugs at this point."]})}),"\n",(0,t.jsx)(n.h2,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,t.jsx)(n.h4,{id:"my-leader-pioreactor-never-flashes-the-blue-led",children:"My leader Pioreactor never flashes the blue LED"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"First, confirm that when you press the HAT button, the blue LED does not show up. If it does, you're good to go."}),"\n",(0,t.jsx)(n.li,{children:"It's likely that the installation failed (due to a settings issue), or there is a problem with the SD card. Double check the settings that you used and try reinstalling the image."}),"\n",(0,t.jsxs)(n.li,{children:["Are you using a microSD card with a size ",(0,t.jsx)(n.em,{children:"larger"}),' than 32GB? You may need to reformat it to FAT32. To do this, in the Raspberry Pi Imager, first select "Erase: format card as FAT32" under "Choose OS". Then proceed with writing the image.']}),"\n"]}),"\n",(0,t.jsx)(n.h4,{id:"my-pioreactor-keeps-flashing-the-blue-led",children:"My Pioreactor keeps flashing the blue LED"}),"\n",(0,t.jsxs)(n.p,{children:["On a successful start, the Pioreactor will flash its blue LED for about 2 seconds. If you observe the blue LED flashing for longer, something may be wrong. You can diagnose the problem by ",(0,t.jsx)(n.a,{href:"/user-guide/error-codes",children:"counting the number of flashes observed"}),"."]}),"\n",(0,t.jsx)(n.h4,{id:"my-rpi-wont-connect-to-my-wifi",children:"My RPi won't connect to my WiFi."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["Some Raspberry Pis can't connect to Wifi natively, and some Raspberry Pis can only connect to 2.4GHz connections. See table below: ",(0,t.jsx)(n.a,{href:"https://user-images.githubusercontent.com/884032/105118696-e945dd00-5a9c-11eb-91f5-0cc77cdc1422.png",children:(0,t.jsx)(n.img,{src:"https://user-images.githubusercontent.com/884032/105118696-e945dd00-5a9c-11eb-91f5-0cc77cdc1422.png",alt:"Rpi and wifi"})}),(0,t.jsx)(n.a,{href:"https://user-images.githubusercontent.com/884032/105118696-e945dd00-5a9c-11eb-91f5-0cc77cdc1422.png"})]}),"\n",(0,t.jsx)(n.li,{children:"If you are using the built-in WiFi in a Raspberry Pi3, a Pi3B+, or Pi Zero W, be aware that the signal strength from the tiny internal antenna may be weaker than other WiFi devices. Try moving your Pioreactor closer to the router as a test."}),"\n",(0,t.jsxs)(n.li,{children:["If your network hidden? You will need to check ",(0,t.jsx)(n.code,{children:"hidden SSID"})," in the configuration in the Raspberry Pi imager. To fix this, you'll need to restart the image installation from the Raspberry Pi Imager."]}),"\n",(0,t.jsx)(n.li,{children:"Try power-cycling the Raspberry Pi (unplug and plug back in)."}),"\n",(0,t.jsxs)(n.li,{children:["If you are on a restrictive network (like at a university), and wish to avoid the network, ",(0,t.jsx)(n.a,{href:"/user-guide/local-access-point",children:"creating a local access point"})," may be a better option."]}),"\n",(0,t.jsx)(n.li,{children:"You may have mis-typed your WiFi credentials. To fix this, you'll need to restart the image installation from the Raspberry Pi Imager."}),"\n",(0,t.jsxs)(n.li,{children:["If connecting to a 5GHz WiFi connection, you ",(0,t.jsx)(n.em,{children:"need"})," to supply a valid country code. See the list here: ",(0,t.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2",title:"Link to country codes on wikipedia",children:"https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2/"}),"."]}),"\n",(0,t.jsx)(n.li,{children:"It's possible your SD card is damaged. This can cause all sorts of problems (including failing to boot), not just WiFi issues. The most common cause of SD card failure is probably inserting or removing the SD card while the Pi is powered up."}),"\n",(0,t.jsxs)(n.li,{children:["Check out some other possibilities ",(0,t.jsx)(n.a,{href:"https://community.octoprint.org/t/wifi-setup-and-troubleshooting/184#heading--troubleshooting",children:"here"}),"."]}),"\n"]}),"\n",(0,t.jsx)(n.h4,{id:"i-want-to-change-the-pioreactor-name-on-installation-of-leader",children:"I want to change the Pioreactor name on installation of leader"}),"\n",(0,t.jsx)(n.p,{children:"Easiest solution is to start over. You can edit the name in the RPi Imager, and reflash the image onto the microSD card to remove all previous data."}),"\n",(0,t.jsxs)(n.h4,{id:"httppioreactorlocal-in-a-web-browser-is-not-showing-up",children:[(0,t.jsx)(n.a,{href:"http://pioreactor.local",children:"http://pioreactor.local"})," in a web browser is not showing up"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["In your browser's address bar, add the ",(0,t.jsx)(n.code,{children:"http://"})," in front of the url, like so: ",(0,t.jsx)(n.code,{children:"http://pioreactor.local"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["Try appending a backslash as well: ",(0,t.jsx)(n.code,{children:"http://pioreactor.local/"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["The UI is hosted on ",(0,t.jsx)(n.strong,{children:"http"}),", not ",(0,t.jsx)(n.strong,{children:"https"}),". Check if you are accessing ",(0,t.jsx)(n.code,{children:"http"})," ",(0,t.jsx)(n.code,{children:"://pioreactor.local"}),", and ",(0,t.jsx)(n.em,{children:"not"})," ",(0,t.jsx)(n.code,{children:"https"})," ",(0,t.jsx)(n.code,{children:"://pioreactor.local"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["Try accessing using the url ",(0,t.jsx)(n.code,{children:"http://.local"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["If you know your Raspberry Pi's IP, try ",(0,t.jsx)(n.code,{children:"http://"}),". Here's ",(0,t.jsx)(n.a,{href:"/user-guide/common-questions#how-can-i-determine-the-pioreactors-ip-address",children:"information to determine the IP address"}),"."]}),"\n",(0,t.jsx)(n.li,{children:"When pressing the button on the HAT, does the blue LED show up? If not, installation may have failed. Try installing the image again, and double check the settings."}),"\n",(0,t.jsx)(n.li,{children:"Try power-cycling the Raspberry Pi (unplug and plug back in)."}),"\n",(0,t.jsxs)(n.li,{children:['In your Raspberry Pi Imager settings, confirm that you clicked "Set username and password", and used the username ',(0,t.jsx)(n.code,{children:"pioreactor"}),". If not, try ",(0,t.jsx)(n.a,{href:"/user-guide/software-set-up#setting-up-your-raspberry-pi",children:"reinstalling the image"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["Are you on an older Windows machine? You may need to install a DNS ",(0,t.jsx)(n.a,{href:"https://learn.adafruit.com/bonjour-zeroconf-networking-for-windows-and-linux/overview#microsoft-windows-914263-8",children:"service"}),", but also see workarounds ",(0,t.jsx)(n.a,{href:"https://github.com/OutsourcedGuru/octoprint-name-resolution-hacks",children:"here"}),"."]}),"\n"]}),"\n",(0,t.jsx)(n.h4,{id:"can-i-plug-a-monitor-into-the-raspberry-pis-hdmi-port",children:"Can I plug a monitor into the Raspberry Pi's HDMI port?"}),"\n",(0,t.jsx)(n.p,{children:"Our current software turns off all external displays (for power and compute reasons), so any external monitor attached to the Pi won't work."}),"\n",(0,t.jsx)(n.h4,{id:"i-want-a-different-leader-worker-software-version",children:"I want a different leader-worker software version."}),"\n",(0,t.jsx)(s,{type:"leader_worker"}),"\n",(0,t.jsxs)(n.h4,{id:"id-like-to-have-the-leader-not-be-a-worker-and-only-a-standalone-leader-can-i-do-that",children:["I'd like to have the leader ",(0,t.jsx)(n.em,{children:"not be a worker"}),", and only a standalone leader. Can I do that?"]}),"\n",(0,t.jsx)(n.p,{children:"Sure, we have a custom image that only has the leader software on it. See below:"}),"\n",(0,t.jsx)(s,{type:"leader"})]})}function p(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(u,{...e})}):u(e)}},3901:(e,n,r)=>{r.d(n,{Z:()=>s});r(67294);var t=r(93743);const i={tableOfContentsInline:"tableOfContentsInline_prmo"};var o=r(85893);function s(e){let{toc:n,minHeadingLevel:r,maxHeadingLevel:s}=e;return(0,o.jsx)("div",{className:i.tableOfContentsInline,children:(0,o.jsx)(t.Z,{toc:n,minHeadingLevel:r,maxHeadingLevel:s,className:"table-of-contents",linkClassName:null})})}},93743:(e,n,r)=>{r.d(n,{Z:()=>g});var t=r(67294),i=r(86668);function o(e){const n=e.map((e=>({...e,parentIndex:-1,children:[]}))),r=Array(7).fill(-1);n.forEach(((e,n)=>{const t=r.slice(2,e.level);e.parentIndex=Math.max(...t),r[e.level]=n}));const t=[];return n.forEach((e=>{const{parentIndex:r,...i}=e;r>=0?n[r].children.push(i):t.push(i)})),t}function s(e){let{toc:n,minHeadingLevel:r,maxHeadingLevel:t}=e;return n.flatMap((e=>{const n=s({toc:e.children,minHeadingLevel:r,maxHeadingLevel:t});return function(e){return e.level>=r&&e.level<=t}(e)?[{...e,children:n}]:n}))}function a(e){const n=e.getBoundingClientRect();return n.top===n.bottom?a(e.parentNode):n}function l(e,n){let{anchorTopOffset:r}=n;const t=e.find((e=>a(e).top>=r));if(t){return function(e){return e.top>0&&e.bottom{e.current=n?0:document.querySelector(".navbar").clientHeight}),[n]),e}function d(e){const n=(0,t.useRef)(void 0),r=c();(0,t.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:t,linkActiveClassName:i,minHeadingLevel:o,maxHeadingLevel:s}=e;function a(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(t),a=function(e){let{minHeadingLevel:n,maxHeadingLevel:r}=e;const t=[];for(let i=n;i<=r;i+=1)t.push(`h${i}.anchor`);return Array.from(document.querySelectorAll(t.join()))}({minHeadingLevel:o,maxHeadingLevel:s}),c=l(a,{anchorTopOffset:r.current}),d=e.find((e=>c&&c.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,r){r?(n.current&&n.current!==e&&n.current.classList.remove(i),e.classList.add(i),n.current=e):e.classList.remove(i)}(e,e===d)}))}return document.addEventListener("scroll",a),document.addEventListener("resize",a),a(),()=>{document.removeEventListener("scroll",a),document.removeEventListener("resize",a)}}),[e,r])}var h=r(39960),u=r(85893);function p(e){let{toc:n,className:r,linkClassName:t,isChild:i}=e;return n.length?(0,u.jsx)("ul",{className:i?void 0:r,children:n.map((e=>(0,u.jsxs)("li",{children:[(0,u.jsx)(h.Z,{to:`#${e.id}`,className:t??void 0,dangerouslySetInnerHTML:{__html:e.value}}),(0,u.jsx)(p,{isChild:!0,toc:e.children,className:r,linkClassName:t})]},e.id)))}):null}const m=t.memo(p);function g(e){let{toc:n,className:r="table-of-contents table-of-contents__left-border",linkClassName:a="table-of-contents__link",linkActiveClassName:l,minHeadingLevel:c,maxHeadingLevel:h,...p}=e;const g=(0,i.L)(),f=c??g.tableOfContents.minHeadingLevel,x=h??g.tableOfContents.maxHeadingLevel,j=function(e){let{toc:n,minHeadingLevel:r,maxHeadingLevel:i}=e;return(0,t.useMemo)((()=>s({toc:o(n),minHeadingLevel:r,maxHeadingLevel:i})),[n,r,i])}({toc:n,minHeadingLevel:f,maxHeadingLevel:x});return d((0,t.useMemo)((()=>{if(a&&l)return{linkClassName:a,linkActiveClassName:l,minHeadingLevel:f,maxHeadingLevel:x}}),[a,l,f,x])),(0,u.jsx)(m,{toc:j,className:r,linkClassName:a,...p})}},89994:(e,n,r)=>{r.d(n,{Z:()=>t});const t=r.p+"assets/images/choose-next-99e08c2f61c36e8235d1bac55d00ee89.png"},50318:(e,n,r)=>{r.d(n,{Z:()=>t});const t=r.p+"assets/images/choose-os-8124b1a42967a03237503524a6c8158c.png"},54142:(e,n,r)=>{r.d(n,{Z:()=>t});const t=r.p+"assets/images/choose-storage-da40660e2e7e9617ccfe235182066c99.png"},91461:(e,n,r)=>{r.d(n,{Z:()=>t});const t=r.p+"assets/images/choose_device-ba938d12596af89f9ab4f0f9b3806a49.png"},89935:(e,n,r)=>{r.d(n,{Z:()=>t});const t=r.p+"assets/images/place-micro-sd-card-77d8eb409d37006ac7742f9ec021307a.JPG"},18808:(e,n,r)=>{r.d(n,{Z:()=>t});const t=r.p+"assets/images/use_custom_image-33932c04d19243c39bb50742de143726.png"},11151:(e,n,r)=>{r.d(n,{Z:()=>a,a:()=>s});var t=r(67294);const i={},o=t.createContext(i);function s(e){const n=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/main.b64b2add.js b/assets/js/main.d45b6e26.js similarity index 99% rename from assets/js/main.b64b2add.js rename to assets/js/main.d45b6e26.js index 8052979b..a79b02a6 100644 --- a/assets/js/main.b64b2add.js +++ b/assets/js/main.d45b6e26.js @@ -1,2 +1,2 @@ -/*! For license information please see main.b64b2add.js.LICENSE.txt */ -(self.webpackChunkpioreactor=self.webpackChunkpioreactor||[]).push([[179],{723:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});n(67294);var r=n(68356),a=n.n(r),o=n(16887);const i={"003b35d7":[()=>n.e(9545).then(n.bind(n,77874)),"@site/user-guide/03-Extending your Pioreactor/04-Experiment Profiles/01-experiment-profiles-intro.md",77874],"00d2eda0":[()=>n.e(4469).then(n.bind(n,23895)),"@site/user-guide/50-Troubleshooting/Stirring troubleshooting.md",23895],"011272c3":[()=>n.e(7543).then(n.bind(n,9716)),"@site/developer-guide/10-Hardware/05-pinout.md",9716],"05dbb4f6":[()=>Promise.all([n.e(532),n.e(6390)]).then(n.bind(n,47169)),"@site/user-guide/01-getting-started/01-assembly_guides/03_pioreactor_20ml_v1.0/05-optics-assembly.md",47169],"063154f2":[()=>n.e(8756).then(n.bind(n,77299)),"@site/user-guide/29-Automations/04-writing-automations.md",77299],"07a88ca4":[()=>n.e(5953).then(n.t.bind(n,44654,19)),"~docs/experiments/version-current-metadata-prop-751.json",44654],"0be1c1c9":[()=>n.e(7197).then(n.bind(n,5631)),"@site/user-guide/30-Advanced/02-networking/01-internet-sharing.md",5631],"0fa95718":[()=>Promise.all([n.e(532),n.e(3582)]).then(n.bind(n,26429)),"@site/experiments/02-Secondary level education/low-vs-high-conc-media.md",26429],"12af2043":[()=>n.e(9631).then(n.bind(n,43483)),"@site/user-guide/50-Troubleshooting/Hardware troubleshooting.md",43483],"1305c50d":[()=>n.e(6094).then(n.bind(n,56091)),"@site/user-guide/30-Advanced/07-remote-access/03-tailscale.md",56091],17896441:[()=>Promise.all([n.e(532),n.e(7918)]).then(n.bind(n,49618)),"@theme/DocItem",49618],"17e57afd":[()=>n.e(8961).then(n.bind(n,92544)),"@site/user-guide/03-Extending your Pioreactor/04-Experiment Profiles/02-create-edit-experiment-profiles.md",92544],"1a4e3797":[()=>Promise.all([n.e(532),n.e(7920)]).then(n.bind(n,51473)),"@theme/SearchPage",51473],"1aa51b29":[()=>n.e(8470).then(n.bind(n,90920)),"@site/user-guide/02-Experiment basics/09-od-normal-growth-rate.md",90920],"1f29aed5":[()=>n.e(8289).then(n.t.bind(n,43177,19)),"~docs/developer-guide/version-current-metadata-prop-751.json",43177],"242a2306":[()=>Promise.all([n.e(532),n.e(5879)]).then(n.bind(n,18270)),"@site/experiments/02-Secondary level education/yeast-in-ethanol.md",18270],"270e3b24":[()=>n.e(3255).then(n.bind(n,98338)),"@site/developer-guide/09-Storage and the filesystem/02-filesystem.md",98338],"275a01bc":[()=>n.e(935).then(n.bind(n,10425)),"@site/developer-guide/20-User interface/04-adding-charts.md",10425],"27a03a91":[()=>Promise.all([n.e(532),n.e(7615)]).then(n.bind(n,79079)),"@site/experiments/03-University level education/00-continuous-cultures-using-turbidostat.md",79079],28292353:[()=>Promise.all([n.e(532),n.e(9056)]).then(n.bind(n,22117)),"@site/user-guide/03-Extending your Pioreactor/06a-using-community-plugins.mdx",22117],"2ad4a15f":[()=>Promise.all([n.e(532),n.e(5525)]).then(n.bind(n,59982)),"@site/user-guide/01-getting-started/01-assembly_guides/01_pioreactor_20ml_v1.1/03-v11-wetware-assembly.md",59982],"2b5b8f8a":[()=>n.e(6217).then(n.bind(n,35056)),"@site/user-guide/03-Extending your Pioreactor/11-using-stemma-qt.md",35056],"2c924c11":[()=>Promise.all([n.e(532),n.e(4962)]).then(n.bind(n,25254)),"@site/experiments/01-Introduction.md",25254],"2d7bf355":[()=>n.e(7118).then(n.bind(n,76248)),"@site/developer-guide/20-User interface/01-introduction.md",76248],"2dd9ad3f":[()=>Promise.all([n.e(532),n.e(4934)]).then(n.bind(n,5488)),"@site/user-guide/01-getting-started/01-assembly_guides/03_pioreactor_20ml_v1.0/04-faceplate-all-together.md",5488],"2fd9ad7f":[()=>n.e(2516).then(n.t.bind(n,38070,19)),"~docs/experiments/tag-experiments-tags-salt-717.json",38070],"306898ad":[()=>Promise.all([n.e(532),n.e(1691)]).then(n.bind(n,97468)),"@site/user-guide/01-getting-started/01-assembly_guides/01_pioreactor_20ml_v1.1/01-v11-introduction.md",97468],"333a627e":[()=>n.e(4334).then(n.bind(n,54813)),"@site/user-guide/30-Advanced/07-remote-access/02-ngrok.md",54813],"3720c009":[()=>Promise.all([n.e(532),n.e(3751)]).then(n.bind(n,9861)),"@theme/DocTagsListPage",9861],"3ab34b0a":[()=>n.e(2939).then(n.t.bind(n,21060,19)),"~docs/experiments/tags-list-current-prop-15a.json",21060],"3b1fd47b":[()=>n.e(4304).then(n.t.bind(n,76650,19)),"~docs/experiments/tag-experiments-tags-caffeine-17d.json",76650],"3b424f39":[()=>n.e(1981).then(n.bind(n,29167)),"@site/user-guide/03-Extending your Pioreactor/01-cluster-management/01-create-cluster.md",29167],"3c3add90":[()=>n.e(2084).then(n.bind(n,71279)),"@site/developer-guide/20-User interface/02-api.md",71279],"433fc4eb":[()=>Promise.all([n.e(532),n.e(301)]).then(n.bind(n,37916)),"@site/user-guide/02-Experiment basics/04-set-up-an-experiment.md",37916],"4618fa18":[()=>n.e(1326).then(n.bind(n,90545)),"@site/developer-guide/30-Development/01-local-development.md",90545],"496d660a":[()=>n.e(6682).then(n.bind(n,40783)),"@site/developer-guide/03-Background jobs/03-avoiding-od.md",40783],"4b7e99ca":[()=>n.e(7062).then(n.bind(n,93107)),"@site/user-guide/02-Experiment basics/06-monitor-experiment.md",93107],"54bf282b":[()=>Promise.all([n.e(532),n.e(9963)]).then(n.bind(n,44751)),"@site/experiments/02-Secondary level education/salt-stress-on-yeast.md",44751],"55bdb91f":[()=>n.e(3700).then(n.t.bind(n,15745,19)),"/home/runner/work/docs.pioreactor/docs.pioreactor/.docusaurus/docusaurus-plugin-content-pages/default/plugin-route-context-module-100.json",15745],"582d4a8c":[()=>n.e(3796).then(n.bind(n,81567)),"@site/user-guide/30-Advanced/07-remote-access/01-introduction.md",81567],"58be8993":[()=>Promise.all([n.e(532),n.e(3963)]).then(n.bind(n,52176)),"@site/experiments/02-Secondary level education/caffeine-inhibition.md",52176],"5a51baf4":[()=>n.e(3298).then(n.t.bind(n,5370,19)),"~docs/experiments/tag-experiments-tags-control-549.json",5370],"5c89fd85":[()=>Promise.all([n.e(532),n.e(7478)]).then(n.bind(n,9452)),"@site/user-guide/01-getting-started/01-assembly_guides/03_pioreactor_20ml_v1.0/03-wetware-assembly.md",9452],"5ca67ec2":[()=>Promise.all([n.e(532),n.e(235)]).then(n.bind(n,23367)),"@site/user-guide/01-getting-started/01-assembly_guides/03_pioreactor_20ml_v1.0/01-introduction.md",23367],"5e774627":[()=>n.e(3543).then(n.bind(n,47721)),"@site/developer-guide/05-Scripts/01-writing-scripts.md",47721],"5e95c892":[()=>n.e(9661).then(n.bind(n,41892)),"@theme/DocsRoot",41892],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,36809)),"@generated/docusaurus.config",36809],"6023936b":[()=>Promise.all([n.e(532),n.e(1386)]).then(n.bind(n,72175)),"@site/experiments/04-Research and beyond/directed-evolution-salt-tolerance.md",72175],"60a56950":[()=>n.e(5542).then(n.bind(n,5156)),"@site/developer-guide/07-Plugins/03-plugin-as-python-package.md",5156],61980625:[()=>n.e(5707).then(n.bind(n,45046)),"@site/developer-guide/09-Storage and the filesystem/01-data-stores/03_mqtt.md",45046],"622dee83":[()=>n.e(8596).then(n.bind(n,95980)),"@site/user-guide/30-Advanced/02-networking/10-networking.md",95980],"6293b6ce":[()=>n.e(5214).then(n.bind(n,81298)),"@site/user-guide/30-Advanced/02-networking/06-local-access-point.md",81298],"65af3e53":[()=>n.e(1294).then(n.bind(n,23083)),"@site/developer-guide/09-Storage and the filesystem/01-data-stores/02-sqlite.md",23083],"6c06c3a0":[()=>n.e(3786).then(n.bind(n,18510)),"@site/developer-guide/09-Storage and the filesystem/01-data-stores/01-data-stores-intro.md",18510],"6e112274":[()=>n.e(2554).then(n.bind(n,51354)),"@site/user-guide/02-Experiment basics/08-export-data.md",51354],"6f4861e3":[()=>n.e(2057).then(n.bind(n,62195)),"@site/developer-guide/03-Background jobs/01-intro-background-jobs.md",62195],"741d3c43":[()=>n.e(3866).then(n.bind(n,26229)),"@site/user-guide/03-Extending your Pioreactor/04-Experiment Profiles/10-experiment-profiles-schema.md",26229],"7aaba939":[()=>n.e(9155).then(n.bind(n,45272)),"@site/user-guide/50-Troubleshooting/04-error-codes.md",45272],"7b2a33b6":[()=>n.e(2369).then(n.bind(n,4372)),"@site/user-guide/02-Experiment basics/05-Activities.md",4372],"7c1ae5e6":[()=>n.e(5856).then(n.bind(n,65165)),"@site/developer-guide/03-Background jobs/02-writing-background-jobs.md",65165],"7cd291a4":[()=>n.e(1823).then(n.bind(n,87998)),"@site/user-guide/30-Advanced/16-export-import-existing-data.md",87998],"7dada797":[()=>n.e(9344).then(n.bind(n,98067)),"@site/user-guide/29-Automations/03-led-automations.md",98067],"7ee13ef4":[()=>n.e(4066).then(n.bind(n,8858)),"@site/developer-guide/07-Plugins/01-intro-plugins.md",8858],"81ab6d50":[()=>n.e(4211).then(n.bind(n,20774)),"@site/user-guide/30-Advanced/00-accessing-raspberry-pi.md",20774],"81b74097":[()=>Promise.all([n.e(8187),n.e(7445)]).then(n.bind(n,38230)),"@site/user-guide/03-Extending your Pioreactor/06b-list-of-plugins.mdx",38230],"877afda0":[()=>n.e(4286).then(n.bind(n,22851)),"@site/developer-guide/09-Storage and the filesystem/01-data-stores/local_storage.md",22851],"896ec0e8":[()=>n.e(939).then(n.bind(n,78065)),"@site/developer-guide/20-User interface/03-example-api.md",78065],"89efa1e0":[()=>Promise.all([n.e(532),n.e(3463)]).then(n.bind(n,10720)),"@site/experiments/02-Secondary level education/01-control-testing.md",10720],"8ee85411":[()=>n.e(804).then(n.t.bind(n,83769,19)),"/home/runner/work/docs.pioreactor/docs.pioreactor/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",83769],"913b8639":[()=>n.e(8093).then(n.bind(n,54298)),"@site/user-guide/00-introduction.md",54298],92376444:[()=>n.e(4522).then(n.bind(n,41554)),"@site/user-guide/29-Automations/00-intro-to-automations.md",41554],"935f2afb":[()=>n.e(53).then(n.t.bind(n,1109,19)),"~docs/default/version-current-metadata-prop-751.json",1109],"9659efb8":[()=>Promise.all([n.e(532),n.e(5984)]).then(n.bind(n,32775)),"@site/experiments/04-Research and beyond/temp-cycle.md",32775],"9692f74e":[()=>n.e(3270).then(n.bind(n,13287)),"@site/user-guide/30-Advanced/07-additional-hardware/99-hardware-connection-assembly.md",13287],"9730623d":[()=>n.e(3787).then(n.bind(n,70097)),"@site/user-guide/03-Extending your Pioreactor/01-cluster-management/02-power-cluster.md",70097],"99ba85f0":[()=>Promise.all([n.e(532),n.e(2352)]).then(n.bind(n,19702)),"@site/user-guide/01-getting-started/01-assembly_guides/02_pioreactor_20ml_v1.0_to_v1.1/01-version-upgrade.md",19702],"9c7dcd7f":[()=>Promise.all([n.e(532),n.e(9940)]).then(n.bind(n,63864)),"@site/user-guide/01-getting-started/01-assembly_guides/02_pioreactor_20ml_v1.0_to_v1.1/05-optics-reassembly.md",63864],"9d23e5ef":[()=>n.e(1741).then(n.t.bind(n,95078,19)),"~docs/experiments/tag-experiments-tags-temperature-d68.json",95078],a4165bd8:[()=>n.e(1069).then(n.bind(n,61611)),"@site/user-guide/03-Extending your Pioreactor/09-external-power.md",61611],a7bd4aaa:[()=>n.e(8518).then(n.bind(n,8564)),"@theme/DocVersionRoot",8564],a888ed47:[()=>n.e(842).then(n.bind(n,45564)),"@site/user-guide/30-Advanced/01-cli.md",45564],a891e202:[()=>Promise.all([n.e(532),n.e(156)]).then(n.bind(n,51058)),"@site/user-guide/03-Extending your Pioreactor/08-hardware-calibrations.md",51058],a94703ab:[()=>Promise.all([n.e(532),n.e(4368)]).then(n.bind(n,12674)),"@theme/DocRoot",12674],afe9f542:[()=>n.e(5733).then(n.bind(n,39505)),"@site/user-guide/02-Experiment basics/10-manual-led-dosing.md",39505],b053ee98:[()=>Promise.all([n.e(532),n.e(4161)]).then(n.bind(n,44239)),"@site/user-guide/03-Extending your Pioreactor/03-adding-leds.md",44239],b3a861a3:[()=>n.e(9081).then(n.bind(n,93596)),"@site/user-guide/03-Extending your Pioreactor/20-updating-software.md",93596],b4cc13e2:[()=>Promise.all([n.e(532),n.e(5169)]).then(n.bind(n,84838)),"@site/user-guide/03-Extending your Pioreactor/07-using-pumps.md",84838],b504501c:[()=>Promise.all([n.e(532),n.e(3018)]).then(n.bind(n,47802)),"@site/user-guide/29-Automations/02-dosing-automations.md",47802],b5dcdecc:[()=>n.e(9514).then(n.bind(n,62273)),"@site/developer-guide/30-Development/02-development-on-Raspberry-Pi.md",62273],b9d0f450:[()=>n.e(4254).then(n.bind(n,83680)),"@site/user-guide/30-Advanced/07-additional-hardware/02-pinch-valves.md",83680],b9f7fcdb:[()=>n.e(7043).then(n.t.bind(n,79318,19)),"~docs/experiments/tag-experiments-tags-ethanol-a7b.json",79318],ba53f54e:[()=>n.e(4583).then(n.bind(n,49148)),"@site/user-guide/02-Experiment basics/11-running-self-test.md",49148],ba87e863:[()=>n.e(5665).then(n.bind(n,91475)),"@site/developer-guide/04-Automations/03-writing-automations-2.md",91475],bd51d30e:[()=>n.e(4529).then(n.bind(n,43559)),"@site/developer-guide/10-Hardware/06-button-down.md",43559],be95d305:[()=>Promise.all([n.e(532),n.e(6820)]).then(n.bind(n,43727)),"@site/user-guide/01-getting-started/01-assembly_guides/02_pioreactor_20ml_v1.0_to_v1.1/03-build-vial-holder.md",43727],bfe43e66:[()=>Promise.all([n.e(532),n.e(9871)]).then(n.bind(n,10847)),"@site/user-guide/01-getting-started/00-gettingstarted.mdx",10847],c0383162:[()=>n.e(9446).then(n.t.bind(n,12702,19)),"~docs/experiments/tag-experiments-tags-university-education-92d.json",12702],c0a440a7:[()=>n.e(7046).then(n.bind(n,50010)),"@site/developer-guide/02-important-concepts.md",50010],c4f5d8e4:[()=>Promise.all([n.e(532),n.e(4195)]).then(n.bind(n,59335)),"@site/src/pages/index.js",59335],c61c48fd:[()=>n.e(8095).then(n.t.bind(n,69609,19)),"~docs/experiments/tag-experiments-tags-yeast-4fe.json",69609],c982b89f:[()=>Promise.all([n.e(532),n.e(2519)]).then(n.bind(n,15461)),"@site/user-guide/01-getting-started/01-assembly_guides/01_pioreactor_20ml_v1.1/02-v11-rpi-hat-assembly.md",15461],ca4bdbc2:[()=>n.e(508).then(n.bind(n,18040)),"@site/developer-guide/99-architecture.md",18040],cbc1afae:[()=>n.e(3418).then(n.t.bind(n,35591,19)),"~docs/experiments/tag-experiments-tags-turbidostat-a78.json",35591],cef17ed2:[()=>Promise.all([n.e(532),n.e(8578)]).then(n.bind(n,84869)),"@site/experiments/03-University level education/01-algae-day-night-cycle.md",84869],cf4872bb:[()=>n.e(8720).then(n.bind(n,66953)),"@site/user-guide/30-Advanced/07-additional-hardware/01-pumps.md",66953],d46cf9e1:[()=>n.e(7849).then(n.bind(n,25357)),"@site/user-guide/30-Advanced/15-intro-python-scripting.md",25357],d51704e4:[()=>n.e(7691).then(n.t.bind(n,12776,19)),"/home/runner/work/docs.pioreactor/docs.pioreactor/.docusaurus/@easyops-cn/docusaurus-search-local/default/plugin-route-context-module-100.json",12776],d53b0e99:[()=>Promise.all([n.e(532),n.e(258)]).then(n.bind(n,34859)),"@site/experiments/02-Secondary level education/yeast-growth-by-temperature.md",34859],d5df37f5:[()=>n.e(5125).then(n.t.bind(n,77966,19)),"~docs/experiments/tag-experiments-tags-continuous-culture-051.json",77966],d5df4937:[()=>Promise.all([n.e(532),n.e(1179)]).then(n.bind(n,1017)),"@site/user-guide/99-common-questions.mdx",1017],d92ee6a6:[()=>n.e(4459).then(n.bind(n,90688)),"@site/user-guide/50-Troubleshooting/Power troubleshooting.md",90688],df063027:[()=>n.e(6911).then(n.bind(n,12170)),"@site/user-guide/29-Automations/01-temperature-automations.md",12170],df203c0f:[()=>Promise.all([n.e(532),n.e(9924)]).then(n.bind(n,40491)),"@theme/DocTagDocListPage",40491],df71d8ce:[()=>n.e(5204).then(n.t.bind(n,91275,19)),"/home/runner/work/docs.pioreactor/docs.pioreactor/.docusaurus/docusaurus-plugin-content-docs/experiments/plugin-route-context-module-100.json",91275],e2f2dfe9:[()=>n.e(2515).then(n.bind(n,35205)),"@site/developer-guide/01-introduction.md",35205],e4b799f3:[()=>Promise.all([n.e(532),n.e(8688)]).then(n.bind(n,10784)),"@site/user-guide/01-getting-started/02-software-set-up.mdx",10784],e63f9848:[()=>Promise.all([n.e(532),n.e(7955)]).then(n.bind(n,29475)),"@site/user-guide/03-Extending your Pioreactor/05-calibrate-od600.md",29475],e67d5fa3:[()=>n.e(1057).then(n.bind(n,5559)),"@site/user-guide/02-Experiment basics/02-prepare-vial-for-cultures.md",5559],e8b7a5c5:[()=>Promise.all([n.e(532),n.e(7124)]).then(n.bind(n,37338)),"@site/user-guide/01-getting-started/01-assembly_guides/02_pioreactor_20ml_v1.0_to_v1.1/04-pioreactor-reassembly.md",37338],e8d327cb:[()=>n.e(8033).then(n.bind(n,66033)),"@site/developer-guide/25-Calibrations/01-Calibrations.md",66033],e91ab90f:[()=>n.e(575).then(n.bind(n,80404)),"@site/developer-guide/04-Automations/01-intro-automations.md",80404],eb6e170c:[()=>n.e(1699).then(n.bind(n,37221)),"@site/developer-guide/08-Custom pumps/20-writing-pump-software.md",37221],eba206dc:[()=>n.e(3916).then(n.t.bind(n,24224,19)),"~docs/experiments/tag-experiments-tags-seconday-education-f0e.json",24224],ebcf55cf:[()=>n.e(2829).then(n.bind(n,54612)),"@site/developer-guide/04-Automations/02-writing-automations-1.md",54612],edd8515e:[()=>Promise.all([n.e(532),n.e(657)]).then(n.bind(n,95403)),"@site/user-guide/01-getting-started/01-assembly_guides/02_pioreactor_20ml_v1.0_to_v1.1/02-pioreactor-disassembly.md",95403],f0e1c95b:[()=>Promise.all([n.e(532),n.e(895)]).then(n.bind(n,59376)),"@site/user-guide/01-getting-started/01-assembly_guides/01_pioreactor_20ml_v1.1/05-v11-optics-assembly.md",59376],f1e83790:[()=>n.e(5867).then(n.t.bind(n,18020,19)),"~docs/experiments/tag-experiments-tags-secondary-education-aef.json",18020],f2e19255:[()=>Promise.all([n.e(532),n.e(9828)]).then(n.bind(n,51793)),"@site/user-guide/01-getting-started/01-assembly_guides/03_pioreactor_20ml_v1.0/02-rpi-hat-assembly.md",51793],f565d366:[()=>n.e(2305).then(n.bind(n,57432)),"@site/user-guide/50-Troubleshooting/UI troubleshooting.md",57432],f5935d94:[()=>n.e(5790).then(n.bind(n,8547)),"@site/developer-guide/04-Automations/05-events.md",8547],f6cabd81:[()=>n.e(6651).then(n.t.bind(n,30980,19)),"/home/runner/work/docs.pioreactor/docs.pioreactor/.docusaurus/docusaurus-plugin-content-docs/developer-guide/plugin-route-context-module-100.json",30980],f738ccb2:[()=>n.e(3073).then(n.bind(n,16141)),"@site/developer-guide/07-Plugins/02-adding-plugins-to-ui.md",16141],fb3a9273:[()=>n.e(6845).then(n.bind(n,58027)),"@site/user-guide/03-Extending your Pioreactor/05-configuration.md",58027],fb40132f:[()=>Promise.all([n.e(532),n.e(2723)]).then(n.bind(n,64559)),"@site/user-guide/01-getting-started/01-assembly_guides/01_pioreactor_20ml_v1.1/04-v11-faceplate-all-together.md",64559],fb56bb93:[()=>n.e(6405).then(n.t.bind(n,73477,19)),"~docs/experiments/tag-experiments-tags-nutrient-746.json",73477],fc13d485:[()=>n.e(5433).then(n.bind(n,75614)),"@site/developer-guide/10-Hardware/05-i2c-addresses.md",75614],fdd92877:[()=>Promise.all([n.e(532),n.e(3687)]).then(n.bind(n,58942)),"@site/user-guide/03-Extending your Pioreactor/30-Upgrade kits/12-temperature-expansion-kit.md",58942]};var s=n(85893);function l(e){let{error:t,retry:n,pastDelay:r}=e;return t?(0,s.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,s.jsx)("p",{children:String(t)}),(0,s.jsx)("div",{children:(0,s.jsx)("button",{type:"button",onClick:n,children:"Retry"})})]}):r?(0,s.jsx)("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:(0,s.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,s.jsxs)("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2",children:[(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,s.jsx)("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,s.jsx)("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,s.jsx)("circle",{cx:"22",cy:"22",r:"8",children:(0,s.jsx)("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"})})]})})}):null}var u=n(99670),c=n(30226);function d(e,t){if("*"===e)return a()({loading:l,loader:()=>n.e(1772).then(n.bind(n,51772)),modules:["@theme/NotFound"],webpack:()=>[51772],render(e,t){const n=e.default;return(0,s.jsx)(c.z,{value:{plugin:{name:"native",id:"default"}},children:(0,s.jsx)(n,{...t})})}});const r=o[`${e}-${t}`],d={},p=[],f=[],m=(0,u.Z)(r);return Object.entries(m).forEach((e=>{let[t,n]=e;const r=i[n];r&&(d[t]=r[0],p.push(r[1]),f.push(r[2]))})),a().Map({loading:l,loader:d,modules:p,webpack:()=>f,render(t,n){const a=JSON.parse(JSON.stringify(r));Object.entries(t).forEach((t=>{let[n,r]=t;const o=r.default;if(!o)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof o&&"function"!=typeof o||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{o[e]=r[e]}));let i=a;const s=n.split(".");s.slice(0,-1).forEach((e=>{i=i[e]})),i[s[s.length-1]]=o}));const o=a.__comp;delete a.__comp;const i=a.__context;return delete a.__context,(0,s.jsx)(c.z,{value:i,children:(0,s.jsx)(o,{...a,...n})})}})}const p=[{path:"/search",component:d("/search","2d8"),exact:!0},{path:"/developer-guide",component:d("/developer-guide","ffd"),routes:[{path:"/developer-guide",component:d("/developer-guide","f60"),routes:[{path:"/developer-guide",component:d("/developer-guide","087"),routes:[{path:"/developer-guide/adding-calibration-type",component:d("/developer-guide/adding-calibration-type","29d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/adding-plugins-to-ui",component:d("/developer-guide/adding-plugins-to-ui","8f5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/architecture",component:d("/developer-guide/architecture","e8b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/avoiding-od",component:d("/developer-guide/avoiding-od","6f9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/chart-to-ui",component:d("/developer-guide/chart-to-ui","52d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/data-stores-intro",component:d("/developer-guide/data-stores-intro","d51"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/events",component:d("/developer-guide/events","b12"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/examples-api",component:d("/developer-guide/examples-api","663"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/filesystem-locations",component:d("/developer-guide/filesystem-locations","5a3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/hat-button",component:d("/developer-guide/hat-button","060"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/i2c-addresses",component:d("/developer-guide/i2c-addresses","1f5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/important-concepts",component:d("/developer-guide/important-concepts","6d2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/intro-automations",component:d("/developer-guide/intro-automations","956"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/intro-background-jobs",component:d("/developer-guide/intro-background-jobs","2c2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/intro-plugins",component:d("/developer-guide/intro-plugins","62c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/introduction",component:d("/developer-guide/introduction","191"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/local-development",component:d("/developer-guide/local-development","8d9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/local-storage",component:d("/developer-guide/local-storage","59f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/mqtt",component:d("/developer-guide/mqtt","617"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/pi-development",component:d("/developer-guide/pi-development","1f8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/pinout",component:d("/developer-guide/pinout","d7b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/plugin-as-python-package",component:d("/developer-guide/plugin-as-python-package","7d8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/sqlite3",component:d("/developer-guide/sqlite3","261"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/web-ui-api",component:d("/developer-guide/web-ui-api","ead"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/web-ui-introduction",component:d("/developer-guide/web-ui-introduction","0ae"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/writing-automations-1",component:d("/developer-guide/writing-automations-1","f5c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/writing-automations-2",component:d("/developer-guide/writing-automations-2","af5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/writing-background-jobs",component:d("/developer-guide/writing-background-jobs","a33"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/writing-pump-software",component:d("/developer-guide/writing-pump-software","6fa"),exact:!0,sidebar:"tutorialSidebar"},{path:"/developer-guide/writing-scripts",component:d("/developer-guide/writing-scripts","7c7"),exact:!0,sidebar:"tutorialSidebar"}]}]}]},{path:"/experiments",component:d("/experiments","9d4"),routes:[{path:"/experiments",component:d("/experiments","d46"),routes:[{path:"/experiments/tags",component:d("/experiments/tags","800"),exact:!0},{path:"/experiments/tags/caffeine",component:d("/experiments/tags/caffeine","ae9"),exact:!0},{path:"/experiments/tags/continuous-culture",component:d("/experiments/tags/continuous-culture","800"),exact:!0},{path:"/experiments/tags/control",component:d("/experiments/tags/control","603"),exact:!0},{path:"/experiments/tags/ethanol",component:d("/experiments/tags/ethanol","d0e"),exact:!0},{path:"/experiments/tags/nutrient",component:d("/experiments/tags/nutrient","c3e"),exact:!0},{path:"/experiments/tags/salt",component:d("/experiments/tags/salt","e3c"),exact:!0},{path:"/experiments/tags/secondary-education",component:d("/experiments/tags/secondary-education","1cf"),exact:!0},{path:"/experiments/tags/seconday-education",component:d("/experiments/tags/seconday-education","39f"),exact:!0},{path:"/experiments/tags/temperature",component:d("/experiments/tags/temperature","c3f"),exact:!0},{path:"/experiments/tags/turbidostat",component:d("/experiments/tags/turbidostat","4c0"),exact:!0},{path:"/experiments/tags/university-education",component:d("/experiments/tags/university-education","313"),exact:!0},{path:"/experiments/tags/yeast",component:d("/experiments/tags/yeast","789"),exact:!0},{path:"/experiments",component:d("/experiments","0c6"),routes:[{path:"/experiments/algae-day-night-cycle",component:d("/experiments/algae-day-night-cycle","2b8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/experiments/caffeine-inhibition",component:d("/experiments/caffeine-inhibition","bde"),exact:!0,sidebar:"tutorialSidebar"},{path:"/experiments/continuous-cultures-using-turbidostat",component:d("/experiments/continuous-cultures-using-turbidostat","4d1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/experiments/control-testing",component:d("/experiments/control-testing","541"),exact:!0,sidebar:"tutorialSidebar"},{path:"/experiments/directed-evolution-salt-tolerance",component:d("/experiments/directed-evolution-salt-tolerance","eed"),exact:!0,sidebar:"tutorialSidebar"},{path:"/experiments/introduction",component:d("/experiments/introduction","803"),exact:!0,sidebar:"tutorialSidebar"},{path:"/experiments/low-vs-high-conc-media",component:d("/experiments/low-vs-high-conc-media","00f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/experiments/salt-stress-on-yeast",component:d("/experiments/salt-stress-on-yeast","42c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/experiments/temp-cycle",component:d("/experiments/temp-cycle","7c1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/experiments/yeast-growth-by-temperature",component:d("/experiments/yeast-growth-by-temperature","022"),exact:!0,sidebar:"tutorialSidebar"},{path:"/experiments/yeast-in-ethanol",component:d("/experiments/yeast-in-ethanol","a49"),exact:!0,sidebar:"tutorialSidebar"}]}]}]},{path:"/user-guide",component:d("/user-guide","aef"),routes:[{path:"/user-guide",component:d("/user-guide","d8e"),routes:[{path:"/user-guide",component:d("/user-guide","e9b"),routes:[{path:"/user-guide/20ml-v11-hardware-setup-intro",component:d("/user-guide/20ml-v11-hardware-setup-intro","86d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/20ml-v11-optics-assembly",component:d("/user-guide/20ml-v11-optics-assembly","070"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/20ml-v11-putting-it-together",component:d("/user-guide/20ml-v11-putting-it-together","039"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/20ml-v11-rpi-hat-assembly",component:d("/user-guide/20ml-v11-rpi-hat-assembly","7c4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/20ml-v11-wetware-assembly",component:d("/user-guide/20ml-v11-wetware-assembly","6de"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/accessing-raspberry-pi",component:d("/user-guide/accessing-raspberry-pi","bfa"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/activities",component:d("/user-guide/activities","aaa"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/addition-hardware-pumps",component:d("/user-guide/addition-hardware-pumps","d50"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/available-plugins",component:d("/user-guide/available-plugins","5b2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/calibrate-od600",component:d("/user-guide/calibrate-od600","ca7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/cli",component:d("/user-guide/cli","31e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/common-questions",component:d("/user-guide/common-questions","83c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/configuration",component:d("/user-guide/configuration","15c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/create-cluster",component:d("/user-guide/create-cluster","689"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/create-edit-experiment-profiles",component:d("/user-guide/create-edit-experiment-profiles","8d2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/dosing-automations",component:d("/user-guide/dosing-automations","6c6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/error-codes",component:d("/user-guide/error-codes","4ef"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/experiment-profiles",component:d("/user-guide/experiment-profiles","036"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/experiment-profiles-schema",component:d("/user-guide/experiment-profiles-schema","51e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/export-data",component:d("/user-guide/export-data","acb"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/export-import-existing-data",component:d("/user-guide/export-import-existing-data","99b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/external-power",component:d("/user-guide/external-power","ca7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/getting-started",component:d("/user-guide/getting-started","7fd"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/hardware-calibrations",component:d("/user-guide/hardware-calibrations","6dc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/hardware-connection-assembly",component:d("/user-guide/hardware-connection-assembly","4f7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/hardware-setup-intro",component:d("/user-guide/hardware-setup-intro","d1e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/internet-sharing",component:d("/user-guide/internet-sharing","0aa"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/intro-python-scripting",component:d("/user-guide/intro-python-scripting","3ce"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/intro-to-automations",component:d("/user-guide/intro-to-automations","edd"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/introduction",component:d("/user-guide/introduction","382"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/led-automations",component:d("/user-guide/led-automations","88f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/local-access-point",component:d("/user-guide/local-access-point","f28"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/manual-dosing-leds",component:d("/user-guide/manual-dosing-leds","582"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/monitor-experiment",component:d("/user-guide/monitor-experiment","da6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/networking",component:d("/user-guide/networking","021"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/ngrok-remote-access",component:d("/user-guide/ngrok-remote-access","7eb"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/od-normal-growth-rate",component:d("/user-guide/od-normal-growth-rate","872"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/optics-assembly",component:d("/user-guide/optics-assembly","abf"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/pinch-valves",component:d("/user-guide/pinch-valves","262"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/powering-cluster",component:d("/user-guide/powering-cluster","c44"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/prepare-vial-for-cultures",component:d("/user-guide/prepare-vial-for-cultures","fe9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/putting-it-together",component:d("/user-guide/putting-it-together","4ad"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/remote-access",component:d("/user-guide/remote-access","4d8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/rpi-hat-assembly",component:d("/user-guide/rpi-hat-assembly","143"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/running-self-test",component:d("/user-guide/running-self-test","dc5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/set-up-an-experiment",component:d("/user-guide/set-up-an-experiment","3bc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/software-set-up",component:d("/user-guide/software-set-up","eb7"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/tailscale-remote-access",component:d("/user-guide/tailscale-remote-access","015"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/temperature-automations",component:d("/user-guide/temperature-automations","4fe"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/temperature-expansion-kit",component:d("/user-guide/temperature-expansion-kit","599"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/troubleshooting-hardware",component:d("/user-guide/troubleshooting-hardware","3de"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/troubleshooting-power",component:d("/user-guide/troubleshooting-power","80f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/troubleshooting-stirring",component:d("/user-guide/troubleshooting-stirring","374"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/troubleshooting-ui",component:d("/user-guide/troubleshooting-ui","fd5"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/updating-software",component:d("/user-guide/updating-software","c4f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/using-community-plugins",component:d("/user-guide/using-community-plugins","a38"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/using-leds",component:d("/user-guide/using-leds","a97"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/using-pumps",component:d("/user-guide/using-pumps","55c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/using-stemma-qt",component:d("/user-guide/using-stemma-qt","103"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/v11-upgrade-building-vial-holder",component:d("/user-guide/v11-upgrade-building-vial-holder","151"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/v11-upgrade-hardware-setup",component:d("/user-guide/v11-upgrade-hardware-setup","ea8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/v11-upgrade-optics-assembly",component:d("/user-guide/v11-upgrade-optics-assembly","057"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/v11-upgrade-pioreactor-disassembly",component:d("/user-guide/v11-upgrade-pioreactor-disassembly","c5b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/v11-upgrade-pioreactor-reassembly",component:d("/user-guide/v11-upgrade-pioreactor-reassembly","489"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/wetware-assembly",component:d("/user-guide/wetware-assembly","ac6"),exact:!0,sidebar:"tutorialSidebar"},{path:"/user-guide/write-own-automations",component:d("/user-guide/write-own-automations","61d"),exact:!0,sidebar:"tutorialSidebar"}]}]}]},{path:"/",component:d("/","f02"),exact:!0},{path:"*",component:d("*")}]},98934:(e,t,n)=>{"use strict";n.d(t,{_:()=>o,t:()=>i});var r=n(67294),a=n(85893);const o=r.createContext(!1);function i(e){let{children:t}=e;const[n,i]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{i(!0)}),[]),(0,a.jsx)(o.Provider,{value:n,children:t})}},97221:(e,t,n)=>{"use strict";var r=n(67294),a=n(20745),o=n(73727),i=n(70405),s=n(10412);const l=[n(56657),n(32497),n(3310),n(18320),n(52295),n(74367)];var u=n(723),c=n(16550),d=n(18790),p=n(85893);function f(e){let{children:t}=e;return(0,p.jsx)(p.Fragment,{children:t})}var m=n(35742),g=n(52263),h=n(44996),b=n(86668),y=n(1944),v=n(94711),w=n(19727),x=n(43320),k=n(69356),S=n(90197);function _(){const{i18n:{currentLocale:e,defaultLocale:t,localeConfigs:n}}=(0,g.Z)(),r=(0,v.l)(),a=n[e].htmlLang,o=e=>e.replace("-","_");return(0,p.jsxs)(m.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:o(a)}),Object.values(n).filter((e=>a!==e.htmlLang)).map((e=>(0,p.jsx)("meta",{property:"og:locale:alternate",content:o(e.htmlLang)},`meta-og-${e.htmlLang}`)))]})}function E(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,c.TH)();return e+(0,k.applyTrailingSlash)((0,h.Z)(r),{trailingSlash:n,baseUrl:t})}(),a=t?`${n}${t}`:r;return(0,p.jsxs)(m.Z,{children:[(0,p.jsx)("meta",{property:"og:url",content:a}),(0,p.jsx)("link",{rel:"canonical",href:a})]})}function C(){const{i18n:{currentLocale:e}}=(0,g.Z)(),{metadata:t,image:n}=(0,b.L)();return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(m.Z,{children:[(0,p.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,p.jsx)("body",{className:w.h})]}),n&&(0,p.jsx)(y.d,{image:n}),(0,p.jsx)(E,{}),(0,p.jsx)(_,{}),(0,p.jsx)(S.Z,{tag:x.HX,locale:e}),(0,p.jsx)(m.Z,{children:t.map(((e,t)=>(0,p.jsx)("meta",{...e},t)))})]})}const T=new Map;function P(e){if(T.has(e.pathname))return{...e,pathname:T.get(e.pathname)};if((0,d.f)(u.Z,e.pathname).some((e=>{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}}var L=n(98934),j=n(58940),A=n(20469);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()=>a.forEach((e=>e?.()))}const N=function(e){let{children:t,location:n,previousLocation:r}=e;return(0,A.Z)((()=>{r!==n&&(!function(e){let{location:t,previousLocation:n}=e;if(!n)return;const r=t.pathname===n.pathname,a=t.hash===n.hash,o=t.search===n.search;if(r&&a&&!o)return;const{hash:i}=t;if(i){const e=decodeURIComponent(i.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:n,previousLocation:r}),R("onRouteDidUpdate",{previousLocation:r,location:n}))}),[r,n]),t};function O(e){const t=Array.from(new Set([e,decodeURI(e)])).map((e=>(0,d.f)(u.Z,e))).flat();return Promise.all(t.map((e=>e.route.component.preload?.())))}class I extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=s.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}),O(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)(c.AW,{location:t,render:()=>e})})}}const D=I,F="__docusaurus-base-url-issue-banner-container",M="__docusaurus-base-url-issue-banner",z="__docusaurus-base-url-issue-banner-suggestion-container";function B(e){return`\ndocument.addEventListener('DOMContentLoaded', function maybeInsertBanner() {\n var shouldInsert = typeof window['docusaurus'] === 'undefined';\n shouldInsert && insertBanner();\n});\n\nfunction insertBanner() {\n var bannerContainer = document.createElement('div');\n bannerContainer.id = '${F}';\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(/{if("undefined"==typeof document)return void n();const r=document.createElement("link");r.setAttribute("rel","prefetch"),r.setAttribute("href",e),r.onload=()=>t(),r.onerror=()=>n();const a=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;a?.appendChild(r)}))}:function(e){return new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)}))};var K=n(99670);const Y=new Set,X=new Set,J=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,ee={prefetch(e){if(!(e=>!J()&&!X.has(e)&&!Y.has(e))(e))return!1;Y.add(e);const t=(0,d.f)(u.Z,e).flatMap((e=>{return t=e.route.path,Object.entries(G).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,K.Z)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?W(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!J()&&!X.has(e))(e)&&(X.add(e),O(e))},te=Object.freeze(ee),ne=Boolean(!0);if(s.Z.canUseDOM){window.docusaurus=te;const e=document.getElementById("__docusaurus"),t=(0,p.jsx)(i.B6,{children:(0,p.jsx)(o.VK,{children:(0,p.jsx)(V,{})})}),n=(e,t)=>{console.error("Docusaurus React Root onRecoverableError:",e,t)},s=()=>{if(ne)r.startTransition((()=>{a.hydrateRoot(e,t,{onRecoverableError:n})}));else{const o=a.createRoot(e,{onRecoverableError:n});r.startTransition((()=>{o.render(t)}))}};O(window.location.pathname).then(s)}},58940:(e,t,n)=>{"use strict";n.d(t,{_:()=>d,M:()=>p});var r=n(67294),a=n(36809);const o=JSON.parse('{"docusaurus-plugin-google-gtag":{"default":{"trackingID":["G-KR7J91QFT2"],"anonymizeIP":true,"id":"default"}},"docusaurus-plugin-content-docs":{"default":{"path":"/user-guide","versions":[{"name":"current","label":"Next","isLast":true,"path":"/user-guide","mainDocId":"introduction","docs":[{"id":"Advanced/accessing-raspberry-pi","path":"/user-guide/accessing-raspberry-pi","sidebar":"tutorialSidebar"},{"id":"Advanced/additional-hardware/hardware-connection-assembly","path":"/user-guide/hardware-connection-assembly","sidebar":"tutorialSidebar"},{"id":"Advanced/additional-hardware/pinch-valves","path":"/user-guide/pinch-valves","sidebar":"tutorialSidebar"},{"id":"Advanced/additional-hardware/pumps","path":"/user-guide/addition-hardware-pumps","sidebar":"tutorialSidebar"},{"id":"Advanced/cli","path":"/user-guide/cli","sidebar":"tutorialSidebar"},{"id":"Advanced/export-import-existing-data","path":"/user-guide/export-import-existing-data","sidebar":"tutorialSidebar"},{"id":"Advanced/intro-python-scripting","path":"/user-guide/intro-python-scripting","sidebar":"tutorialSidebar"},{"id":"Advanced/networking/internet-sharing","path":"/user-guide/internet-sharing","sidebar":"tutorialSidebar"},{"id":"Advanced/networking/local-access-point","path":"/user-guide/local-access-point","sidebar":"tutorialSidebar"},{"id":"Advanced/networking/networking","path":"/user-guide/networking","sidebar":"tutorialSidebar"},{"id":"Advanced/remote-access/introduction","path":"/user-guide/remote-access","sidebar":"tutorialSidebar"},{"id":"Advanced/remote-access/ngrok","path":"/user-guide/ngrok-remote-access","sidebar":"tutorialSidebar"},{"id":"Advanced/remote-access/tailscale","path":"/user-guide/tailscale-remote-access","sidebar":"tutorialSidebar"},{"id":"Automations/dosing-automations","path":"/user-guide/dosing-automations","sidebar":"tutorialSidebar"},{"id":"Automations/intro-to-automations","path":"/user-guide/intro-to-automations","sidebar":"tutorialSidebar"},{"id":"Automations/led-automations","path":"/user-guide/led-automations","sidebar":"tutorialSidebar"},{"id":"Automations/temperature-automations","path":"/user-guide/temperature-automations","sidebar":"tutorialSidebar"},{"id":"Automations/writing-automations","path":"/user-guide/write-own-automations","sidebar":"tutorialSidebar"},{"id":"common-questions","path":"/user-guide/common-questions","sidebar":"tutorialSidebar"},{"id":"Experiment basics/Activities","path":"/user-guide/activities","sidebar":"tutorialSidebar"},{"id":"Experiment basics/export-data","path":"/user-guide/export-data","sidebar":"tutorialSidebar"},{"id":"Experiment basics/manual-led-dosing","path":"/user-guide/manual-dosing-leds","sidebar":"tutorialSidebar"},{"id":"Experiment basics/monitor-experiment","path":"/user-guide/monitor-experiment","sidebar":"tutorialSidebar"},{"id":"Experiment basics/od-normal-growth-rate","path":"/user-guide/od-normal-growth-rate","sidebar":"tutorialSidebar"},{"id":"Experiment basics/prepare-vial-for-cultures","path":"/user-guide/prepare-vial-for-cultures","sidebar":"tutorialSidebar"},{"id":"Experiment basics/running-self-test","path":"/user-guide/running-self-test","sidebar":"tutorialSidebar"},{"id":"Experiment basics/set-up-an-experiment","path":"/user-guide/set-up-an-experiment","sidebar":"tutorialSidebar"},{"id":"Extending your Pioreactor/06a-using-community-plugins","path":"/user-guide/using-community-plugins","sidebar":"tutorialSidebar"},{"id":"Extending your Pioreactor/06b-list-of-plugins","path":"/user-guide/available-plugins","sidebar":"tutorialSidebar"},{"id":"Extending your Pioreactor/adding-leds","path":"/user-guide/using-leds","sidebar":"tutorialSidebar"},{"id":"Extending your Pioreactor/calibrate-od600","path":"/user-guide/calibrate-od600","sidebar":"tutorialSidebar"},{"id":"Extending your Pioreactor/cluster-management/create-cluster","path":"/user-guide/create-cluster","sidebar":"tutorialSidebar"},{"id":"Extending your Pioreactor/cluster-management/power-cluster","path":"/user-guide/powering-cluster","sidebar":"tutorialSidebar"},{"id":"Extending your Pioreactor/configuration","path":"/user-guide/configuration","sidebar":"tutorialSidebar"},{"id":"Extending your Pioreactor/Experiment Profiles/create-edit-experiment-profiles","path":"/user-guide/create-edit-experiment-profiles","sidebar":"tutorialSidebar"},{"id":"Extending your Pioreactor/Experiment Profiles/experiment-profiles-intro","path":"/user-guide/experiment-profiles","sidebar":"tutorialSidebar"},{"id":"Extending your Pioreactor/Experiment Profiles/experiment-profiles-schema","path":"/user-guide/experiment-profiles-schema","sidebar":"tutorialSidebar"},{"id":"Extending your Pioreactor/external-power","path":"/user-guide/external-power","sidebar":"tutorialSidebar"},{"id":"Extending your Pioreactor/hardware-calibrations","path":"/user-guide/hardware-calibrations","sidebar":"tutorialSidebar"},{"id":"Extending your Pioreactor/updating-software","path":"/user-guide/updating-software","sidebar":"tutorialSidebar"},{"id":"Extending your Pioreactor/Upgrade kits/temperature-expansion-kit","path":"/user-guide/temperature-expansion-kit","sidebar":"tutorialSidebar"},{"id":"Extending your Pioreactor/using-pumps","path":"/user-guide/using-pumps","sidebar":"tutorialSidebar"},{"id":"Extending your Pioreactor/using-stemma-qt","path":"/user-guide/using-stemma-qt","sidebar":"tutorialSidebar"},{"id":"getting-started/assembly_guides/pioreactor_20ml_v1.0_to_v1.1/build-vial-holder","path":"/user-guide/v11-upgrade-building-vial-holder","sidebar":"tutorialSidebar"},{"id":"getting-started/assembly_guides/pioreactor_20ml_v1.0_to_v1.1/optics-reassembly","path":"/user-guide/v11-upgrade-optics-assembly","sidebar":"tutorialSidebar"},{"id":"getting-started/assembly_guides/pioreactor_20ml_v1.0_to_v1.1/pioreactor-disassembly","path":"/user-guide/v11-upgrade-pioreactor-disassembly","sidebar":"tutorialSidebar"},{"id":"getting-started/assembly_guides/pioreactor_20ml_v1.0_to_v1.1/pioreactor-reassembly","path":"/user-guide/v11-upgrade-pioreactor-reassembly","sidebar":"tutorialSidebar"},{"id":"getting-started/assembly_guides/pioreactor_20ml_v1.0_to_v1.1/version-upgrade","path":"/user-guide/v11-upgrade-hardware-setup","sidebar":"tutorialSidebar"},{"id":"getting-started/assembly_guides/pioreactor_20ml_v1.0/faceplate-all-together","path":"/user-guide/putting-it-together","sidebar":"tutorialSidebar"},{"id":"getting-started/assembly_guides/pioreactor_20ml_v1.0/introduction","path":"/user-guide/hardware-setup-intro","sidebar":"tutorialSidebar"},{"id":"getting-started/assembly_guides/pioreactor_20ml_v1.0/optics-assembly","path":"/user-guide/optics-assembly","sidebar":"tutorialSidebar"},{"id":"getting-started/assembly_guides/pioreactor_20ml_v1.0/rpi-hat-assembly","path":"/user-guide/rpi-hat-assembly","sidebar":"tutorialSidebar"},{"id":"getting-started/assembly_guides/pioreactor_20ml_v1.0/wetware-assembly","path":"/user-guide/wetware-assembly","sidebar":"tutorialSidebar"},{"id":"getting-started/assembly_guides/pioreactor_20ml_v1.1/v11-faceplate-all-together","path":"/user-guide/20ml-v11-putting-it-together","sidebar":"tutorialSidebar"},{"id":"getting-started/assembly_guides/pioreactor_20ml_v1.1/v11-introduction","path":"/user-guide/20ml-v11-hardware-setup-intro","sidebar":"tutorialSidebar"},{"id":"getting-started/assembly_guides/pioreactor_20ml_v1.1/v11-optics-assembly","path":"/user-guide/20ml-v11-optics-assembly","sidebar":"tutorialSidebar"},{"id":"getting-started/assembly_guides/pioreactor_20ml_v1.1/v11-rpi-hat-assembly","path":"/user-guide/20ml-v11-rpi-hat-assembly","sidebar":"tutorialSidebar"},{"id":"getting-started/assembly_guides/pioreactor_20ml_v1.1/v11-wetware-assembly","path":"/user-guide/20ml-v11-wetware-assembly","sidebar":"tutorialSidebar"},{"id":"getting-started/gettingstarted","path":"/user-guide/getting-started","sidebar":"tutorialSidebar"},{"id":"getting-started/software-set-up","path":"/user-guide/software-set-up","sidebar":"tutorialSidebar"},{"id":"introduction","path":"/user-guide/introduction","sidebar":"tutorialSidebar"},{"id":"Troubleshooting/error-codes","path":"/user-guide/error-codes","sidebar":"tutorialSidebar"},{"id":"Troubleshooting/Hardware troubleshooting","path":"/user-guide/troubleshooting-hardware","sidebar":"tutorialSidebar"},{"id":"Troubleshooting/Power troubleshooting","path":"/user-guide/troubleshooting-power","sidebar":"tutorialSidebar"},{"id":"Troubleshooting/Stirring troubleshooting","path":"/user-guide/troubleshooting-stirring","sidebar":"tutorialSidebar"},{"id":"Troubleshooting/UI troubleshooting","path":"/user-guide/troubleshooting-ui","sidebar":"tutorialSidebar"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/user-guide/introduction","label":"introduction"}}}}],"breadcrumbs":false},"developer-guide":{"path":"/developer-guide","versions":[{"name":"current","label":"Next","isLast":true,"path":"/developer-guide","mainDocId":"introduction","docs":[{"id":"architecture","path":"/developer-guide/architecture","sidebar":"tutorialSidebar"},{"id":"Automations/events","path":"/developer-guide/events","sidebar":"tutorialSidebar"},{"id":"Automations/intro-automations","path":"/developer-guide/intro-automations","sidebar":"tutorialSidebar"},{"id":"Automations/writing-automations-1","path":"/developer-guide/writing-automations-1","sidebar":"tutorialSidebar"},{"id":"Automations/writing-automations-2","path":"/developer-guide/writing-automations-2","sidebar":"tutorialSidebar"},{"id":"Background jobs/avoiding-od","path":"/developer-guide/avoiding-od","sidebar":"tutorialSidebar"},{"id":"Background jobs/intro-background-jobs","path":"/developer-guide/intro-background-jobs","sidebar":"tutorialSidebar"},{"id":"Background jobs/writing-background-jobs","path":"/developer-guide/writing-background-jobs","sidebar":"tutorialSidebar"},{"id":"Calibrations/Calibrations","path":"/developer-guide/adding-calibration-type","sidebar":"tutorialSidebar"},{"id":"Custom pumps/writing-pump-software","path":"/developer-guide/writing-pump-software","sidebar":"tutorialSidebar"},{"id":"Development/development-on-Raspberry-Pi","path":"/developer-guide/pi-development","sidebar":"tutorialSidebar"},{"id":"Development/local-development","path":"/developer-guide/local-development","sidebar":"tutorialSidebar"},{"id":"Hardware/button-down","path":"/developer-guide/hat-button","sidebar":"tutorialSidebar"},{"id":"Hardware/i2c-addresses","path":"/developer-guide/i2c-addresses","sidebar":"tutorialSidebar"},{"id":"Hardware/pinout","path":"/developer-guide/pinout","sidebar":"tutorialSidebar"},{"id":"important-concepts","path":"/developer-guide/important-concepts","sidebar":"tutorialSidebar"},{"id":"introduction","path":"/developer-guide/introduction","sidebar":"tutorialSidebar"},{"id":"Plugins/adding-plugins-to-ui","path":"/developer-guide/adding-plugins-to-ui","sidebar":"tutorialSidebar"},{"id":"Plugins/intro-plugins","path":"/developer-guide/intro-plugins","sidebar":"tutorialSidebar"},{"id":"Plugins/plugin-as-python-package","path":"/developer-guide/plugin-as-python-package","sidebar":"tutorialSidebar"},{"id":"Scripts/writing-scripts","path":"/developer-guide/writing-scripts","sidebar":"tutorialSidebar"},{"id":"Storage and the filesystem/data-stores/data-stores-intro","path":"/developer-guide/data-stores-intro","sidebar":"tutorialSidebar"},{"id":"Storage and the filesystem/data-stores/local_storage","path":"/developer-guide/local-storage","sidebar":"tutorialSidebar"},{"id":"Storage and the filesystem/data-stores/mqtt","path":"/developer-guide/mqtt","sidebar":"tutorialSidebar"},{"id":"Storage and the filesystem/data-stores/sqlite","path":"/developer-guide/sqlite3","sidebar":"tutorialSidebar"},{"id":"Storage and the filesystem/filesystem","path":"/developer-guide/filesystem-locations","sidebar":"tutorialSidebar"},{"id":"User interface/adding-charts","path":"/developer-guide/chart-to-ui","sidebar":"tutorialSidebar"},{"id":"User interface/api","path":"/developer-guide/web-ui-api","sidebar":"tutorialSidebar"},{"id":"User interface/example-api","path":"/developer-guide/examples-api","sidebar":"tutorialSidebar"},{"id":"User interface/introduction","path":"/developer-guide/web-ui-introduction","sidebar":"tutorialSidebar"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/developer-guide/introduction","label":"introduction"}}}}],"breadcrumbs":false},"experiments":{"path":"/experiments","versions":[{"name":"current","label":"Next","isLast":true,"path":"/experiments","mainDocId":"Introduction","docs":[{"id":"Introduction","path":"/experiments/introduction","sidebar":"tutorialSidebar"},{"id":"Research and beyond/directed-evolution-salt-tolerance","path":"/experiments/directed-evolution-salt-tolerance","sidebar":"tutorialSidebar"},{"id":"Research and beyond/temp-cycle","path":"/experiments/temp-cycle","sidebar":"tutorialSidebar"},{"id":"Secondary level education/caffeine-inhibition","path":"/experiments/caffeine-inhibition","sidebar":"tutorialSidebar"},{"id":"Secondary level education/control-testing","path":"/experiments/control-testing","sidebar":"tutorialSidebar"},{"id":"Secondary level education/low-vs-high-conc-media","path":"/experiments/low-vs-high-conc-media","sidebar":"tutorialSidebar"},{"id":"Secondary level education/salt-stress-on-yeast","path":"/experiments/salt-stress-on-yeast","sidebar":"tutorialSidebar"},{"id":"Secondary level education/yeast-growth-by-temperature","path":"/experiments/yeast-growth-by-temperature","sidebar":"tutorialSidebar"},{"id":"Secondary level education/yeast-in-ethanol","path":"/experiments/yeast-in-ethanol","sidebar":"tutorialSidebar"},{"id":"University level education/algae-day-night-cycle","path":"/experiments/algae-day-night-cycle","sidebar":"tutorialSidebar"},{"id":"University level education/continuous-cultures-using-turbidostat","path":"/experiments/continuous-cultures-using-turbidostat","sidebar":"tutorialSidebar"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/experiments/introduction","label":"Introduction"}}}}],"breadcrumbs":false}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"}}}');var s=n(57529);const l=JSON.parse('{"docusaurusVersion":"3.0.1","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"3.0.1"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"3.0.1"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"3.0.1"},"docusaurus-plugin-google-gtag":{"type":"package","name":"@docusaurus/plugin-google-gtag","version":"3.0.1"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"3.0.1"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"3.0.1"},"docusaurus-plugin-google-analytics":{"type":"package","name":"@docusaurus/plugin-google-analytics","version":"3.0.1"},"@easyops-cn/docusaurus-search-local":{"type":"package","name":"@easyops-cn/docusaurus-search-local","version":"0.38.1"}}}');var u=n(85893);const c={siteConfig:a.default,siteMetadata:l,globalData:o,i18n:i,codeTranslations:s},d=r.createContext(c);function p(e){let{children:t}=e;return(0,u.jsx)(d.Provider,{value:c,children:t})}},44763:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var r=n(67294),a=n(10412),o=n(35742),i=n(69356),s=n(8862),l=n(85893);function u(e){let{error:t,tryAgain:n}=e;return(0,l.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,l.jsx)("h1",{style:{fontSize:"3rem"},children:"This page crashed"}),(0,l.jsx)("button",{type:"button",onClick:n,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"},children:"Try again"}),(0,l.jsx)(c,{error:t})]})}function c(e){let{error:t}=e;const n=(0,i.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,l.jsx)("p",{style:{whiteSpace:"pre-wrap"},children:n})}function d(e){let{error:t,tryAgain:n}=e;return(0,l.jsxs)(f,{fallback:()=>(0,l.jsx)(u,{error:t,tryAgain:n}),children:[(0,l.jsx)(o.Z,{children:(0,l.jsx)("title",{children:"Page Error"})}),(0,l.jsx)(s.Z,{children:(0,l.jsx)(u,{error:t,tryAgain:n})})]})}const p=e=>(0,l.jsx)(d,{...e});class f extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){a.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??p)(e)}return e??null}}},10412:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,a={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},35742:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});n(67294);var r=n(70405),a=n(85893);function o(e){return(0,a.jsx)(r.ql,{...e})}},39960:(e,t,n)=>{"use strict";n.d(t,{Z:()=>f});var r=n(67294),a=n(73727),o=n(69356),i=n(52263),s=n(13919),l=n(10412),u=n(85893);const c=r.createContext({collectLink:()=>{}});var d=n(44996);function p(e,t){let{isNavLink:n,to:p,href:f,activeClassName:m,isActive:g,"data-noBrokenLinkCheck":h,autoAddBaseUrl:b=!0,...y}=e;const{siteConfig:{trailingSlash:v,baseUrl:w}}=(0,i.Z)(),{withBaseUrl:x}=(0,d.C)(),k=(0,r.useContext)(c),S=(0,r.useRef)(null);(0,r.useImperativeHandle)(t,(()=>S.current));const _=p||f;const E=(0,s.Z)(_),C=_?.replace("pathname://","");let T=void 0!==C?(P=C,b&&(e=>e.startsWith("/"))(P)?x(P):P):void 0;var P;T&&E&&(T=(0,o.applyTrailingSlash)(T,{trailingSlash:v,baseUrl:w}));const L=(0,r.useRef)(!1),j=n?a.OL:a.rU,A=l.Z.canUseIntersectionObserver,R=(0,r.useRef)(),N=()=>{L.current||null==T||(window.docusaurus.preload(T),L.current=!0)};(0,r.useEffect)((()=>(!A&&E&&null!=T&&window.docusaurus.prefetch(T),()=>{A&&R.current&&R.current.disconnect()})),[R,T,A,E]);const O=T?.startsWith("#")??!1,I=!T||!E||O;return I||h||k.collectLink(T),I?(0,u.jsx)("a",{ref:S,href:T,..._&&!E&&{target:"_blank",rel:"noopener noreferrer"},...y}):(0,u.jsx)(j,{...y,onMouseEnter:N,onTouchStart:N,innerRef:e=>{S.current=e,A&&e&&E&&(R.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(R.current.unobserve(e),R.current.disconnect(),null!=T&&window.docusaurus.prefetch(T))}))})),R.current.observe(e))},to:T,...n&&{isActive:g,activeClassName:m}})}const f=r.forwardRef(p)},95999:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u,I:()=>l});var r=n(67294),a=n(85893);function o(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,r.isValidElement)(e)))?n.map(((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var i=n(57529);function s(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 l(e,t){let{message:n,id:r}=e;return o(s({message:n,id:r}),t)}function u(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=s({message:t,id:n});return(0,a.jsx)(a.Fragment,{children:o(i,r)})}},29935:(e,t,n)=>{"use strict";n.d(t,{m:()=>r});const r="default"},13919:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function a(e){return void 0!==e&&!r(e)}n.d(t,{Z:()=>a,b:()=>r})},44996:(e,t,n)=>{"use strict";n.d(t,{C:()=>i,Z:()=>s});var r=n(67294),a=n(52263),o=n(13919);function i(){const{siteConfig:{baseUrl:e,url:t}}=(0,a.Z)(),n=(0,r.useCallback)(((n,r)=>function(e,t,n,r){let{forcePrependBaseUrl:a=!1,absolute:i=!1}=void 0===r?{}:r;if(!n||n.startsWith("#")||(0,o.b)(n))return n;if(a)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;const s=n.startsWith(t)?n:t+n.replace(/^\//,"");return i?e+s:s}(t,e,n,r)),[t,e]);return{withBaseUrl:n}}function s(e,t){void 0===t&&(t={});const{withBaseUrl:n}=i();return n(e,t)}},52263:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(67294),a=n(58940);function o(){return(0,r.useContext)(a._)}},72389:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(67294),a=n(98934);function o(){return(0,r.useContext)(a._)}},20469:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});var r=n(67294);const a=n(10412).Z.canUseDOM?r.useLayoutEffect:r.useEffect},99670:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const r=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function a(e){const t={};return function e(n,a){Object.entries(n).forEach((n=>{let[o,i]=n;const s=a?`${a}.${o}`:o;r(i)?e(i,s):t[s]=i}))}(e),t}},30226:(e,t,n)=>{"use strict";n.d(t,{_:()=>o,z:()=>i});var r=n(67294),a=n(85893);const o=r.createContext(null);function i(e){let{children:t,value:n}=e;const i=r.useContext(o),s=(0,r.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const r={...t.data,...n?.data};return{plugin:t.plugin,data:r}}({parent:i,value:n})),[i,n]);return(0,a.jsx)(o.Provider,{value:s,children:t})}},5743:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[a]=e.split(/[#?]/),o="/"===a||a===r?a:(i=a,n?function(e){return e.endsWith("/")?e:`${e}/`}(i):function(e){return e.endsWith("/")?e.slice(0,-1):e}(i));var i;return e.replace(a,o)}},7192:(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]}},69356: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.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="__blog-post-container";var a=n(5743);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r(a).default}});var o=n(7192);Object.defineProperty(t,"getErrorCausalChain",{enumerable:!0,get:function(){return o.getErrorCausalChain}})},80143:(e,t,n)=>{"use strict";n.d(t,{Iw:()=>g,gA:()=>p,_r:()=>c,Jo:()=>h,zh:()=>d,yW:()=>m,gB:()=>f});var r=n(16550),a=n(52263),o=n(29935);function i(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,a.Z)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}const s=e=>e.versions.find((e=>e.isLast));function l(e,t){const n=function(e,t){const n=s(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,r.LX)(t,{path:e.path,exact:!1,strict:!1})))}(e,t),a=n?.docs.find((e=>!!(0,r.LX)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:a,alternateDocVersions:a?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(a.id):{}}}const u={},c=()=>i("docusaurus-plugin-content-docs")??u,d=e=>function(e,t,n){void 0===t&&(t=o.m),void 0===n&&(n={});const r=i(e),a=r?.[t];if(!a&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return a}("docusaurus-plugin-content-docs",e,{failfast:!0});function p(e){void 0===e&&(e={});const t=c(),{pathname:n}=(0,r.TH)();return function(e,t,n){void 0===n&&(n={});const a=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.LX)(t,{path:n.path,exact:!1,strict:!1})})),o=a?{pluginId:a[0],pluginData:a[1]}:void 0;if(!o&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map((e=>e.path)).join(", ")}`);return o}(t,n,e)}function f(e){return d(e).versions}function m(e){const t=d(e);return s(t)}function g(e){const t=d(e),{pathname:n}=(0,r.TH)();return l(t,n)}function h(e){const t=d(e),{pathname:n}=(0,r.TH)();return function(e,t){const n=s(e);return{latestDocSuggestion:l(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},74367:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>r});const r={onRouteDidUpdate(e){let{location:t,previousLocation:n}=e;!n||t.pathname===n.pathname&&t.search===n.search&&t.hash===n.hash||(window.ga("set","page",t.pathname+t.search+t.hash),window.ga("send","pageview"))}}},56657:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>r});const r={onRouteDidUpdate(e){let{location:t,previousLocation:n}=e;!n||t.pathname===n.pathname&&t.search===n.search&&t.hash===n.hash||setTimeout((()=>{window.gtag("set","page_path",t.pathname+t.search+t.hash),window.gtag("event","page_view")}))}}},18320:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>o});var r=n(74865),a=n.n(r);a().configure({showSpinner:!1});const o={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{a().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){a().done()}}},3310:(e,t,n)=>{"use strict";n.r(t);var r=n(34798),a=n(36809);!function(e){const{themeConfig:{prism:t}}=a.default,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{"php"===e&&n(96854),n(6726)(`./prism-${e}`)})),delete globalThis.Prism}(r.p1)},92503:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});n(67294);var r=n(36905),a=n(95999),o=n(86668),i=n(39960);const s={anchorWithStickyNavbar:"anchorWithStickyNavbar_LWe7",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_WYt5"};var l=n(85893);function u(e){let{as:t,id:n,...u}=e;const{navbar:{hideOnScroll:c}}=(0,o.L)();if("h1"===t||!n)return(0,l.jsx)(t,{...u,id:void 0});const d=(0,a.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,l.jsxs)(t,{...u,className:(0,r.Z)("anchor",c?s.anchorWithHideOnScrollNavbar:s.anchorWithStickyNavbar,u.className),id:n,children:[u.children,(0,l.jsx)(i.Z,{className:"hash-link",to:`#${n}`,"aria-label":d,title:d,children:"\u200b"})]})}},39471:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});n(67294);const r={iconExternalLink:"iconExternalLink_nPIU"};var a=n(85893);function o(e){let{width:t=13.5,height:n=13.5}=e;return(0,a.jsx)("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:r.iconExternalLink,children:(0,a.jsx)("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"})})}},8862:(e,t,n)=>{"use strict";n.d(t,{Z:()=>Ot});var r=n(67294),a=n(36905),o=n(44763),i=n(1944),s=n(16550),l=n(95999),u=n(85936),c=n(85893);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,s.k6)(),n=(0,r.useCallback)((e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&p(t)}),[]);return(0,u.S)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&p(e.current)})),{containerRef:e,onClick:n}}const m=(0,l.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??m,{containerRef:n,onClick:r}=f();return(0,c.jsx)("div",{ref:n,role:"region","aria-label":m,children:(0,c.jsx)("a",{...e,href:`#${d}`,onClick:r,children:t})})}var h=n(35281),b=n(19727);const y={skipToContent:"skipToContent_fXgn"};function v(){return(0,c.jsx)(g,{className:y.skipToContent})}var w=n(86668),x=n(59689);function k(e){let{width:t=21,height:n=21,color:r="currentColor",strokeWidth:a=1.2,className:o,...i}=e;return(0,c.jsx)("svg",{viewBox:"0 0 15 15",width:t,height:n,...i,children:(0,c.jsx)("g",{stroke:r,strokeWidth:a,children:(0,c.jsx)("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})})})}const S={closeButton:"closeButton_CVFx"};function _(e){return(0,c.jsx)("button",{type:"button","aria-label":(0,l.I)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"}),...e,className:(0,a.Z)("clean-btn close",S.closeButton,e.className),children:(0,c.jsx)(k,{width:14,height:14,strokeWidth:3.1})})}const E={content:"content_knG7"};function C(e){const{announcementBar:t}=(0,w.L)(),{content:n}=t;return(0,c.jsx)("div",{...e,className:(0,a.Z)(E.content,e.className),dangerouslySetInnerHTML:{__html:n}})}const T={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function P(){const{announcementBar:e}=(0,w.L)(),{isActive:t,close:n}=(0,x.nT)();if(!t)return null;const{backgroundColor:r,textColor:a,isCloseable:o}=e;return(0,c.jsxs)("div",{className:T.announcementBar,style:{backgroundColor:r,color:a},role:"banner",children:[o&&(0,c.jsx)("div",{className:T.announcementBarPlaceholder}),(0,c.jsx)(C,{className:T.announcementBarContent}),o&&(0,c.jsx)(_,{onClick:n,className:T.announcementBarClose})]})}var L=n(93163),j=n(12466);var A=n(902),R=n(13102);const N=r.createContext(null);function O(e){let{children:t}=e;const n=function(){const e=(0,L.e)(),t=(0,R.HY)(),[n,a]=(0,r.useState)(!1),o=null!==t.component,i=(0,A.D9)(o);return(0,r.useEffect)((()=>{o&&!i&&a(!0)}),[o,i]),(0,r.useEffect)((()=>{o?e.shown||a(!0):a(!1)}),[e.shown,o]),(0,r.useMemo)((()=>[n,a]),[n])}();return(0,c.jsx)(N.Provider,{value:n,children:t})}function I(e){if(e.component){const t=e.component;return(0,c.jsx)(t,{...e.props})}}function D(){const e=(0,r.useContext)(N);if(!e)throw new A.i6("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,a=(0,r.useCallback)((()=>n(!1)),[n]),o=(0,R.HY)();return(0,r.useMemo)((()=>({shown:t,hide:a,content:I(o)})),[a,o,t])}function F(e){let{header:t,primaryMenu:n,secondaryMenu:r}=e;const{shown:o}=D();return(0,c.jsxs)("div",{className:"navbar-sidebar",children:[t,(0,c.jsxs)("div",{className:(0,a.Z)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":o}),children:[(0,c.jsx)("div",{className:"navbar-sidebar__item menu",children:n}),(0,c.jsx)("div",{className:"navbar-sidebar__item menu",children:r})]})]})}var M=n(92949),z=n(72389);function B(e){return(0,c.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,c.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,c.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,c.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:o}=e;const i=(0,z.Z)(),s=(0,l.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,l.I)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,l.I)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return(0,c.jsx)("div",{className:(0,a.Z)(U.toggle,t),children:(0,c.jsxs)("button",{className:(0,a.Z)("clean-btn",U.toggleButton,!i&&U.toggleButtonDisabled,n),type:"button",onClick:()=>o("dark"===r?"light":"dark"),disabled:!i,title:s,"aria-label":s,"aria-live":"polite",children:[(0,c.jsx)(B,{className:(0,a.Z)(U.toggleIcon,U.lightToggleIcon)}),(0,c.jsx)($,{className:(0,a.Z)(U.toggleIcon,U.darkToggleIcon)})]})})}const H=r.memo(q),Q={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function Z(e){let{className:t}=e;const n=(0,w.L)().navbar.style,r=(0,w.L)().colorMode.disableSwitch,{colorMode:a,setColorMode:o}=(0,M.I)();return r?null:(0,c.jsx)(H,{className:t,buttonClassName:"dark"===n?Q.darkNavbarColorModeToggle:void 0,value:a,onChange:o})}var V=n(21327);function G(){return(0,c.jsx)(V.Z,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function W(){const e=(0,L.e)();return(0,c.jsx)("button",{type:"button","aria-label":(0,l.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,c.jsx)(k,{color:"var(--ifm-color-emphasis-600)"})})}function K(){return(0,c.jsxs)("div",{className:"navbar-sidebar__brand",children:[(0,c.jsx)(G,{}),(0,c.jsx)(Z,{className:"margin-right--md"}),(0,c.jsx)(W,{})]})}var Y=n(39960),X=n(44996),J=n(13919);function ee(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var te=n(39471);function ne(e){let{activeBasePath:t,activeBaseRegex:n,to:r,href:a,label:o,html:i,isDropdownLink:s,prependBaseUrlToHref:l,...u}=e;const d=(0,X.Z)(r),p=(0,X.Z)(t),f=(0,X.Z)(a,{forcePrependBaseUrl:!0}),m=o&&a&&!(0,J.Z)(a),g=i?{dangerouslySetInnerHTML:{__html:i}}:{children:(0,c.jsxs)(c.Fragment,{children:[o,m&&(0,c.jsx)(te.Z,{...s&&{width:12,height:12}})]})};return a?(0,c.jsx)(Y.Z,{href:l?f:a,...u,...g}):(0,c.jsx)(Y.Z,{to:d,isNavLink:!0,...(t||n)&&{isActive:(e,t)=>n?ee(n,t.pathname):t.pathname.startsWith(p)},...u,...g})}function re(e){let{className:t,isDropdownItem:n=!1,...r}=e;const o=(0,c.jsx)(ne,{className:(0,a.Z)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n,...r});return n?(0,c.jsx)("li",{children:o}):o}function ae(e){let{className:t,isDropdownItem:n,...r}=e;return(0,c.jsx)("li",{className:"menu__list-item",children:(0,c.jsx)(ne,{className:(0,a.Z)("menu__link",t),...r})})}function oe(e){let{mobile:t=!1,position:n,...r}=e;const a=t?ae:re;return(0,c.jsx)(a,{...r,activeClassName:r.activeClassName??(t?"menu__link--active":"navbar__link--active")})}var ie=n(86043),se=n(48596),le=n(52263);const ue={dropdownNavbarItemMobile:"dropdownNavbarItemMobile_S0Fm"};function ce(e,t){return e.some((e=>function(e,t){return!!(0,se.Mg)(e.to,t)||!!ee(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function de(e){let{items:t,position:n,className:o,onClick:i,...s}=e;const l=(0,r.useRef)(null),[u,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{l.current&&!l.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)}}),[l]),(0,c.jsxs)("div",{ref:l,className:(0,a.Z)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===n,"dropdown--show":u}),children:[(0,c.jsx)(ne,{"aria-haspopup":"true","aria-expanded":u,role:"button",href:s.to?void 0:"#",className:(0,a.Z)("navbar__link",o),...s,onClick:s.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!u))},children:s.children??s.label}),(0,c.jsx)("ul",{className:"dropdown__menu",children:t.map(((e,t)=>(0,r.createElement)(Ze,{isDropdownItem:!0,activeClassName:"dropdown__link--active",...e,key:t})))})]})}function pe(e){let{items:t,className:n,position:o,onClick:i,...l}=e;const u=function(){const{siteConfig:{baseUrl:e}}=(0,le.Z)(),{pathname:t}=(0,s.TH)();return t.replace(e,"/")}(),d=ce(t,u),{collapsed:p,toggleCollapsed:f,setCollapsed:m}=(0,ie.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&m(!d)}),[u,d,m]),(0,c.jsxs)("li",{className:(0,a.Z)("menu__list-item",{"menu__list-item--collapsed":p}),children:[(0,c.jsx)(ne,{role:"button",className:(0,a.Z)(ue.dropdownNavbarItemMobile,"menu__link menu__link--sublist menu__link--sublist-caret",n),...l,onClick:e=>{e.preventDefault(),f()},children:l.children??l.label}),(0,c.jsx)(ie.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:p,children:t.map(((e,t)=>(0,r.createElement)(Ze,{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,c.jsx)(r,{...n})}var me=n(94711);function ge(e){let{width:t=20,height:n=20,...r}=e;return(0,c.jsx)("svg",{viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0,...r,children:(0,c.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 he="iconLanguage_nlXk";var be=n(61029),ye=n(86010),ve=n(60373),we=n(80143),xe=n(90022),ke=n(98202),Se=n(73926),_e=n(91073),Ee=n(82539),Ce=n(10726);const Te='',Pe='',Le='',je='',Ae='',Re='',Ne='',Oe={searchBar:"searchBar_RVTs",dropdownMenu:"dropdownMenu_qbY6",searchBarLeft:"searchBarLeft_MXDe",suggestion:"suggestion_fB_2",cursor:"cursor_eG29",hitTree:"hitTree_kk6K",hitIcon:"hitIcon_a7Zy",hitPath:"hitPath_ieM4",noResultsIcon:"noResultsIcon_EBY5",hitFooter:"hitFooter_E9YW",hitWrapper:"hitWrapper_sAK8",hitTitle:"hitTitle_vyVt",hitAction:"hitAction_NqkB",hideAction:"hideAction_vcyE",noResults:"noResults_l6Q3",searchBarContainer:"searchBarContainer_NW3z",searchBarLoadingRing:"searchBarLoadingRing_YnHq",searchClearButton:"searchClearButton_qk4g",searchIndexLoading:"searchIndexLoading_EJ1f",searchHintContainer:"searchHintContainer_Pkmr",searchHint:"searchHint_iIMx",focused:"focused_OWtg",input:"input_FOTf",hint:"hint_URu1",suggestions:"suggestions_X8XU",dataset:"dataset_QiCy",empty:"empty_eITn"};function Ie(e){let{document:t,type:n,page:r,metadata:a,tokens:o,isInterOfTree:i,isLastOfTree:s}=e;const l=0===n,u=1===n,c=[];i?c.push(Re):s&&c.push(Ne);const d=c.map((e=>`${e}`)),p=`${l?Te:u?Pe:Le}`,f=[`${(0,Ce.o)(t.t,(0,_e.m)(a,"t"),o)}`];if(!i&&!s&&be.H6){const e=r?(r.b??[]).concat(r.t).concat(t.s&&t.s!==r.t?t.s:[]):t.b;f.push(`${(0,Se.e)(e??[])}`)}else l||f.push(`${(0,Ee.C)(r.t||(t.u.startsWith("/docs/api-reference/")?"API Reference":""),o)}`);const m=`${je}`;return[...d,p,``,...f,"",m].join("")}function De(){return`${Ae}${(0,l.I)({id:"theme.SearchBar.noResultsText",message:"No results"})}`}var Fe=n(80311);async function Me(){const e=await Promise.all([n.e(8443),n.e(6165)]).then(n.t.bind(n,68443,23)),t=e.default;return t.noConflict?t.noConflict():e.noConflict&&e.noConflict(),t}const ze="_highlight";const Be=function(e){let{handleSearchBarToggle:t}=e;const n=(0,z.Z)(),{siteConfig:{baseUrl:a}}=(0,le.Z)(),o=(0,we.gA)();let i=a;try{const{preferredVersion:e}=(0,ve.J)(o?.pluginId??be.gQ);e&&!e.isLast&&(i=e.path+"/")}catch(D){if(be.l9&&!(D instanceof A.i6))throw D}const u=(0,s.k6)(),d=(0,s.TH)(),p=(0,r.useRef)(null),f=(0,r.useRef)(new Map),m=(0,r.useRef)(!1),[g,h]=(0,r.useState)(!1),[b,y]=(0,r.useState)(!1),[v,w]=(0,r.useState)(""),x=(0,r.useRef)(null),k=(0,r.useRef)(""),[S,_]=(0,r.useState)("");(0,r.useEffect)((()=>{if(!Array.isArray(be.Kc))return;let e="";if(d.pathname.startsWith(i)){const t=d.pathname.substring(i.length),n=be.Kc.find((e=>t===e||t.startsWith(`${e}/`)));n&&(e=n)}k.current!==e&&(f.current.delete(e),k.current=e),_(e)}),[d.pathname,i]);const E=!!be.hG&&Array.isArray(be.Kc)&&""===S,C=(0,r.useCallback)((async()=>{if(E||f.current.get(S))return;f.current.set(S,"loading"),x.current?.autocomplete.destroy(),h(!0);const[{wrappedIndexes:e,zhDictionary:t},n]=await Promise.all([(0,xe.w)(i,S),Me()]);if(x.current=n(p.current,{hint:!1,autoselect:!0,openOnFocus:!0,cssClasses:{root:(0,ye.Z)(Oe.searchBar,{[Oe.searchBarLeft]:"left"===be.pu}),noPrefix:!0,dropdownMenu:Oe.dropdownMenu,input:Oe.input,hint:Oe.hint,suggestions:Oe.suggestions,suggestion:Oe.suggestion,cursor:Oe.cursor,dataset:Oe.dataset,empty:Oe.empty}},[{source:(0,ke.v)(e,t,be.qo),templates:{suggestion:Ie,empty:De,footer:e=>{let{query:t,isEmpty:n}=e;if(n&&!S)return;const r=(e=>{let{query:t,isEmpty:n}=e;const r=document.createElement("a"),o=new URLSearchParams,s=(0,l.I)({id:"theme.SearchBar.seeAll",message:"See all results"}),c=(0,l.I)({id:"theme.SearchBar.seeAllOutsideContext",message:"See results outside {context}"},{context:S}),d=(0,l.I)({id:"theme.SearchBar.searchInContext",message:"See all results in {context}"},{context:S});let p;if(o.set("q",t),p=S&&n?c:S?d:s,Array.isArray(be.Kc)&&!n&&o.set("ctx",S),i!==a){if(!i.startsWith(a))throw new Error(`Version url '${i}' does not start with base url '${a}', this is a bug of \`@easyops-cn/docusaurus-search-local\`, please report it.`);o.set("version",i.substring(a.length))}const f=`${a}search?${o.toString()}`;return r.href=f,r.textContent=p,r.addEventListener("click",(e=>{e.ctrlKey||e.metaKey||(e.preventDefault(),x.current?.autocomplete.close(),u.push(f))})),r})({query:t,isEmpty:n}),o=document.createElement("div");return o.className=Oe.hitFooter,o.appendChild(r),o}}}]).on("autocomplete:selected",(function(e,t){let{document:{u:n,h:r},tokens:a}=t;p.current?.blur();let o=n;if(be.vc&&a.length>0){const e=new URLSearchParams;for(const t of a)e.append(ze,t);o+=`?${e.toString()}`}r&&(o+=r),u.push(o)})).on("autocomplete:closed",(()=>{p.current?.blur()})),f.current.set(S,"done"),h(!1),m.current){const e=p.current;e.value&&x.current?.autocomplete.open(),e.focus()}}),[E,S,i,a,u]);(0,r.useEffect)((()=>{if(!be.vc)return;const e=n?new URLSearchParams(d.search).getAll(ze):[];setTimeout((()=>{const t=document.querySelector("article");if(!t)return;const n=new be.vc(t);n.unmark(),0!==e.length&&n.mark(e),w(e.join(" ")),x.current?.autocomplete.setVal(e.join(" "))}))}),[n,d.search,d.pathname]);const[T,P]=(0,r.useState)(!1),L=(0,r.useCallback)((()=>{m.current=!0,C(),P(!0),t?.(!0)}),[t,C]),j=(0,r.useCallback)((()=>{P(!1),t?.(!1)}),[t]),R=(0,r.useCallback)((()=>{C()}),[C]),N=(0,r.useCallback)((e=>{w(e.target.value),e.target.value&&y(!0)}),[]),O=!!n&&/mac/i.test(navigator.userAgentData?.platform??navigator.platform);(0,r.useEffect)((()=>{if(!be.AY)return;const e=e=>{!(O?e.metaKey:e.ctrlKey)||"k"!==e.key&&"K"!==e.key||(e.preventDefault(),p.current?.focus(),L())};return document.addEventListener("keydown",e),()=>{document.removeEventListener("keydown",e)}}),[O,L]);const I=(0,r.useCallback)((()=>{const e=new URLSearchParams(d.search);e.delete(ze);const t=e.toString(),n=d.pathname+(""!=t?`?${t}`:"")+d.hash;n!=d.pathname+d.search+d.hash&&u.push(n),w(""),x.current?.autocomplete.setVal("")}),[d.pathname,d.search,d.hash,u]);return(0,c.jsxs)("div",{className:(0,ye.Z)("navbar__search",Oe.searchBarContainer,{[Oe.searchIndexLoading]:g&&b,[Oe.focused]:T}),hidden:E,children:[(0,c.jsx)("input",{placeholder:(0,l.I)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"}),"aria-label":"Search",className:"navbar__search-input",onMouseEnter:R,onFocus:L,onBlur:j,onChange:N,ref:p,value:v}),(0,c.jsx)(Fe.Z,{className:Oe.searchBarLoadingRing}),be.AY&&be.t_&&(""!==v?(0,c.jsx)("button",{className:Oe.searchClearButton,onClick:I,children:"\u2715"}):n&&(0,c.jsxs)("div",{className:Oe.searchHintContainer,children:[(0,c.jsx)("kbd",{className:Oe.searchHint,children:O?"\u2318":"ctrl"}),(0,c.jsx)("kbd",{className:Oe.searchHint,children:"K"})]}))]})},$e={navbarSearchContainer:"navbarSearchContainer_Bca1"};function Ue(e){let{children:t,className:n}=e;return(0,c.jsx)("div",{className:(0,a.Z)(n,$e.navbarSearchContainer),children:t})}var qe=n(53438);const He=e=>e.docs.find((t=>t.id===e.mainDocId));const Qe={default:oe,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:r,queryString:a="",...o}=e;const{i18n:{currentLocale:i,locales:u,localeConfigs:d}}=(0,le.Z)(),p=(0,me.l)(),{search:f,hash:m}=(0,s.TH)(),g=[...n,...u.map((e=>{const n=`${`pathname://${p.createUrl({locale:e,fullyQualified:!1})}`}${f}${m}${a}`;return{label:d[e].label,lang:d[e].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...r],h=t?(0,l.I)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):d[i].label;return(0,c.jsx)(fe,{...o,mobile:t,label:(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(ge,{className:he}),h]}),items:g})},search:function(e){let{mobile:t,className:n}=e;return t?null:(0,c.jsx)(Ue,{className:n,children:(0,c.jsx)(Be,{})})},dropdown:fe,html:function(e){let{value:t,className:n,mobile:r=!1,isDropdownItem:o=!1}=e;const i=o?"li":"div";return(0,c.jsx)(i,{className:(0,a.Z)({navbar__item:!r&&!o,"menu__list-item":r},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:r,...a}=e;const{activeDoc:o}=(0,we.Iw)(r),i=(0,qe.vY)(t,r),s=o?.path===i?.path;return null===i||i.unlisted&&!s?null:(0,c.jsx)(oe,{exact:!0,...a,isActive:()=>s||!!o?.sidebar&&o.sidebar===i.sidebar,label:n??i.id,to:i.path})},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:r,...a}=e;const{activeDoc:o}=(0,we.Iw)(r),i=(0,qe.oz)(t,r).link;if(!i)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${t}" doesn't have anything to be linked to.`);return(0,c.jsx)(oe,{exact:!0,...a,isActive:()=>o?.sidebar===t,label:n??i.label,to:i.path})},docsVersion:function(e){let{label:t,to:n,docsPluginId:r,...a}=e;const o=(0,qe.lO)(r)[0],i=t??o.label,s=n??(e=>e.docs.find((t=>t.id===e.mainDocId)))(o).path;return(0,c.jsx)(oe,{...a,label:i,to:s})},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:r,dropdownItemsBefore:a,dropdownItemsAfter:o,...i}=e;const{search:u,hash:d}=(0,s.TH)(),p=(0,we.Iw)(n),f=(0,we.gB)(n),{savePreferredVersionName:m}=(0,ve.J)(n),g=[...a,...f.map((e=>{const t=p.alternateDocVersions[e.name]??He(e);return{label:e.label,to:`${t.path}${u}${d}`,isActive:()=>e===p.activeVersion,onClick:()=>m(e.name)}})),...o],h=(0,qe.lO)(n)[0],b=t&&g.length>1?(0,l.I)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):h.label,y=t&&g.length>1?void 0:He(h).path;return g.length<=1?(0,c.jsx)(oe,{...i,mobile:t,label:b,to:y,isActive:r?()=>!1:void 0}):(0,c.jsx)(fe,{...i,mobile:t,label:b,to:y,items:g,isActive:r?()=>!1:void 0})}};function Ze(e){let{type:t,...n}=e;const r=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),a=Qe[r];if(!a)throw new Error(`No NavbarItem component found for type "${t}".`);return(0,c.jsx)(a,{...n})}function Ve(){const e=(0,L.e)(),t=(0,w.L)().navbar.items;return(0,c.jsx)("ul",{className:"menu__list",children:t.map(((t,n)=>(0,r.createElement)(Ze,{mobile:!0,...t,onClick:()=>e.toggle(),key:n})))})}function Ge(e){return(0,c.jsx)("button",{...e,type:"button",className:"clean-btn navbar-sidebar__back",children:(0,c.jsx)(l.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,c.jsxs)(c.Fragment,{children:[!e&&(0,c.jsx)(Ge,{onClick:()=>t.hide()}),t.content]})}function Ke(){const e=(0,L.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,c.jsx)(F,{header:(0,c.jsx)(K,{}),primaryMenu:(0,c.jsx)(Ve,{}),secondaryMenu:(0,c.jsx)(We,{})}):null}const Ye={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function Xe(e){return(0,c.jsx)("div",{role:"presentation",...e,className:(0,a.Z)("navbar-sidebar__backdrop",e.className)})}function Je(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:o}}=(0,w.L)(),i=(0,L.e)(),{navbarRef:s,isNavbarVisible:d}=function(e){const[t,n]=(0,r.useState)(e),a=(0,r.useRef)(!1),o=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(o.current=e.getBoundingClientRect().height)}),[]);return(0,j.RF)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i=s?n(!1):i+u{if(!e)return;const r=t.location.hash;if(r?document.getElementById(r.substring(1)):void 0)return a.current=!0,void n(!1);n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return(0,c.jsxs)("nav",{ref:s,"aria-label":(0,l.I)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,a.Z)("navbar","navbar--fixed-top",n&&[Ye.navbarHideable,!d&&Ye.navbarHidden],{"navbar--dark":"dark"===o,"navbar--primary":"primary"===o,"navbar-sidebar--show":i.shown}),children:[t,(0,c.jsx)(Xe,{onClick:i.toggle}),(0,c.jsx)(Ke,{})]})}var et=n(69356);const tt={errorBoundaryError:"errorBoundaryError_a6uf",errorBoundaryFallback:"errorBoundaryFallback_VBag"};function nt(e){return(0,c.jsx)("button",{type:"button",...e,children:(0,c.jsx)(l.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 rt(e){let{error:t}=e;const n=(0,et.getErrorCausalChain)(t).map((e=>e.message)).join("\n\nCause:\n");return(0,c.jsx)("p",{className:tt.errorBoundaryError,children:n})}class at extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const ot="right";function it(e){let{width:t=30,height:n=30,className:r,...a}=e;return(0,c.jsx)("svg",{className:r,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true",...a,children:(0,c.jsx)("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"})})}function st(){const{toggle:e,shown:t}=(0,L.e)();return(0,c.jsx)("button",{onClick:e,"aria-label":(0,l.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,c.jsx)(it,{})})}const lt={colorModeToggle:"colorModeToggle_DEke"};function ut(e){let{items:t}=e;return(0,c.jsx)(c.Fragment,{children:t.map(((e,t)=>(0,c.jsx)(at,{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,c.jsx)(Ze,{...e})},t)))})}function ct(e){let{left:t,right:n}=e;return(0,c.jsxs)("div",{className:"navbar__inner",children:[(0,c.jsx)("div",{className:"navbar__items",children:t}),(0,c.jsx)("div",{className:"navbar__items navbar__items--right",children:n})]})}function dt(){const e=(0,L.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),a=t.find((e=>"search"===e.type));return(0,c.jsx)(ct,{left:(0,c.jsxs)(c.Fragment,{children:[!e.disabled&&(0,c.jsx)(st,{}),(0,c.jsx)(G,{}),(0,c.jsx)(ut,{items:n})]}),right:(0,c.jsxs)(c.Fragment,{children:[(0,c.jsx)(ut,{items:r}),(0,c.jsx)(Z,{className:lt.colorModeToggle}),!a&&(0,c.jsx)(Ue,{children:(0,c.jsx)(Be,{})})]})})}function pt(){return(0,c.jsx)(Je,{children:(0,c.jsx)(dt,{})})}function ft(e){let{item:t}=e;const{to:n,href:r,label:a,prependBaseUrlToHref:o,...i}=t,s=(0,X.Z)(n),l=(0,X.Z)(r,{forcePrependBaseUrl:!0});return(0,c.jsxs)(Y.Z,{className:"footer__link-item",...r?{href:o?l:r}:{to:s},...i,children:[a,r&&!(0,J.Z)(r)&&(0,c.jsx)(te.Z,{})]})}function mt(e){let{item:t}=e;return t.html?(0,c.jsx)("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:t.html}}):(0,c.jsx)("li",{className:"footer__item",children:(0,c.jsx)(ft,{item:t})},t.href??t.to)}function gt(e){let{column:t}=e;return(0,c.jsxs)("div",{className:"col footer__col",children:[(0,c.jsx)("div",{className:"footer__title",children:t.title}),(0,c.jsx)("ul",{className:"footer__items clean-list",children:t.items.map(((e,t)=>(0,c.jsx)(mt,{item:e},t)))})]})}function ht(e){let{columns:t}=e;return(0,c.jsx)("div",{className:"row footer__links",children:t.map(((e,t)=>(0,c.jsx)(gt,{column:e},t)))})}function bt(){return(0,c.jsx)("span",{className:"footer__link-separator",children:"\xb7"})}function yt(e){let{item:t}=e;return t.html?(0,c.jsx)("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):(0,c.jsx)(ft,{item:t})}function vt(e){let{links:t}=e;return(0,c.jsx)("div",{className:"footer__links text--center",children:(0,c.jsx)("div",{className:"footer__links",children:t.map(((e,n)=>(0,c.jsxs)(r.Fragment,{children:[(0,c.jsx)(yt,{item:e}),t.length!==n+1&&(0,c.jsx)(bt,{})]},n)))})})}function wt(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?(0,c.jsx)(ht,{columns:t}):(0,c.jsx)(vt,{links:t})}var xt=n(19965);const kt={footerLogoLink:"footerLogoLink_BH7S"};function St(e){let{logo:t}=e;const{withBaseUrl:n}=(0,X.C)(),r={light:n(t.src),dark:n(t.srcDark??t.src)};return(0,c.jsx)(xt.Z,{className:(0,a.Z)("footer__logo",t.className),alt:t.alt,sources:r,width:t.width,height:t.height,style:t.style})}function _t(e){let{logo:t}=e;return t.href?(0,c.jsx)(Y.Z,{href:t.href,className:kt.footerLogoLink,target:t.target,children:(0,c.jsx)(St,{logo:t})}):(0,c.jsx)(St,{logo:t})}function Et(e){let{copyright:t}=e;return(0,c.jsx)("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function Ct(e){let{style:t,links:n,logo:r,copyright:o}=e;return(0,c.jsx)("footer",{className:(0,a.Z)("footer",{"footer--dark":"dark"===t}),children:(0,c.jsxs)("div",{className:"container container-fluid",children:[n,(r||o)&&(0,c.jsxs)("div",{className:"footer__bottom text--center",children:[r&&(0,c.jsx)("div",{className:"margin-bottom--sm",children:r}),o]})]})})}function Tt(){const{footer:e}=(0,w.L)();if(!e)return null;const{copyright:t,links:n,logo:r,style:a}=e;return(0,c.jsx)(Ct,{style:a,links:n&&n.length>0&&(0,c.jsx)(wt,{links:n}),logo:r&&(0,c.jsx)(_t,{logo:r}),copyright:t&&(0,c.jsx)(Et,{copyright:t})})}const Pt=r.memo(Tt),Lt=(0,A.Qc)([M.S,x.pl,j.OC,ve.L5,i.VC,function(e){let{children:t}=e;return(0,c.jsx)(R.n2,{children:(0,c.jsx)(L.M,{children:(0,c.jsx)(O,{children:t})})})}]);function jt(e){let{children:t}=e;return(0,c.jsx)(Lt,{children:t})}var At=n(92503);function Rt(e){let{error:t,tryAgain:n}=e;return(0,c.jsx)("main",{className:"container margin-vert--xl",children:(0,c.jsx)("div",{className:"row",children:(0,c.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,c.jsx)(At.Z,{as:"h1",className:"hero__title",children:(0,c.jsx)(l.Z,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed",children:"This page crashed."})}),(0,c.jsx)("div",{className:"margin-vert--lg",children:(0,c.jsx)(nt,{onClick:n,className:"button button--primary shadow--lw"})}),(0,c.jsx)("hr",{}),(0,c.jsx)("div",{className:"margin-vert--md",children:(0,c.jsx)(rt,{error:t})})]})})})}const Nt={mainWrapper:"mainWrapper_z2l0"};function Ot(e){const{children:t,noFooter:n,wrapperClassName:r,title:s,description:l}=e;return(0,b.t)(),(0,c.jsxs)(jt,{children:[(0,c.jsx)(i.d,{title:s,description:l}),(0,c.jsx)(v,{}),(0,c.jsx)(P,{}),(0,c.jsx)(pt,{}),(0,c.jsx)("div",{id:d,className:(0,a.Z)(h.k.wrapper.main,Nt.mainWrapper,r),children:(0,c.jsx)(o.Z,{fallback:e=>(0,c.jsx)(Rt,{...e}),children:t})}),!n&&(0,c.jsx)(Pt,{})]})}},21327:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});n(67294);var r=n(39960),a=n(44996),o=n(52263),i=n(86668),s=n(19965),l=n(85893);function u(e){let{logo:t,alt:n,imageClassName:r}=e;const o={light:(0,a.Z)(t.src),dark:(0,a.Z)(t.srcDark||t.src)},i=(0,l.jsx)(s.Z,{className:t.className,sources:o,height:t.height,width:t.width,alt:n,style:t.style});return r?(0,l.jsx)("div",{className:r,children:i}):i}function c(e){const{siteConfig:{title:t}}=(0,o.Z)(),{navbar:{title:n,logo:s}}=(0,i.L)(),{imageClassName:c,titleClassName:d,...p}=e,f=(0,a.Z)(s?.href||"/"),m=n?"":t,g=s?.alt??m;return(0,l.jsxs)(r.Z,{to:f,...p,...s?.target&&{target:s.target},children:[s&&(0,l.jsx)(u,{logo:s,alt:g,imageClassName:c}),null!=n&&(0,l.jsx)("b",{className:d,children:n})]})}},90197:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});n(67294);var r=n(35742),a=n(85893);function o(e){let{locale:t,version:n,tag:o}=e;const i=t;return(0,a.jsxs)(r.Z,{children:[t&&(0,a.jsx)("meta",{name:"docusaurus_locale",content:t}),n&&(0,a.jsx)("meta",{name:"docusaurus_version",content:n}),o&&(0,a.jsx)("meta",{name:"docusaurus_tag",content:o}),i&&(0,a.jsx)("meta",{name:"docsearch:language",content:i}),n&&(0,a.jsx)("meta",{name:"docsearch:version",content:n}),o&&(0,a.jsx)("meta",{name:"docsearch:docusaurus_tag",content:o})]})}},19965:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var r=n(67294),a=n(788),o=n(72389),i=n(92949);const s={themedComponent:"themedComponent_mlkZ","themedComponent--light":"themedComponent--light_NVdE","themedComponent--dark":"themedComponent--dark_xIcU"};var l=n(85893);function u(e){let{className:t,children:n}=e;const u=(0,o.Z)(),{colorMode:c}=(0,i.I)();return(0,l.jsx)(l.Fragment,{children:(u?"dark"===c?["dark"]:["light"]:["light","dark"]).map((e=>{const o=n({theme:e,className:(0,a.Z)(t,s.themedComponent,s[`themedComponent--${e}`])});return(0,l.jsx)(r.Fragment,{children:o},e)}))})}function c(e){const{sources:t,className:n,alt:r,...a}=e;return(0,l.jsx)(u,{className:n,children:e=>{let{theme:n,className:o}=e;return(0,l.jsx)("img",{src:t[n],alt:r,className:o,...a})}})}},86043:(e,t,n)=>{"use strict";n.d(t,{u:()=>u,z:()=>b});var r=n(67294),a=n(10412),o=n(20469),i=n(91442),s=n(85893);const l="ease-in-out";function u(e){let{initialState:t}=e;const[n,a]=(0,r.useState)(t??!1),o=(0,r.useCallback)((()=>{a((e=>!e))}),[]);return{collapsed:n,setCollapsed:a,toggleCollapsed:o}}const c={display:"none",overflow:"hidden",height:"0px"},d={display:"block",overflow:"visible",height:"auto"};function p(e,t){const n=t?c:d;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function f(e){let{collapsibleRef:t,collapsed:n,animation:a}=e;const o=(0,r.useRef)(!1);(0,r.useEffect)((()=>{const e=t.current;function r(){const t=e.scrollHeight,n=a?.duration??function(e){if((0,i.n)())return 1;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(t);return{transition:`height ${n}ms ${a?.easing??l}`,height:`${t}px`}}function s(){const t=r();e.style.transition=t.transition,e.style.height=t.height}if(!o.current)return p(e,n),void(o.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(s(),requestAnimationFrame((()=>{e.style.height=c.height,e.style.overflow=c.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{s()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,a])}function m(e){if(!a.Z.canUseDOM)return e?c:d}function g(e){let{as:t="div",collapsed:n,children:a,animation:o,onCollapseTransitionEnd:i,className:l,disableSSRStyle:u}=e;const c=(0,r.useRef)(null);return f({collapsibleRef:c,collapsed:n,animation:o}),(0,s.jsx)(t,{ref:c,style:u?void 0:m(n),onTransitionEnd:e=>{"height"===e.propertyName&&(p(c.current,n),i?.(n))},className:l,children:a})}function h(e){let{collapsed:t,...n}=e;const[a,i]=(0,r.useState)(!t),[l,u]=(0,r.useState)(t);return(0,o.Z)((()=>{t||i(!0)}),[t]),(0,o.Z)((()=>{a&&u(t)}),[a,t]),a?(0,s.jsx)(g,{...n,collapsed:l}):null}function b(e){let{lazy:t,...n}=e;const r=t?h:g;return(0,s.jsx)(r,{...n})}},59689:(e,t,n)=>{"use strict";n.d(t,{nT:()=>g,pl:()=>m});var r=n(67294),a=n(72389),o=n(50012),i=n(902),s=n(86668),l=n(85893);const u=(0,o.WA)("docusaurus.announcement.dismiss"),c=(0,o.WA)("docusaurus.announcement.id"),d=()=>"true"===u.get(),p=e=>u.set(String(e)),f=r.createContext(null);function m(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,s.L)(),t=(0,a.Z)(),[n,o]=(0,r.useState)((()=>!!t&&d()));(0,r.useEffect)((()=>{o(d())}),[]);const i=(0,r.useCallback)((()=>{p(!0),o(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=c.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;c.set(t),r&&p(!1),!r&&d()||o(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return(0,l.jsx)(f.Provider,{value:n,children:t})}function g(){const e=(0,r.useContext)(f);if(!e)throw new i.i6("AnnouncementBarProvider");return e}},92949:(e,t,n)=>{"use strict";n.d(t,{I:()=>b,S:()=>h});var r=n(67294),a=n(10412),o=n(902),i=n(50012),s=n(86668),l=n(85893);const u=r.createContext(void 0),c="theme",d=(0,i.WA)(c),p={light:"light",dark:"dark"},f=e=>e===p.dark?p.dark:p.light,m=e=>a.Z.canUseDOM?f(document.documentElement.getAttribute("data-theme")):f(e),g=e=>{d.set(f(e))};function h(e){let{children:t}=e;const n=function(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,s.L)(),[a,o]=(0,r.useState)(m(e));(0,r.useEffect)((()=>{t&&d.del()}),[t]);const i=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:a=!0}=r;t?(o(t),a&&g(t)):(o(n?window.matchMedia("(prefers-color-scheme: dark)").matches?p.dark:p.light:e),d.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",f(a))}),[a]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==c)return;const t=d.get();null!==t&&i(f(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,i]);const l=(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||l.current?l.current=window.matchMedia("print").matches:i(null)};return e.addListener(r),()=>e.removeListener(r)}),[i,t,n]),(0,r.useMemo)((()=>({colorMode:a,setColorMode:i,get isDarkTheme(){return a===p.dark},setLightTheme(){i(p.light)},setDarkTheme(){i(p.dark)}})),[a,i])}();return(0,l.jsx)(u.Provider,{value:n,children:t})}function b(){const e=(0,r.useContext)(u);if(null==e)throw new o.i6("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},60373:(e,t,n)=>{"use strict";n.d(t,{J:()=>v,L5:()=>b});var r=n(67294),a=n(80143),o=n(29935),i=n(86668),s=n(53438),l=n(902),u=n(50012),c=n(85893);const d=e=>`docs-preferred-version-${e}`,p={save:(e,t,n)=>{(0,u.WA)(d(e),{persistence:t}).set(n)},read:(e,t)=>(0,u.WA)(d(e),{persistence:t}).get(),clear:(e,t)=>{(0,u.WA)(d(e),{persistence:t}).del()}},f=e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}])));const m=r.createContext(null);function g(){const e=(0,a._r)(),t=(0,i.L)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[o,s]=(0,r.useState)((()=>f(n)));(0,r.useEffect)((()=>{s(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function a(e){const t=p.read(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(p.clear(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,a(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[o,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){p.save(e,t,n),s((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function h(e){let{children:t}=e;const n=g();return(0,c.jsx)(m.Provider,{value:n,children:t})}function b(e){let{children:t}=e;return s.cE?(0,c.jsx)(h,{children:t}):(0,c.jsx)(c.Fragment,{children:t})}function y(){const e=(0,r.useContext)(m);if(!e)throw new l.i6("DocsPreferredVersionContextProvider");return e}function v(e){void 0===e&&(e=o.m);const t=(0,a.zh)(e),[n,i]=y(),{preferredVersionName:s}=n[e];return{preferredVersion:t.versions.find((e=>e.name===s))??null,savePreferredVersionName:(0,r.useCallback)((t=>{i.savePreferredVersion(e,t)}),[i,e])}}},1116:(e,t,n)=>{"use strict";n.d(t,{V:()=>u,b:()=>l});var r=n(67294),a=n(902),o=n(85893);const i=Symbol("EmptyContext"),s=r.createContext(i);function l(e){let{children:t,name:n,items:a}=e;const i=(0,r.useMemo)((()=>n&&a?{name:n,items:a}:null),[n,a]);return(0,o.jsx)(s.Provider,{value:i,children:t})}function u(){const e=(0,r.useContext)(s);if(e===i)throw new a.i6("DocsSidebarProvider");return e}},74477:(e,t,n)=>{"use strict";n.d(t,{E:()=>l,q:()=>s});var r=n(67294),a=n(902),o=n(85893);const i=r.createContext(null);function s(e){let{children:t,version:n}=e;return(0,o.jsx)(i.Provider,{value:n,children:t})}function l(){const e=(0,r.useContext)(i);if(null===e)throw new a.i6("DocsVersionProvider");return e}},93163:(e,t,n)=>{"use strict";n.d(t,{M:()=>p,e:()=>f});var r=n(67294),a=n(13102),o=n(87524),i=n(91980),s=n(86668),l=n(902),u=n(85893);const c=r.createContext(void 0);function d(){const e=function(){const e=(0,a.HY)(),{items:t}=(0,s.L)().navbar;return 0===t.length&&!e.component}(),t=(0,o.i)(),n=!e&&"mobile"===t,[l,u]=(0,r.useState)(!1);(0,i.Rb)((()=>{if(l)return u(!1),!1}));const c=(0,r.useCallback)((()=>{u((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&u(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:c,shown:l})),[e,n,c,l])}function p(e){let{children:t}=e;const n=d();return(0,u.jsx)(c.Provider,{value:n,children:t})}function f(){const e=r.useContext(c);if(void 0===e)throw new l.i6("NavbarMobileSidebarProvider");return e}},13102:(e,t,n)=>{"use strict";n.d(t,{HY:()=>l,Zo:()=>u,n2:()=>s});var r=n(67294),a=n(902),o=n(85893);const i=r.createContext(null);function s(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return(0,o.jsx)(i.Provider,{value:n,children:t})}function l(){const e=(0,r.useContext)(i);if(!e)throw new a.i6("NavbarSecondaryMenuContentProvider");return e[0]}function u(e){let{component:t,props:n}=e;const o=(0,r.useContext)(i);if(!o)throw new a.i6("NavbarSecondaryMenuContentProvider");const[,s]=o,l=(0,a.Ql)(n);return(0,r.useEffect)((()=>{s({component:t,props:l})}),[s,t,l]),(0,r.useEffect)((()=>()=>s({component:null,props:null})),[s]),null}},19727:(e,t,n)=>{"use strict";n.d(t,{h:()=>a,t:()=>o});var r=n(67294);const a="navigation-with-keyboard";function o(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(a),"mousedown"===e.type&&document.body.classList.remove(a)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(a),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},87524:(e,t,n)=>{"use strict";n.d(t,{i:()=>s});var r=n(67294),a=n(10412);const o={desktop:"desktop",mobile:"mobile",ssr:"ssr"},i=996;function s(){const[e,t]=(0,r.useState)((()=>"ssr"));return(0,r.useEffect)((()=>{function e(){t(function(){if(!a.Z.canUseDOM)throw new Error("getWindowSize() should only be called after React hydration");return window.innerWidth>i?o.desktop:o.mobile}())}return e(),window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}}),[]),e}},35281:(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:{}}},91442:(e,t,n)=>{"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{n:()=>r})},53438:(e,t,n)=>{"use strict";n.d(t,{LM:()=>f,SN:()=>_,_F:()=>h,cE:()=>p,f:()=>y,lO:()=>x,oz:()=>k,s1:()=>w,vY:()=>S});var r=n(67294),a=n(16550),o=n(18790),i=n(80143),s=n(60373),l=n(74477),u=n(1116),c=n(67392),d=n(48596);const p=!!i._r;function f(e){return"link"!==e.type||e.unlisted?"category"===e.type?function(e){if(e.href&&!e.linkUnlisted)return e.href;for(const t of e.items){const e=f(t);if(e)return e}}(e):void 0:e.href}const m=(e,t)=>void 0!==e&&(0,d.Mg)(e,t),g=(e,t)=>e.some((e=>h(e,t)));function h(e,t){return"link"===e.type?m(e.href,t):"category"===e.type&&(m(e.href,t)||g(e.items,t))}function b(e,t){switch(e.type){case"category":return h(e,t)||e.items.some((e=>b(e,t)));case"link":return!e.unlisted||h(e,t);default:return!0}}function y(e,t){return(0,r.useMemo)((()=>e.filter((e=>b(e,t)))),[e,t])}function v(e){let{sidebarItems:t,pathname:n,onlyCategories:r=!1}=e;const a=[];return function e(t){for(const o of t)if("category"===o.type&&((0,d.Mg)(o.href,n)||e(o.items))||"link"===o.type&&(0,d.Mg)(o.href,n)){return r&&"category"!==o.type||a.unshift(o),!0}return!1}(t),a}function w(){const e=(0,u.V)(),{pathname:t}=(0,a.TH)(),n=(0,i.gA)()?.pluginData.breadcrumbs;return!1!==n&&e?v({sidebarItems:e.items,pathname:t}):null}function x(e){const{activeVersion:t}=(0,i.Iw)(e),{preferredVersion:n}=(0,s.J)(e),a=(0,i.yW)(e);return(0,r.useMemo)((()=>(0,c.j)([t,n,a].filter(Boolean))),[t,n,a])}function k(e,t){const n=x(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),r=t.find((t=>t[0]===e));if(!r)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map((e=>e.name)).join(", ")}".\nAvailable sidebar ids are:\n- ${t.map((e=>e[0])).join("\n- ")}`);return r[1]}),[e,n])}function S(e,t){const n=x(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),r=t.find((t=>t.id===e));if(!r){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error(`Couldn't find any doc with id "${e}" in version${n.length>1?"s":""} "${n.map((e=>e.name)).join(", ")}".\nAvailable doc ids are:\n- ${(0,c.j)(t.map((e=>e.id))).join("\n- ")}`)}return r}),[e,n])}function _(e){let{route:t}=e;const n=(0,a.TH)(),r=(0,l.E)(),i=t.routes,s=i.find((e=>(0,a.LX)(n.pathname,e)));if(!s)return null;const u=s.sidebar,c=u?r.docsSidebars[u]:void 0;return{docElement:(0,o.H)(i),sidebarName:u,sidebarItems:c}}},91980:(e,t,n)=>{"use strict";n.d(t,{Rb:()=>i,_X:()=>s});var r=n(67294),a=n(16550),o=n(902);function i(e){!function(e){const t=(0,a.k6)(),n=(0,o.zX)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}function s(e){return function(e){const t=(0,a.k6)();return(0,r.useSyncExternalStore)(t.listen,(()=>e(t)),(()=>e(t)))}((t=>null===e?null:new URLSearchParams(t.location.search).get(e)))}},67392:(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 a(e){return Array.from(new Set(e))}n.d(t,{j:()=>a,l:()=>r})},1944:(e,t,n)=>{"use strict";n.d(t,{FG:()=>f,d:()=>d,VC:()=>m});var r=n(67294),a=n(788),o=n(35742),i=n(30226);function s(){const e=r.useContext(i._);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var l=n(44996),u=n(52263);var c=n(85893);function d(e){let{title:t,description:n,keywords:r,image:a,children:i}=e;const s=function(e){const{siteConfig:t}=(0,u.Z)(),{title:n,titleDelimiter:r}=t;return e?.trim().length?`${e.trim()} ${r} ${n}`:n}(t),{withBaseUrl:d}=(0,l.C)(),p=a?d(a,{absolute:!0}):void 0;return(0,c.jsxs)(o.Z,{children:[t&&(0,c.jsx)("title",{children:s}),t&&(0,c.jsx)("meta",{property:"og:title",content:s}),n&&(0,c.jsx)("meta",{name:"description",content:n}),n&&(0,c.jsx)("meta",{property:"og:description",content:n}),r&&(0,c.jsx)("meta",{name:"keywords",content:Array.isArray(r)?r.join(","):r}),p&&(0,c.jsx)("meta",{property:"og:image",content:p}),p&&(0,c.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),s=(0,a.Z)(i,t);return(0,c.jsxs)(p.Provider,{value:s,children:[(0,c.jsx)(o.Z,{children:(0,c.jsx)("html",{className:s})}),n]})}function m(e){let{children:t}=e;const n=s(),r=`plugin-${n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const o=`plugin-id-${n.plugin.id}`;return(0,c.jsx)(f,{className:(0,a.Z)(r,o),children:t})}},902:(e,t,n)=>{"use strict";n.d(t,{D9:()=>s,Qc:()=>c,Ql:()=>u,i6:()=>l,zX:()=>i});var r=n(67294),a=n(20469),o=n(85893);function i(e){const t=(0,r.useRef)(e);return(0,a.Z)((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function s(e){const t=(0,r.useRef)();return(0,a.Z)((()=>{t.current=e})),t.current}class l 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 u(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function c(e){return t=>{let{children:n}=t;return(0,o.jsx)(o.Fragment,{children:e.reduceRight(((e,t)=>(0,o.jsx)(t,{children:e})),n)})}}},48596:(e,t,n)=>{"use strict";n.d(t,{Mg:()=>i,Ns:()=>s});var r=n(67294),a=n(723),o=n(52263);function i(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function s(){const{baseUrl:e}=(0,o.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 a(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(a).flatMap((e=>e.routes??[])))}(n)}({routes:a.Z,baseUrl:e})),[e])}},12466:(e,t,n)=>{"use strict";n.d(t,{Ct:()=>g,OC:()=>c,RF:()=>f,o5:()=>m});var r=n(67294),a=n(10412),o=n(72389),i=n(20469),s=n(902),l=n(85893);const u=r.createContext(void 0);function c(e){let{children:t}=e;const n=function(){const e=(0,r.useRef)(!0);return(0,r.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return(0,l.jsx)(u.Provider,{value:n,children:t})}function d(){const e=(0,r.useContext)(u);if(null==e)throw new s.i6("ScrollControllerProvider");return e}const p=()=>a.Z.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function f(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=d(),a=(0,r.useRef)(p()),o=(0,s.zX)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=p();o(e,a.current),a.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[o,n,...t])}function m(){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),a=(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:a}}function g(){const e=(0,r.useRef)(null),t=(0,o.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 a=document.documentElement.scrollTop;(n&&a>e||!n&&at&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},43320:(e,t,n)=>{"use strict";n.d(t,{HX:()=>r,os:()=>a});n(52263);const r="default";function a(e,t){return`docs-${e}-${t}`}},50012:(e,t,n)=>{"use strict";n.d(t,{Nk:()=>c,WA:()=>u});var r=n(67294);const a="localStorage";function o(e){let{key:t,oldValue:n,newValue:r,storage:a}=e;if(n===r)return;const o=document.createEvent("StorageEvent");o.initStorageEvent("storage",!1,!1,t,n,r,window.location.href,a),window.dispatchEvent(o)}function i(e){if(void 0===e&&(e=a),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,s||(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),s=!0),null}var t}let s=!1;const l={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function u(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?l:{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),o({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),o({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 c(e,t){const n=(0,r.useRef)((()=>null===e?l:u(e,t))).current(),a=(0,r.useCallback)((e=>"undefined"==typeof window?()=>{}:n.listen(e)),[n]);return[(0,r.useSyncExternalStore)(a,(()=>"undefined"==typeof window?null:n.get()),(()=>null)),n]}},94711:(e,t,n)=>{"use strict";n.d(t,{l:()=>i});var r=n(52263),a=n(16550),o=n(69356);function i(){const{siteConfig:{baseUrl:e,url:t,trailingSlash:n},i18n:{defaultLocale:i,currentLocale:s}}=(0,r.Z)(),{pathname:l}=(0,a.TH)(),u=(0,o.applyTrailingSlash)(l,{trailingSlash:n,baseUrl:e}),c=s===i?e:e.replace(`/${s}/`,"/"),d=u.replace(e,"");return{createUrl:function(e){let{locale:n,fullyQualified:r}=e;return`${r?t:""}${function(e){return e===i?`${c}`:`${c}${e}/`}(n)}${d}`}}}},85936:(e,t,n)=>{"use strict";n.d(t,{S:()=>i});var r=n(67294),a=n(16550),o=n(902);function i(e){const t=(0,a.TH)(),n=(0,o.D9)(t),i=(0,o.zX)(e);(0,r.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},86668:(e,t,n)=>{"use strict";n.d(t,{L:()=>a});var r=n(52263);function a(){return(0,r.Z)().siteConfig.themeConfig}},80311:(e,t,n)=>{"use strict";n.d(t,{Z:()=>i});n(67294);var r=n(86010);const a={loadingRing:"loadingRing_RJI3","loading-ring":"loading-ring_FB5o"};var o=n(85893);function i(e){let{className:t}=e;return(0,o.jsxs)("div",{className:(0,r.Z)(a.loadingRing,t),children:[(0,o.jsx)("div",{}),(0,o.jsx)("div",{}),(0,o.jsx)("div",{}),(0,o.jsx)("div",{})]})}},90022:(e,t,n)=>{"use strict";n.d(t,{w:()=>s});var r=n(31336),a=n.n(r),o=n(61029);const i=new Map;function s(e,t){const n=`${e}${t}`;let r=i.get(n);return r||(r=async function(e,t){{const n=`${e}${o.J.replace("{dir}",t?`-${t.replace(/\//g,"-")}`:"")}`;if(new URL(n,location.origin).origin!==location.origin)throw new Error("Unexpected version url");const r=await(await fetch(n)).json(),i=r.map(((e,t)=>{let{documents:n,index:r}=e;return{type:t,documents:n,index:a().Index.load(r)}})),s=r.reduce(((e,t)=>{for(const n of t.index.invertedIndex)/\p{Unified_Ideograph}/u.test(n[0][0])&&e.add(n[0]);return e}),new Set);return{wrappedIndexes:i,zhDictionary:Array.from(s)}}return{wrappedIndexes:[],zhDictionary:[]}}(e,t),i.set(n,r)),r}},98202:(e,t,n)=>{"use strict";n.d(t,{v:()=>l});var r=n(31336),a=n.n(r);var o=n(61029);function i(e){return s(e).concat(s(e.filter((e=>{const t=e[e.length-1];return!t.trailing&&t.maybeTyping})),!0))}function s(e,t){return e.map((e=>({tokens:e.map((e=>e.value)),term:e.map((e=>({value:e.value,presence:a().Query.presence.REQUIRED,wildcard:(t?e.trailing||e.maybeTyping:e.trailing)?a().Query.wildcard.TRAILING:a().Query.wildcard.NONE})))})))}function l(e,t,n){return function(r,s){const l=function(e,t){if(1===t.length&&["ja","jp","th"].includes(t[0]))return a()[t[0]].tokenizer(e).map((e=>e.toString()));let n=/[^-\s]+/g;return t.includes("zh")&&(n=/\w+|\p{Unified_Ideograph}+/gu),e.toLowerCase().match(n)||[]}(r,o.dK);if(0===l.length)return void s([]);const u=function(e,t){const n=function(e,t){const n=[];return function e(r,a){if(0===r.length)return void n.push(a);const o=r[0];if(/\p{Unified_Ideograph}/u.test(o)){const n=function(e,t){const n=[];return function e(r,a){let o=0,i=!1;for(const s of t)if(r.substr(0,s.length)===s){const t={missed:a.missed,term:a.term.concat({value:s})};r.length>s.length?e(r.substr(s.length),t):n.push(t),i=!0}else for(let t=s.length-1;t>o;t-=1){const l=s.substr(0,t);if(r.substr(0,t)===l){o=t;const s={missed:a.missed,term:a.term.concat({value:l,trailing:!0})};r.length>t?e(r.substr(t),s):n.push(s),i=!0;break}}i||(r.length>0?e(r.substr(1),{missed:a.missed+1,term:a.term}):a.term.length>0&&n.push(a))}(e,{missed:0,term:[]}),n.sort(((e,t)=>{const n=e.missed>0?1:0,r=t.missed>0?1:0;return n!==r?n-r:e.term.length-t.term.length})).map((e=>e.term))}(o,t);for(const t of n){const n=a.concat(...t);e(r.slice(1),n)}}else{const t=a.concat({value:o});e(r.slice(1),t)}}(e,[]),n}(e,t);if(0===n.length)return[{tokens:e,term:e.map((e=>({value:e,presence:a().Query.presence.REQUIRED,wildcard:a().Query.wildcard.LEADING|a().Query.wildcard.TRAILING})))}];for(const a of n)a[a.length-1].maybeTyping=!0;const r=[];for(const i of o.dK)if("en"===i)o._k||r.unshift(a().stopWordFilter);else{const e=a()[i];e.stopWordFilter&&r.unshift(e.stopWordFilter)}let s;if(r.length>0){const e=e=>r.reduce(((e,t)=>e.filter((e=>t(e.value)))),e);s=[];const t=[];for(const r of n){const n=e(r);s.push(n),n.length0&&t.push(n)}n.push(...t)}else s=n.slice();const l=[];for(const a of s)if(a.length>2)for(let e=a.length-1;e>=0;e-=1)l.push(a.slice(0,e).concat(a.slice(e+1)));return i(n).concat(i(l))}(l,t),c=[];e:for(const{term:t,tokens:a}of u)for(const{documents:r,index:o,type:i}of e)if(c.push(...o.query((e=>{for(const n of t)e.term(n.value,{wildcard:n.wildcard,presence:n.presence})})).slice(0,n).filter((e=>!c.some((t=>t.document.i.toString()===e.ref)))).slice(0,n-c.length).map((t=>{const n=r.find((e=>e.i.toString()===t.ref));return{document:n,type:i,page:0!==i&&e[0].documents.find((e=>e.i===n.p)),metadata:t.matchData.metadata,tokens:a,score:t.score}}))),c.length>=n)break e;!function(e){e.forEach(((e,t)=>{e.index=t})),e.sort(((t,n)=>{let r=t.type>0&&t.page?e.findIndex((e=>e.document===t.page)):t.index,a=n.type>0&&n.page?e.findIndex((e=>e.document===n.page)):n.index;return-1===r&&(r=t.index),-1===a&&(a=n.index),r===a?0===t.type?-1:0===n.type?1:t.index-n.index:r-a}))}(c),function(e){e.forEach(((t,n)=>{n>0&&t.page&&e.some((e=>e.document===t.page))&&(n{"use strict";function r(e){return e.join(" \u203a ")}n.d(t,{e:()=>r})},21690:(e,t,n)=>{"use strict";function r(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}n.d(t,{X:()=>r})},91073:(e,t,n)=>{"use strict";function r(e,t){const n=[];for(const r of Object.values(e))r[t]&&n.push(...r[t].position);return n.sort(((e,t)=>e[0]-t[0]||t[1]-e[1]))}n.d(t,{m:()=>r})},82539:(e,t,n)=>{"use strict";n.d(t,{C:()=>a});var r=n(21690);function a(e,t,n){const o=[];for(const i of t){const n=e.toLowerCase().indexOf(i);if(n>=0){n>0&&o.push(a(e.substr(0,n),t)),o.push(`${(0,r.X)(e.substr(n,i.length))}`);const s=n+i.length;s${(0,r.X)(e)}`:(0,r.X)(e):o.join("")}},10726:(e,t,n)=>{"use strict";n.d(t,{o:()=>l});var r=n(21690),a=n(82539);const o=/\w+|\p{Unified_Ideograph}/u;function i(e){const t=[];let n=0,r=e;for(;r.length>0;){const a=r.match(o);if(!a){t.push(r);break}a.index>0&&t.push(r.substring(0,a.index)),t.push(a[0]),n+=a.index+a[0].length,r=e.substring(n)}return t}var s=n(61029);function l(e,t,n,o){void 0===o&&(o=s.Hk);const{chunkIndex:l,chunks:u}=function(e,t,n){const o=[];let s=0,l=0,u=-1;for(;sl){const t=i(e.substring(l,c)).map((e=>({html:(0,r.X)(e),textLength:e.length})));for(const e of t)o.push(e)}-1===u&&(u=o.length),l=c+d,o.push({html:(0,a.C)(e.substring(c,l),n,!0),textLength:d})}}if(l({html:(0,r.X)(e),textLength:e.length})));for(const e of t)o.push(e)}return{chunkIndex:u,chunks:o}}(e,t,n),c=u.slice(0,l),d=u[l],p=[d.html],f=u.slice(l+1);let m=d.textLength,g=0,h=0,b=!1,y=!1;for(;m0){const e=c.pop();m+e.textLength<=o?(p.unshift(e.html),g+=e.textLength,m+=e.textLength):(b=!0,c.length=0)}else{if(!(f.length>0))break;{const e=f.shift();m+e.textLength<=o?(p.push(e.html),h+=e.textLength,m+=e.textLength):(y=!0,f.length=0)}}return(b||c.length>0)&&p.unshift("\u2026"),(y||f.length>0)&&p.push("\u2026"),p.join("")}},61029:(e,t,n)=>{"use strict";n.d(t,{vc:()=>o,gQ:()=>f,H6:()=>u,hG:()=>h,l9:()=>m,dK:()=>r,_k:()=>a,pu:()=>p,AY:()=>c,t_:()=>d,Kc:()=>g,J:()=>i,Hk:()=>l,qo:()=>s,pQ:()=>b});n(31336);const r=["en"],a=!1,o=null,i="search-index{dir}.json?_=331bc2e2",s=8,l=50,u=!1,c=!0,d=!0,p="right",f=void 0,m=!0,g=null,h=!1,b=!1},86010:(e,t,n)=>{"use strict";function r(e){var t,n,a="";if("string"==typeof e||"number"==typeof e)a+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;ta});const a=function(){for(var e,t,n=0,a="";n{"use strict";n.d(t,{lX:()=>w,q_:()=>C,ob:()=>f,PP:()=>P,Ep:()=>p});var r=n(87462);function a(e){return"/"===e.charAt(0)}function o(e,t){for(var n=t,r=n+1,a=e.length;r=0;p--){var f=i[p];"."===f?o(i,p):".."===f?(o(i,p),d++):d&&(o(i,p),d--)}if(!u)for(;d--;d)i.unshift("..");!u||""===i[0]||i[0]&&a(i[0])||i.unshift("");var m=i.join("/");return n&&"/"!==m.substr(-1)&&(m+="/"),m};var s=n(38776);function l(e){return"/"===e.charAt(0)?e:"/"+e}function u(e){return"/"===e.charAt(0)?e.substr(1):e}function c(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function d(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function p(e){var t=e.pathname,n=e.search,r=e.hash,a=t||"/";return n&&"?"!==n&&(a+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(a+="#"===r.charAt(0)?r:"#"+r),a}function f(e,t,n,a){var o;"string"==typeof e?(o=function(e){var t=e||"/",n="",r="",a=t.indexOf("#");-1!==a&&(r=t.substr(a),t=t.substr(0,a));var o=t.indexOf("?");return-1!==o&&(n=t.substr(o),t=t.substr(0,o)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),o.state=t):(void 0===(o=(0,r.Z)({},e)).pathname&&(o.pathname=""),o.search?"?"!==o.search.charAt(0)&&(o.search="?"+o.search):o.search="",o.hash?"#"!==o.hash.charAt(0)&&(o.hash="#"+o.hash):o.hash="",void 0!==t&&void 0===o.state&&(o.state=t));try{o.pathname=decodeURI(o.pathname)}catch(s){throw s instanceof URIError?new URIError('Pathname "'+o.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):s}return n&&(o.key=n),a?o.pathname?"/"!==o.pathname.charAt(0)&&(o.pathname=i(o.pathname,a.pathname)):o.pathname=a.pathname:o.pathname||(o.pathname="/"),o}function m(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,a){if(null!=e){var o="function"==typeof e?e(t,n):e;"string"==typeof o?"function"==typeof r?r(o,a):a(!0):a(!1!==o)}else a(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;rt?n.splice(t,n.length-t,a):n.push(a),d({action:r,location:a,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",a=f(e,t,g(),w.location);c.confirmTransitionTo(a,r,n,(function(e){e&&(w.entries[w.index]=a,d({action:r,location:a}))}))},go:v,goBack:function(){v(-1)},goForward:function(){v(1)},canGo:function(e){var t=w.index+e;return t>=0&&t{"use strict";var r=n(59864),a={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},o={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},s={};function l(e){return r.isMemo(e)?i:s[e.$$typeof]||a}s[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},s[r.Memo]=i;var u=Object.defineProperty,c=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,p=Object.getOwnPropertyDescriptor,f=Object.getPrototypeOf,m=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(m){var a=f(n);a&&a!==m&&e(t,a,r)}var i=c(n);d&&(i=i.concat(d(n)));for(var s=l(t),g=l(n),h=0;h{"use strict";e.exports=function(e,t,n,r,a,o,i,s){if(!e){var l;if(void 0===t)l=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var u=[n,r,a,o,i,s],c=0;(l=new Error(t.replace(/%s/g,(function(){return u[c++]})))).name="Invariant Violation"}throw l.framesToPop=1,l}}},5826:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},31336:(e,t,n)=>{var r,a;!function(){var o,i,s,l,u,c,d,p,f,m,g,h,b,y,v,w,x,k,S,_,E,C,T,P,L,j,A,R,N,O,I=function(e){var t=new I.Builder;return t.pipeline.add(I.trimmer,I.stopWordFilter,I.stemmer),t.searchPipeline.add(I.stemmer),e.call(t,t),t.build()};I.version="2.3.9",I.utils={},I.utils.warn=(o=this,function(e){o.console&&console.warn&&console.warn(e)}),I.utils.asString=function(e){return null==e?"":e.toString()},I.utils.clone=function(e){if(null==e)return e;for(var t=Object.create(null),n=Object.keys(e),r=0;r0){var l=I.utils.clone(t)||{};l.position=[i,s],l.index=a.length,a.push(new I.Token(n.slice(i,o),l))}i=o+1}}return a},I.tokenizer.separator=/[\s\-]+/,I.Pipeline=function(){this._stack=[]},I.Pipeline.registeredFunctions=Object.create(null),I.Pipeline.registerFunction=function(e,t){t in this.registeredFunctions&&I.utils.warn("Overwriting existing registered function: "+t),e.label=t,I.Pipeline.registeredFunctions[e.label]=e},I.Pipeline.warnIfFunctionNotRegistered=function(e){e.label&&e.label in this.registeredFunctions||I.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},I.Pipeline.load=function(e){var t=new I.Pipeline;return e.forEach((function(e){var n=I.Pipeline.registeredFunctions[e];if(!n)throw new Error("Cannot load unregistered function: "+e);t.add(n)})),t},I.Pipeline.prototype.add=function(){Array.prototype.slice.call(arguments).forEach((function(e){I.Pipeline.warnIfFunctionNotRegistered(e),this._stack.push(e)}),this)},I.Pipeline.prototype.after=function(e,t){I.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw new Error("Cannot find existingFn");n+=1,this._stack.splice(n,0,t)},I.Pipeline.prototype.before=function(e,t){I.Pipeline.warnIfFunctionNotRegistered(t);var n=this._stack.indexOf(e);if(-1==n)throw new Error("Cannot find existingFn");this._stack.splice(n,0,t)},I.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);-1!=t&&this._stack.splice(t,1)},I.Pipeline.prototype.run=function(e){for(var t=this._stack.length,n=0;n1&&(oe&&(n=a),o!=e);)r=n-t,a=t+Math.floor(r/2),o=this.elements[2*a];return o==e||o>e?2*a:os?u+=2:i==s&&(t+=n[l+1]*r[u+1],l+=2,u+=2);return t},I.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},I.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,n=0;t0){var o,i=a.str.charAt(0);i in a.node.edges?o=a.node.edges[i]:(o=new I.TokenSet,a.node.edges[i]=o),1==a.str.length&&(o.final=!0),r.push({node:o,editsRemaining:a.editsRemaining,str:a.str.slice(1)})}if(0!=a.editsRemaining){if("*"in a.node.edges)var s=a.node.edges["*"];else{s=new I.TokenSet;a.node.edges["*"]=s}if(0==a.str.length&&(s.final=!0),r.push({node:s,editsRemaining:a.editsRemaining-1,str:a.str}),a.str.length>1&&r.push({node:a.node,editsRemaining:a.editsRemaining-1,str:a.str.slice(1)}),1==a.str.length&&(a.node.final=!0),a.str.length>=1){if("*"in a.node.edges)var l=a.node.edges["*"];else{l=new I.TokenSet;a.node.edges["*"]=l}1==a.str.length&&(l.final=!0),r.push({node:l,editsRemaining:a.editsRemaining-1,str:a.str.slice(1)})}if(a.str.length>1){var u,c=a.str.charAt(0),d=a.str.charAt(1);d in a.node.edges?u=a.node.edges[d]:(u=new I.TokenSet,a.node.edges[d]=u),1==a.str.length&&(u.final=!0),r.push({node:u,editsRemaining:a.editsRemaining-1,str:c+a.str.slice(2)})}}}return n},I.TokenSet.fromString=function(e){for(var t=new I.TokenSet,n=t,r=0,a=e.length;r=e;t--){var n=this.uncheckedNodes[t],r=n.child.toString();r in this.minimizedNodes?n.parent.edges[n.char]=this.minimizedNodes[r]:(n.child._str=r,this.minimizedNodes[r]=n.child),this.uncheckedNodes.pop()}},I.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},I.Index.prototype.search=function(e){return this.query((function(t){new I.QueryParser(e,t).parse()}))},I.Index.prototype.query=function(e){for(var t=new I.Query(this.fields),n=Object.create(null),r=Object.create(null),a=Object.create(null),o=Object.create(null),i=Object.create(null),s=0;s1?1:e},I.Builder.prototype.k1=function(e){this._k1=e},I.Builder.prototype.add=function(e,t){var n=e[this._ref],r=Object.keys(this._fields);this._documents[n]=t||{},this.documentCount+=1;for(var a=0;a=this.length)return I.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},I.QueryLexer.prototype.width=function(){return this.pos-this.start},I.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},I.QueryLexer.prototype.backup=function(){this.pos-=1},I.QueryLexer.prototype.acceptDigitRun=function(){var e,t;do{t=(e=this.next()).charCodeAt(0)}while(t>47&&t<58);e!=I.QueryLexer.EOS&&this.backup()},I.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(I.QueryLexer.TERM)),e.ignore(),e.more())return I.QueryLexer.lexText},I.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(I.QueryLexer.EDIT_DISTANCE),I.QueryLexer.lexText},I.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(I.QueryLexer.BOOST),I.QueryLexer.lexText},I.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(I.QueryLexer.TERM)},I.QueryLexer.termSeparator=I.tokenizer.separator,I.QueryLexer.lexText=function(e){for(;;){var t=e.next();if(t==I.QueryLexer.EOS)return I.QueryLexer.lexEOS;if(92!=t.charCodeAt(0)){if(":"==t)return I.QueryLexer.lexField;if("~"==t)return e.backup(),e.width()>0&&e.emit(I.QueryLexer.TERM),I.QueryLexer.lexEditDistance;if("^"==t)return e.backup(),e.width()>0&&e.emit(I.QueryLexer.TERM),I.QueryLexer.lexBoost;if("+"==t&&1===e.width())return e.emit(I.QueryLexer.PRESENCE),I.QueryLexer.lexText;if("-"==t&&1===e.width())return e.emit(I.QueryLexer.PRESENCE),I.QueryLexer.lexText;if(t.match(I.QueryLexer.termSeparator))return I.QueryLexer.lexTerm}else e.escapeCharacter()}},I.QueryParser=function(e,t){this.lexer=new I.QueryLexer(e),this.query=t,this.currentClause={},this.lexemeIdx=0},I.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=I.QueryParser.parseClause;e;)e=e(this);return this.query},I.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},I.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},I.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},I.QueryParser.parseClause=function(e){var t=e.peekLexeme();if(null!=t)switch(t.type){case I.QueryLexer.PRESENCE:return I.QueryParser.parsePresence;case I.QueryLexer.FIELD:return I.QueryParser.parseField;case I.QueryLexer.TERM:return I.QueryParser.parseTerm;default:var n="expected either a field or a term, found "+t.type;throw t.str.length>=1&&(n+=" with value '"+t.str+"'"),new I.QueryParseError(n,t.start,t.end)}},I.QueryParser.parsePresence=function(e){var t=e.consumeLexeme();if(null!=t){switch(t.str){case"-":e.currentClause.presence=I.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=I.Query.presence.REQUIRED;break;default:var n="unrecognised presence operator'"+t.str+"'";throw new I.QueryParseError(n,t.start,t.end)}var r=e.peekLexeme();if(null==r){n="expecting term or field, found nothing";throw new I.QueryParseError(n,t.start,t.end)}switch(r.type){case I.QueryLexer.FIELD:return I.QueryParser.parseField;case I.QueryLexer.TERM:return I.QueryParser.parseTerm;default:n="expecting term or field, found '"+r.type+"'";throw new I.QueryParseError(n,r.start,r.end)}}},I.QueryParser.parseField=function(e){var t=e.consumeLexeme();if(null!=t){if(-1==e.query.allFields.indexOf(t.str)){var n=e.query.allFields.map((function(e){return"'"+e+"'"})).join(", "),r="unrecognised field '"+t.str+"', possible fields: "+n;throw new I.QueryParseError(r,t.start,t.end)}e.currentClause.fields=[t.str];var a=e.peekLexeme();if(null==a){r="expecting term, found nothing";throw new I.QueryParseError(r,t.start,t.end)}if(a.type===I.QueryLexer.TERM)return I.QueryParser.parseTerm;r="expecting term, found '"+a.type+"'";throw new I.QueryParseError(r,a.start,a.end)}},I.QueryParser.parseTerm=function(e){var t=e.consumeLexeme();if(null!=t){e.currentClause.term=t.str.toLowerCase(),-1!=t.str.indexOf("*")&&(e.currentClause.usePipeline=!1);var n=e.peekLexeme();if(null!=n)switch(n.type){case I.QueryLexer.TERM:return e.nextClause(),I.QueryParser.parseTerm;case I.QueryLexer.FIELD:return e.nextClause(),I.QueryParser.parseField;case I.QueryLexer.EDIT_DISTANCE:return I.QueryParser.parseEditDistance;case I.QueryLexer.BOOST:return I.QueryParser.parseBoost;case I.QueryLexer.PRESENCE:return e.nextClause(),I.QueryParser.parsePresence;default:var r="Unexpected lexeme type '"+n.type+"'";throw new I.QueryParseError(r,n.start,n.end)}else e.nextClause()}},I.QueryParser.parseEditDistance=function(e){var t=e.consumeLexeme();if(null!=t){var n=parseInt(t.str,10);if(isNaN(n)){var r="edit distance must be numeric";throw new I.QueryParseError(r,t.start,t.end)}e.currentClause.editDistance=n;var a=e.peekLexeme();if(null!=a)switch(a.type){case I.QueryLexer.TERM:return e.nextClause(),I.QueryParser.parseTerm;case I.QueryLexer.FIELD:return e.nextClause(),I.QueryParser.parseField;case I.QueryLexer.EDIT_DISTANCE:return I.QueryParser.parseEditDistance;case I.QueryLexer.BOOST:return I.QueryParser.parseBoost;case I.QueryLexer.PRESENCE:return e.nextClause(),I.QueryParser.parsePresence;default:r="Unexpected lexeme type '"+a.type+"'";throw new I.QueryParseError(r,a.start,a.end)}else e.nextClause()}},I.QueryParser.parseBoost=function(e){var t=e.consumeLexeme();if(null!=t){var n=parseInt(t.str,10);if(isNaN(n)){var r="boost must be numeric";throw new I.QueryParseError(r,t.start,t.end)}e.currentClause.boost=n;var a=e.peekLexeme();if(null!=a)switch(a.type){case I.QueryLexer.TERM:return e.nextClause(),I.QueryParser.parseTerm;case I.QueryLexer.FIELD:return e.nextClause(),I.QueryParser.parseField;case I.QueryLexer.EDIT_DISTANCE:return I.QueryParser.parseEditDistance;case I.QueryLexer.BOOST:return I.QueryParser.parseBoost;case I.QueryLexer.PRESENCE:return e.nextClause(),I.QueryParser.parsePresence;default:r="Unexpected lexeme type '"+a.type+"'";throw new I.QueryParseError(r,a.start,a.end)}else e.nextClause()}},void 0===(a="function"==typeof(r=function(){return I})?r.call(t,n,t,e):r)||(e.exports=a)}()},32497:(e,t,n)=>{"use strict";n.r(t)},52295:(e,t,n)=>{"use strict";n.r(t)},74865:function(e,t,n){var r,a;r=function(){var e,t,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'
'};function a(e,t,n){return en?n:e}function o(e){return 100*(-1+e)}function i(e,t,n){var a;return(a="translate3d"===r.positionUsing?{transform:"translate3d("+o(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+o(e)+"%,0)"}:{"margin-left":o(e)+"%"}).transition="all "+t+"ms "+n,a}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=a(e,r.minimum,1),n.status=1===e?null:e;var o=n.render(!t),u=o.querySelector(r.barSelector),c=r.speed,d=r.easing;return o.offsetWidth,s((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),l(u,i(e,c,d)),1===e?(l(o,{transition:"none",opacity:1}),o.offsetWidth,setTimeout((function(){l(o,{transition:"all "+c+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),c)}),c)):setTimeout(t,c)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*a(Math.random()*t,.1,.95)),t=a(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");c(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var a,i=t.querySelector(r.barSelector),s=e?"-100":o(n.status||0),u=document.querySelector(r.parent);return l(i,{transition:"all 0 linear",transform:"translate3d("+s+"%,0,0)"}),r.showSpinner||(a=t.querySelector(r.spinnerSelector))&&f(a),u!=document.body&&c(u,"nprogress-custom-parent"),u.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 s=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),l=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,a=e.length,o=t.charAt(0).toUpperCase()+t.slice(1);a--;)if((r=e[a]+o)in n)return r;return t}function a(e){return e=n(e),t[e]||(t[e]=r(e))}function o(e,t,n){t=a(t),e.style[t]=n}return function(e,t){var n,r,a=arguments;if(2==a.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&o(e,n,r);else o(e,a[1],a[2])}}();function u(e,t){return("string"==typeof e?e:p(e)).indexOf(" "+t+" ")>=0}function c(e,t){var n=p(e),r=n+t;u(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=p(e);u(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function p(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function f(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(a="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=a)},14779:(e,t,n)=>{var r=n(5826);e.exports=f,e.exports.parse=o,e.exports.compile=function(e,t){return s(o(e,t),t)},e.exports.tokensToFunction=s,e.exports.tokensToRegExp=p;var a=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function o(e,t){for(var n,r=[],o=0,i=0,s="",c=t&&t.delimiter||"/";null!=(n=a.exec(e));){var d=n[0],p=n[1],f=n.index;if(s+=e.slice(i,f),i=f+d.length,p)s+=p[1];else{var m=e[i],g=n[2],h=n[3],b=n[4],y=n[5],v=n[6],w=n[7];s&&(r.push(s),s="");var x=null!=g&&null!=m&&m!==g,k="+"===v||"*"===v,S="?"===v||"*"===v,_=n[2]||c,E=b||y;r.push({name:h||o++,prefix:g||"",delimiter:_,optional:S,repeat:k,partial:x,asterisk:!!w,pattern:E?u(E):w?".*":"[^"+l(_)+"]+?"})}}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(29901),a=n(39642),o=new Set;function i(e){void 0===e?e=Object.keys(r.languages).filter((e=>"meta"!=e)):Array.isArray(e)||(e=[e]);const t=[...o,...Object.keys(Prism.languages)];a(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(16500).resolve(t)],delete Prism.languages[e],n(16500)(t),o.add(e)}))}i.silent=!1,e.exports=i},96854:()=>{!function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,a,o){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(a,(function(e){if("function"==typeof o&&!o(e))return e;for(var a,s=i.length;-1!==n.code.indexOf(a=t(r,s));)++s;return i[s]=e,a})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var a=0,o=Object.keys(n.tokenStack);!function i(s){for(var l=0;l=o.length);l++){var u=s[l];if("string"==typeof u||u.content&&"string"==typeof u.content){var c=o[a],d=n.tokenStack[c],p="string"==typeof u?u:u.content,f=t(r,c),m=p.indexOf(f);if(m>-1){++a;var g=p.substring(0,m),h=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),b=p.substring(m+f.length),y=[];g&&y.push.apply(y,i([g])),y.push(h),b&&y.push.apply(y,i([b])),"string"==typeof u?s.splice.apply(s,[l,1].concat(y)):u.content=y}}else u.content&&i(u.content)}return s}(n.tokens)}}}})}(Prism)},6726:(e,t,n)=>{var r={"./":2885};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=6726},16500:(e,t,n)=>{var r={"./":2885};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=16500},39642: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 s={},l=e[r];if(l){function u(t){if(!(t in e))throw new Error(r+" depends on an unknown component "+t);if(!(t in s))for(var i in a(t,o),s[t]=!0,n[t])s[i]=!0}t(l.require,u),t(l.optional,u),t(l.modify,u)}n[r]=s,o.pop()}}return function(e){var t=n[e];return t||(a(e,r),t=n[e]),t}}function a(e){for(var t in e)return!0;return!1}return function(o,i,s){var l=function(e){var t={};for(var n in e){var r=e[n];for(var a in r)if("meta"!=a){var o=r[a];t[a]="string"==typeof o?{title:o}:o}}return t}(o),u=function(e){var n;return function(r){if(r in e)return r;if(!n)for(var a in n={},e){var o=e[a];t(o&&o.alias,(function(t){if(t in n)throw new Error(t+" cannot be alias for both "+a+" and "+n[t]);if(t in e)throw new Error(t+" cannot be alias of "+a+" because it is a component.");n[t]=a}))}return n[r]||r}}(l);i=i.map(u),s=(s||[]).map(u);var c=n(i),d=n(s);i.forEach((function e(n){var r=l[n];t(r&&r.require,(function(t){t in d||(c[t]=!0,e(t))}))}));for(var p,f=r(l),m=c;a(m);){for(var g in p={},m){var h=l[g];t(h&&h.modify,(function(e){e in d&&(p[e]=!0)}))}for(var b in d)if(!(b in c))for(var y in f(b))if(y in c){p[b]=!0;break}for(var v in m=p)c[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,a){var o=a?a.series:void 0,i=a?a.parallel:e,s={},l={};function u(e){if(e in s)return s[e];l[e]=!0;var a,c=[];for(var d in t(e))d in n&&c.push(d);if(0===c.length)a=r(e);else{var p=i(c.map((function(e){var t=u(e);return delete l[e],t})));o?a=o(p,(function(){return r(e)})):r(e)}return s[e]=a}for(var c in n)u(c);var d=[];for(var p in l)d.push(s[p]);return i(d)}(f,c,t,n)}};return w}}();e.exports=t},92703:(e,t,n)=>{"use strict";var r=n(50414);function a(){}function o(){}o.resetWarningCache=a,e.exports=function(){function e(e,t,n,a,o,i){if(i!==r){var s=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 s.name="Invariant Violation",s}}function t(){return e}e.isRequired=e;var n={array:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:o,resetWarningCache:a};return n.PropTypes=n,n}},45697:(e,t,n)=>{e.exports=n(92703)()},50414:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},64448:(e,t,n)=>{"use strict";var r=n(67294),a=n(63840);function o(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n