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.
From ef11e169013503a13d76ad2e822aa4181e706ff9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 20 Oct 2024 14:22:41 +0000 Subject: [PATCH] deploy: 5c92afb9aa74cfd6c4c118650cfa5998b0158bd5 --- 404.html | 4 ++-- assets/js/275a01bc.477a2979.js | 1 + assets/js/275a01bc.c6b989a7.js | 1 - assets/js/622dee83.93464809.js | 1 + assets/js/622dee83.a95fbcd6.js | 1 - ...3b6ce.48bdce34.js => 6293b6ce.03d2baae.js} | 2 +- .../js/{main.d45b6e26.js => main.4d698acb.js} | 4 ++-- ...CENSE.txt => main.4d698acb.js.LICENSE.txt} | 0 ...n.386b276d.js => runtime~main.6e2ac15c.js} | 2 +- developer-guide/adding-calibration-type.html | 4 ++-- developer-guide/adding-plugins-to-ui.html | 4 ++-- developer-guide/architecture.html | 4 ++-- developer-guide/avoiding-od.html | 4 ++-- developer-guide/chart-to-ui.html | 9 +++++---- developer-guide/data-stores-intro.html | 4 ++-- developer-guide/events.html | 4 ++-- developer-guide/examples-api.html | 4 ++-- developer-guide/filesystem-locations.html | 4 ++-- developer-guide/hat-button.html | 4 ++-- developer-guide/i2c-addresses.html | 4 ++-- developer-guide/important-concepts.html | 4 ++-- developer-guide/intro-automations.html | 4 ++-- developer-guide/intro-background-jobs.html | 4 ++-- developer-guide/intro-plugins.html | 4 ++-- developer-guide/introduction.html | 4 ++-- developer-guide/local-development.html | 4 ++-- developer-guide/local-storage.html | 4 ++-- developer-guide/mqtt.html | 4 ++-- developer-guide/pi-development.html | 4 ++-- developer-guide/pinout.html | 4 ++-- developer-guide/plugin-as-python-package.html | 4 ++-- developer-guide/sqlite3.html | 4 ++-- developer-guide/web-ui-api.html | 4 ++-- developer-guide/web-ui-introduction.html | 4 ++-- developer-guide/writing-automations-1.html | 4 ++-- developer-guide/writing-automations-2.html | 4 ++-- developer-guide/writing-background-jobs.html | 4 ++-- developer-guide/writing-pump-software.html | 4 ++-- developer-guide/writing-scripts.html | 4 ++-- experiments/algae-day-night-cycle.html | 4 ++-- experiments/caffeine-inhibition.html | 4 ++-- ...continuous-cultures-using-turbidostat.html | 4 ++-- experiments/control-testing.html | 4 ++-- .../directed-evolution-salt-tolerance.html | 4 ++-- experiments/introduction.html | 4 ++-- experiments/low-vs-high-conc-media.html | 4 ++-- experiments/salt-stress-on-yeast.html | 4 ++-- experiments/tags.html | 4 ++-- experiments/tags/caffeine.html | 4 ++-- experiments/tags/continuous-culture.html | 4 ++-- experiments/tags/control.html | 4 ++-- experiments/tags/ethanol.html | 4 ++-- experiments/tags/nutrient.html | 4 ++-- experiments/tags/salt.html | 4 ++-- experiments/tags/secondary-education.html | 4 ++-- experiments/tags/seconday-education.html | 4 ++-- experiments/tags/temperature.html | 4 ++-- experiments/tags/turbidostat.html | 4 ++-- experiments/tags/university-education.html | 4 ++-- experiments/tags/yeast.html | 4 ++-- experiments/temp-cycle.html | 4 ++-- experiments/yeast-growth-by-temperature.html | 4 ++-- experiments/yeast-in-ethanol.html | 4 ++-- index.html | 4 ++-- search-index.json | 2 +- search.html | 4 ++-- user-guide/20ml-v11-hardware-setup-intro.html | 4 ++-- user-guide/20ml-v11-optics-assembly.html | 4 ++-- user-guide/20ml-v11-putting-it-together.html | 4 ++-- user-guide/20ml-v11-rpi-hat-assembly.html | 4 ++-- user-guide/20ml-v11-wetware-assembly.html | 4 ++-- user-guide/accessing-raspberry-pi.html | 4 ++-- user-guide/activities.html | 4 ++-- user-guide/addition-hardware-pumps.html | 4 ++-- user-guide/available-plugins.html | 4 ++-- user-guide/calibrate-od600.html | 4 ++-- user-guide/cli.html | 4 ++-- user-guide/common-questions.html | 4 ++-- user-guide/configuration.html | 4 ++-- user-guide/create-cluster.html | 4 ++-- .../create-edit-experiment-profiles.html | 4 ++-- user-guide/dosing-automations.html | 4 ++-- user-guide/error-codes.html | 4 ++-- user-guide/experiment-profiles-schema.html | 4 ++-- user-guide/experiment-profiles.html | 4 ++-- user-guide/export-data.html | 4 ++-- user-guide/export-import-existing-data.html | 4 ++-- user-guide/external-power.html | 4 ++-- user-guide/getting-started.html | 4 ++-- user-guide/hardware-calibrations.html | 4 ++-- user-guide/hardware-connection-assembly.html | 4 ++-- user-guide/hardware-setup-intro.html | 4 ++-- user-guide/internet-sharing.html | 4 ++-- user-guide/intro-python-scripting.html | 4 ++-- user-guide/intro-to-automations.html | 4 ++-- user-guide/introduction.html | 4 ++-- user-guide/led-automations.html | 4 ++-- user-guide/local-access-point.html | 20 ++++++++++--------- user-guide/manual-dosing-leds.html | 4 ++-- user-guide/monitor-experiment.html | 4 ++-- user-guide/networking.html | 11 +++++----- user-guide/ngrok-remote-access.html | 4 ++-- user-guide/od-normal-growth-rate.html | 4 ++-- user-guide/optics-assembly.html | 4 ++-- user-guide/pinch-valves.html | 4 ++-- user-guide/powering-cluster.html | 4 ++-- user-guide/prepare-vial-for-cultures.html | 4 ++-- user-guide/putting-it-together.html | 4 ++-- user-guide/remote-access.html | 4 ++-- user-guide/rpi-hat-assembly.html | 4 ++-- user-guide/running-self-test.html | 4 ++-- user-guide/set-up-an-experiment.html | 4 ++-- user-guide/software-set-up.html | 4 ++-- user-guide/tailscale-remote-access.html | 4 ++-- user-guide/temperature-automations.html | 4 ++-- user-guide/temperature-expansion-kit.html | 4 ++-- user-guide/troubleshooting-hardware.html | 4 ++-- user-guide/troubleshooting-power.html | 4 ++-- user-guide/troubleshooting-stirring.html | 4 ++-- user-guide/troubleshooting-ui.html | 4 ++-- user-guide/updating-software.html | 4 ++-- user-guide/using-community-plugins.html | 4 ++-- user-guide/using-leds.html | 4 ++-- user-guide/using-pumps.html | 4 ++-- user-guide/using-stemma-qt.html | 4 ++-- .../v11-upgrade-building-vial-holder.html | 4 ++-- user-guide/v11-upgrade-hardware-setup.html | 4 ++-- user-guide/v11-upgrade-optics-assembly.html | 4 ++-- .../v11-upgrade-pioreactor-disassembly.html | 4 ++-- .../v11-upgrade-pioreactor-reassembly.html | 4 ++-- user-guide/wetware-assembly.html | 4 ++-- user-guide/write-own-automations.html | 4 ++-- 132 files changed, 269 insertions(+), 265 deletions(-) create mode 100644 assets/js/275a01bc.477a2979.js delete mode 100644 assets/js/275a01bc.c6b989a7.js create mode 100644 assets/js/622dee83.93464809.js delete mode 100644 assets/js/622dee83.a95fbcd6.js rename assets/js/{6293b6ce.48bdce34.js => 6293b6ce.03d2baae.js} (52%) rename assets/js/{main.d45b6e26.js => main.4d698acb.js} (99%) rename assets/js/{main.d45b6e26.js.LICENSE.txt => main.4d698acb.js.LICENSE.txt} (100%) rename assets/js/{runtime~main.386b276d.js => runtime~main.6e2ac15c.js} (98%) diff --git a/404.html b/404.html index 3cd1f8efd..098978188 100644 --- a/404.html +++ b/404.html @@ -16,8 +16,8 @@ - - + +
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.
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 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 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://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, or a Wifi USB device (the router does not need to be connected to the internet - it will still create a wireless 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 (not B+) and Raspberry Pi Zero W (not Zero 2) 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, or via a usb-ethernet gadget), 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.pre,{children:(0,n.jsx)(a.code,{children:"sudo rm /boot/firmware/local_access_point\n"})}),"\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, and any other workers in the cluster will need to be updated."]}),"\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://Your Docusaurus site did not load properly.
\nA very common reason is a wrong site baseUrl configuration.
\nCurrent configured baseUrl = ${e} ${"/"===e?" (default value)":""}
\nWe suggest trying baseUrl =
\n.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;ld.reach&&(d.reach=O);var I=k.prev;if(R&&(I=l(t,I,R),S+=R.length),u(t,I,C),k=l(t,I,new a(p,h?r.tokenize(A,h):A,v,A)),N&&l(t,k,N),C>1){var D={cause:p+","+m,reach:O};i(e,t,n,k.prev,S,D),d&&D.reach>d.reach&&(d.reach=D.reach)}}}}}}function s(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function l(e,t,n){var r=t.next,a={value:n,prev:t,next:r};return t.next=a,r.prev=a,e.length++,a}function u(e,t,n){for(var r=t.next,a=0;a {const o=t.toLowerCase(),i=((e,t)=>{const[n,r]=(0,c.useState)(G(t,e)),a=(0,c.useRef)(),o=(0,c.useRef)();return(0,c.useEffect)((()=>{t===a.current&&e===o.current||(a.current=t,o.current=e,r(G(t,e)))}),[e,t]),n})(o,r),s=(e=>(0,c.useCallback)((t=>{var n=t,{className:r,style:a,line:o}=n,i=E(n,["className","style","line"]);const s=_(S({},i),{className:(0,d.Z)("token-line",r)});return"object"==typeof e&&"plain"in e&&(s.style=e.plain),"object"==typeof a&&(s.style=S(S({},s.style||{}),a)),s}),[e]))(i),l=(e=>{const t=(0,c.useCallback)((({types:t,empty:n})=>{if(null!=e)return 1===t.length&&"plain"===t[0]?null!=n?{display:"inline-block"}:void 0:1===t.length&&null!=n?e[t[0]]:Object.assign(null!=n?{display:"inline-block"}:{},...t.map((t=>e[t])))}),[e]);return(0,c.useCallback)((e=>{var n=e,{token:r,className:a,style:o}=n,i=E(n,["token","className","style"]);const s=_(S({},i),{className:(0,d.Z)("token",...r.types,a),children:r.content,style:t(r)});return null!=o&&(s.style=S(S({},s.style||{}),o)),s}),[t])})(i),u=(({prism:e,code:t,grammar:n,language:r})=>{const a=(0,c.useRef)(e);return(0,c.useMemo)((()=>{if(null==n)return X([t]);const e={code:t,grammar:n,language:r,tokens:[]};return a.current.hooks.run("before-tokenize",e),e.tokens=a.current.tokenize(t,n),a.current.hooks.run("after-tokenize",e),X(e.tokens)}),[t,n,r])})({prism:a,language:o,code:n,grammar:a.languages[o]});return e({tokens:u,className:`prism-code language-${o}`,style:null!=i?i.root:{},getLineProps:s,getTokenProps:l})},ee=e=>(0,c.createElement)(J,_(S({},e),{prism:e.prism||T,theme:e.theme||U,code:e.code,language:e.language}))},788:(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;t Your Docusaurus site did not load properly. A very common reason is a wrong site baseUrl configuration. Current configured baseUrl = ${e} ${"/"===e?" (default value)":""} We suggest trying baseUrl = d.reach&&(d.reach=O);var I=k.prev;if(R&&(I=l(t,I,R),S+=R.length),u(t,I,C),k=l(t,I,new a(p,h?r.tokenize(A,h):A,v,A)),N&&l(t,k,N),C>1){var D={cause:p+","+m,reach:O};i(e,t,n,k.prev,S,D),d&&D.reach>d.reach&&(d.reach=D.reach)}}}}}}function s(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function l(e,t,n){var r=t.next,a={value:n,prev:t,next:r};return t.next=a,r.prev=a,e.length++,a}function u(e,t,n){for(var r=t.next,a=0;a/g,(function(){return n})).replace(/*\/?)?>/.source),e.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,e.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,e.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,e.languages.jsx.tag.inside.comment=t.comment,e.languages.insertBefore("inside","attr-name",{spread:{pattern:o(/.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