diff --git a/api/feature/connections/org.meshtastic.feature.connections.ui.components/-connection-action-button.html b/api/feature/connections/org.meshtastic.feature.connections.ui.components/-connection-action-button.html index a9baeb7ce1..c305650614 100644 --- a/api/feature/connections/org.meshtastic.feature.connections.ui.components/-connection-action-button.html +++ b/api/feature/connections/org.meshtastic.feature.connections.ui.components/-connection-action-button.html @@ -94,7 +94,7 @@

ConnectionActionButton

-
fun ConnectionActionButton(onClick: () -> Unit, icon: ImageVector, text: String, modifier: Modifier = Modifier, style: ConnectionActionButtonStyle = ConnectionActionButtonStyle.Filled, enabled: Boolean = true, iconContentDescription: String? = null)(source)

Shared "icon + label" button used throughout the Connections screen. Centralises M3 sizing conventions (ButtonDefaults.IconSize, ButtonDefaults.IconSpacing, and the variant-appropriate *WithIconContentPadding) so every scan / add / empty-state affordance renders identically.

Parameters

iconContentDescription

accessibility label for the leading icon. Defaults to null because the visible text usually describes the action; override when the icon carries information the text does not.

+
fun ConnectionActionButton(onClick: () -> Unit, icon: ImageVector, text: String, modifier: Modifier = Modifier, style: ConnectionActionButtonStyle = ConnectionActionButtonStyle.Filled, enabled: Boolean = true, iconContentDescription: String? = null)(source)

Shared "icon + label" button used throughout the Connections screen. Centralises M3 sizing conventions (ButtonDefaults.IconSize, ButtonDefaults.IconSpacing, and the variant-appropriate *WithIconContentPadding) so every scan / add / empty-state affordance renders identically.

Parameters

iconContentDescription

accessibility label for the leading icon. Defaults to null because the visible text usually describes the action; override when the icon carries information the text does not.

diff --git a/main/ar-rSA/user/connections.html b/main/ar-rSA/user/connections.html index 418fbbcc9e..110dc11bfb 100644 --- a/main/ar-rSA/user/connections.html +++ b/main/ar-rSA/user/connections.html @@ -1 +1 @@ - Connections | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
🌐 العربية
Meshtastic Docs ↗

🌐 العربية — Community translation View in English

Connections

Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

Bluetooth (BLE)

Bluetooth Low Energy is the default and most common connection method on Android.

Pairing a Device

  1. Ensure your Meshtastic radio is powered on and in pairing mode.
  2. Open the app and navigate to the Connect tab.
  3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
  4. Select your device from the list.
  5. Accept the Bluetooth pairing prompt if shown.

Scanning for Bluetooth devices, with a discovered radio in the list

Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

Transport selector

💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device.

Connection Status

Icon State الوصف
🟢 Connected Active radio link established
🟡 Connecting Handshake in progress
🔴 انقطع الاتصال No active connection
Not configured No device selected

When connecting, a status indicator shows the current connection state:

Connecting status

If no devices are found, the app shows an empty state with instructions:

No devices found

Troubleshooting Bluetooth

  • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
  • Connection drops: Move closer to the radio; check for interference.
  • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

USB Serial

USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

Setup

  1. Connect your radio via USB cable to your device.
  2. The app will prompt for USB permission — tap Allow.
  3. The connection is established automatically.

⚠️ Note: USB connections require OTG support on Android devices.

TCP/IP (Network)

Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

Connecting over the Network

  1. Make sure the radio is on the same local network as your phone/desktop.
  2. On the Connect screen, select Network in the transport selector.
  3. Choose the radio one of two ways:
    • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
    • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
  4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

When to Use TCP

  • Radio is on the same local network
  • Testing with a simulated radio
  • Environments where Bluetooth has interference issues

Reconnection Behavior

The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

To disconnect, tap the disconnect button on the Connect screen:

Disconnect from radio

Desktop Connections

On Desktop (Linux/macOS/Windows), the app supports:

  • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
  • USB Serial — primary wired connection method
  • TCP/IP — for network-connected radios

See Desktop App for platform-specific details and keyboard shortcuts.



+ Connections | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
🌐 العربية
Meshtastic Docs ↗

🌐 العربية — Community translation View in English

Connections

Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

Bluetooth (BLE)

Bluetooth Low Energy is the default and most common connection method on Android.

Pairing a Device

  1. Ensure your Meshtastic radio is powered on and in pairing mode.
  2. Open the app and navigate to the Connect tab.
  3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
  4. Select your device from the list.
  5. Accept the Bluetooth pairing prompt if shown.

Scanning for Bluetooth devices, with a discovered radio in the list

Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

Transport selector

💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range.

The screen names anything on the app’s side that is blocking a scan, with the fix attached:

What you see What it means
A card asking for Nearby devices The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings.
Bluetooth is off The adapter is disabled — the card opens Bluetooth settings.
Bluetooth scanning also needs location services Android 11 and older only: the permission is held but the system location toggle is off.
No card, empty list Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere.

Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered.

Connection Status

Icon State الوصف
🟢 Connected Active radio link established
🟡 Connecting Handshake in progress
🔴 انقطع الاتصال No active connection
Not configured No device selected

When connecting, a status indicator shows the current connection state:

Connecting status

If no devices are found, the app shows an empty state with instructions:

No devices found

Troubleshooting Bluetooth

  • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
  • Connection drops: Move closer to the radio; check for interference.
  • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

USB Serial

USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

Setup

  1. Connect your radio via USB cable to your device.
  2. The app will prompt for USB permission — tap Allow.
  3. The connection is established automatically.

⚠️ Note: USB connections require OTG support on Android devices.

TCP/IP (Network)

Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

Connecting over the Network

  1. Make sure the radio is on the same local network as your phone/desktop.
  2. On the Connect screen, select Network in the transport selector.
  3. Choose the radio one of two ways:
    • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
    • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
  4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

When to Use TCP

  • Radio is on the same local network
  • Testing with a simulated radio
  • Environments where Bluetooth has interference issues

Reconnection Behavior

The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

To disconnect, tap the disconnect button on the Connect screen:

Disconnect from radio

Desktop Connections

On Desktop (Linux/macOS/Windows), the app supports:

  • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
  • USB Serial — primary wired connection method
  • TCP/IP — for network-connected radios

See Desktop App for platform-specific details and keyboard shortcuts.



diff --git a/main/ar-rSA/user/onboarding.html b/main/ar-rSA/user/onboarding.html index bbf108f2ad..7cd0a9ccac 100644 --- a/main/ar-rSA/user/onboarding.html +++ b/main/ar-rSA/user/onboarding.html @@ -1 +1 @@ - Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
🌐 العربية
Meshtastic Docs ↗

🌐 العربية — Community translation View in English

Getting Started

Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

First Launch

When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings.

Welcome Screen

The welcome screen introduces Meshtastic and its core capabilities:

  • Off-grid mesh communication
  • No cellular or internet required
  • End-to-end encrypted messaging

Tap Get Started to proceed through the setup flow.

Welcome screen

Permissions

The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

Bluetooth Permission

Bluetooth is the primary connection method between your phone and Meshtastic radio:

  • Bluetooth scanning — discover nearby Meshtastic radios
  • Bluetooth connect — establish and maintain connections with paired radios

Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

Location Permission

⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice.

Meshtastic also uses your location for:

  • Showing your position on the mesh map
  • Calculating distances to other nodes
  • Sharing your GPS coordinates with other mesh members (if enabled)

Grant “While using the app” or “Always” depending on your preference:

  • While using the app — position updates only when the app is open
  • Always — enables background position updates for always-on mesh presence

If denied, Bluetooth scanning will not function and your node will not report a position.

Notifications Permission

Notifications alert you to:

  • Incoming messages from channels and direct messages
  • New nodes joining the mesh
  • Low battery on a remote node

💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

Critical Alerts Permission

On supported devices, the app may request permission for critical alerts:

  • These are high-priority notifications that can break through Do Not Disturb mode
  • Useful for emergency mesh alerts or urgent messages
  • You can skip this step if you don’t need breakthrough notifications
  • Configure or revoke later in Android notification settings

After Setup

Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use.

What’s Next?

Once connected to a radio, explore:

New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



+ Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
🌐 العربية
Meshtastic Docs ↗

🌐 العربية — Community translation View in English

Getting Started

Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

First Launch

When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app.

Welcome Screen

The welcome screen introduces Meshtastic and its core capabilities:

  • Off-grid mesh communication
  • No cellular or internet required
  • End-to-end encrypted messaging

Tap Get Started to proceed through the setup flow.

Welcome screen

Permissions

The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

Bluetooth Permission

Bluetooth is the primary connection method between your phone and Meshtastic radio:

  • Bluetooth scanning — discover nearby Meshtastic radios
  • Bluetooth connect — establish and maintain connections with paired radios

Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

Location Permission

⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio.

Meshtastic also uses your location for:

  • Showing your position on the mesh map
  • Calculating distances to other nodes
  • Sharing your GPS coordinates with other mesh members (if enabled)

Grant “While using the app” or “Always” depending on your preference:

  • While using the app — position updates only when the app is open
  • Always — enables background position updates for always-on mesh presence

Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind.

Notifications Permission

Notifications alert you to:

  • Incoming messages from channels and direct messages
  • New nodes joining the mesh
  • Low battery on a remote node

💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

Critical Alerts Permission

On supported devices, the app may request permission for critical alerts:

  • These are high-priority notifications that can break through Do Not Disturb mode
  • Useful for emergency mesh alerts or urgent messages
  • You can skip this step if you don’t need breakthrough notifications
  • Configure or revoke later in Android notification settings

Reviewing permissions later

Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time:

State What tapping the row does
Allowed Opens the system page, so you can review or revoke it
Not asked yet Requests it
Denied — tap to allow Explains what the permission is for, then asks again if you agree
Blocked — tap to open system settings Android will no longer show its dialog, so this opens the page where you can turn it back on
Not required on this version of Android Nothing — the permission does not exist on your device

This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead.

After Setup

Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own.

Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing.

What’s Next?

Once connected to a radio, explore:

New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



diff --git a/main/assets/css/just-the-docs-dark.css.map b/main/assets/css/just-the-docs-dark.css.map index 54f491fa21..704b67546e 100644 --- a/main/assets/css/just-the-docs-dark.css.map +++ b/main/assets/css/just-the-docs-dark.css.map @@ -1 +1 @@ -{"version":3,"sourceRoot":"","sources":["../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/vendor/accessible-pygments/github-light.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/vendor/accessible-pygments/github-dark.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/vendor/normalize.scss/normalize.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/base.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/color_schemes/dark.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/support/mixins/_typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/support/mixins/_layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/support/_variables.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/content.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/navigation.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/labels.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/buttons.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/support/mixins/_buttons.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/search.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/tables.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/code.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/utilities/_colors.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/utilities/_layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/utilities/_typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/utilities/_lists.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/utilities/_spacing.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/print.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/skiptomain.scss","just-the-docs-dark.scss"],"names":[],"mappings":";AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA;EAAkB;;;AAClB;EAAgB;EAAiB;AACjC;EAAkB;EAAiB;AACnC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAkB;EAAiB;AACnC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAqB;AACtC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAoB;AACrC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAgB;EAAiB;AACjC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AChFlC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA;EAAkB;;;AAClB;EAAa;EAAqB;;;AAClC;EAAgB;EAAgB;EAAqB;AACrD;EAAkB;EAAiB;AACnC;EAAkB;EAAiB;AACnC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAgB;EAAgB;EAAoB;AACpD;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAiB;EAAgB;EAAqB;AACtD;EAAiB;EAAgB;EAAqB;AACtD;EAAiB;EAAgB;EAAmB;EAAqB;AACzE;EAAkB;EAAgB;EAAqB;AACvD;EAAiB;EAAgB;EAAqB;AACtD;EAAiB;EAAgB;EAAmB;EAAqB;AACzE;EAAiB;EAAgB;EAA4B;AAC7D;EAAiB;EAAgB;EAAqB;AACtD;EAAkB;EAAgB;EAAmB;EAAqB;AAC1E;EAAiB;EAAiB;AAClC;EAAiB;EAAgB;EAAoB;AACrD;EAAiB;EAAgB;EAA4B;AAC7D;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAgB;EAAoB;AACrD;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAA0B;EAAgB;EAA6B;AACvE;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAgB;EAAoB;AACrD;EAAiB;EAAgB;EAAoB;AACrD;EAAiB;EAAgB;EAAoB;AACrD;EAAiB;EAAiB;AAClC;EAAiB;EAAgB;EAAoB;AACrD;EAAiB;EAAgB;EAAoB;AACrD;EAAiB;EAAgB;EAAoB;AACrD;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAgB;EAAoB;AACrD;EAAiB;EAAiB;AAClC;EAAgB;EAAiB;AACjC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAgB;EAAoB;AACrD;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AC1FlC;AAEA;AAAA;AAGA;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAAA;AAKA;EACE;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;EAEE;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;AAAA;EAGE;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;EAEE;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAAA;AAKA;AAAA;AAAA;AAAA;AAAA;EAKE;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;AAEE;EACA;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;AAEE;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;EAIE;;;AAGF;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;EAIE;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;EAIE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;EAEE;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;EAEE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AC1VF;EACE,cCJa;;;ADOf;EACE;;;AAGF;EACE;;AEmBA;EACE;;AClBA;EHHJ;IEyBI;;;;AFnBJ;EACE,aIfiB;EJgBjB;EACA,aIbiB;EJcjB,OIiBY;EJhBZ,kBIYY;EJXZ;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAYE;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;EACA;EACA;EACA,aI1CyB;EJ2CzB,OIjBY;;;AJoBd;EACE;EACA;;;AAGF;EACE,OCzDW;ED0DX;;;AAGF;EACE;EACA,uBInCY;EJoCZ;;AAEA;EACE;;;AAIJ;EACE,aIvEiB;EJwEjB;EACA,aIvEiB;;;AJ0EnB;AAAA;EAEE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA,kBInEY;EJoEZ;;;AAIF;EACE;EAGA;EACA;EACA;EACA;;;AK7GF;EACE;EACA;EACA;EACA,kBD4BY;;ADpBV;EEZJ;IAOI;IACA;IACA,ODwFW;ICvFX;IACA;IACA;;;AFAA;EEZJ;IAgBI;IACA,WD+EQ;;;ADpFR;EEQF;IAEI,aD2ES;;;ADrFX;EEQF;IAQI;;;AAOF;EACE;EACA,kBDLQ;;ADpBV;EEuBA;IAKI;IACA,kBDTM;;;ACYR;EACE;;AFjCJ;EEgCE;IAII;;;;AAOV;EACE;;AF5CE;EE2CJ;IAII;IACA,WDyCY;;;;ACrChB;EACE,aDaK;ECZL,gBDYK;EDvDL,eCuDK;EDtDL,cCsDK;;ADlEH;EEoDJ;IFrCI,eCqDG;IDpDH,cCoDG;;;ADpEH;EEoDJ;IAOI,aDSG;ICRH,gBDQG;;;;ACJP;EACE;EACA;;AFlEE;EEgEJ;IAKI;IACA;IACA,QDmBY;;;;ACfhB;AAAA;AAAA;EAGE;;AF9EE;EE2EJ;AAAA;AAAA;IAMI,ODGQ;;;;ACCZ;EACE;;AAEA;EACE;;AFzFA;EEqFJ;IAQI;IACA,aDxBG;ICyBH,gBD7BG;IC8BH;IACA;;;;AAIJ;EACE;EACA,YDbc;ECcd;;AFxGE;EEqGJ;IAMI,QDjBY;ICkBZ,YDlBY;ICmBZ;;;;AAIJ;EACE;EACA;EACA;EACA;EACA,aDrDK;ECsDL,gBDtDK;ECuDL,ODnGY;EDVZ,eCuDK;EDtDL,cCsDK;;ADlEH;EEiHJ;IFlGI,eCqDG;IDpDH,cCoDG;;;AF/BL;EACE;;ACtCA;EEiHJ;IHvEI;IACA,aEhDuB;;;ADKvB;EEiHJ;IAcI,aD/DG;ICgEH,gBDhEG;;;;AC+EP;EACE;EACA;EACA,SDhFK;ECiFL;;;AFnJE;EEuJF;IACE;;;AAIJ;EACE;;;AAQF;EACE;;;AAOF;EACE;EACA;EACA;EACA,aD/GK;ECgHL,gBDhHK;EDvDL,eCuDK;EDtDL,cCsDK;;ADlEH;EE6KJ;IF9JI,eCqDG;IDpDH,cCoDG;;;AFvEL;EACE;;ACEA;EE6KJ;IH3KI;;;ACFA;EE6KJ;IAYI;IACA;;;;AAIJ;EACE,OD5HK;EC6HL,QD7HK;EC8HL,OJ3MW;;;AKCb;EACE,aFEoB;;AEApB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;;AAGF;EACE;EACA;;AAGF;AAAA;EAEE;;AAIA;EACE,YF+CC;;AE3CL;EACE;EACA;;AAEA;EACE;;AAEA;EACE;EACA;EACA;EACA,OFfM;EEgBN;EACA;;AJ1BN;EACE;;ACRA;EG2BE;IJfF;;;ACZA;EG2BE;IAUI;;;AAIJ;EACE;;AAGE;EACE;EACA;;AAOV;EACE;;AAGE;EACE;EACA;EACA,OF7CM;EE8CN;;AAMJ;EACE;;AAIJ;EACE;EACA;;AAKF;EACE;;AAGF;EACE;;AAGF;EACE;EACA;;AAGF;AAAA;EAEE;;AAGF;EACE;EACA;EACA;;AAEA;EACE;;AAIJ;EACE;EACA;EACA;;AAmBE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;;AASF;AAAA;AAAA;AAAA;AAAA;AAAA;EAEE;;AAKN;EACE;EACA;EACA,OFnFG;EEoFH;EACA,eFzFG;EE0FH,cF1FG;EE2FH;;AH1JA;EGmJF;IAUI;IACA;;;AAGF;EACE;EACA;EACA;EACA,OL/KO;EKgLP;;AAYF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;;AAIJ;EACE;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;EACA;EACA;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAKE;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;;AAIJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAWE,YF9JG;;;AG3EP;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;ALoBF;EACE;;AClBA;EILF;IL2BE;;;ACtBA;EDOF;IACE;;;ACRA;EILF;ILiBE;;;AKPA;EACE;EACA,YH+DC;EG9DD,aHuDC;EGtDD,gBHsDC;EGrDD;EAEE,eH0DD;EGzDC,cHqDD;;ADlEH;EIKA;IAeI,YHgDD;IG/CC;IAEE,eH6CH;IG5CG,cH4CH;;;AGrCD;EACE,OHkCD;EGjCC,QHiCD;EGhCC;;AAGF;EACE;EACA;;AAGF;EAEE;EACA;;AASJ;EACE;EAEE;EAGF,OHUC;EGTD,QHSC;EGRD;EACA,ONzEO;;AEUT;EIsDA;IAYI,OHED;IGDC,QHCD;IGAC;;;AAGF;EACE;;AAQA;EACE;;AAKN;EACE;EACA,cHvBC;EGwBD;;AAEA;EACE;;AAEA;EACE,OH/EI;;AGkFN;EACE,OHnFI;;AGyFR;EAEI;;AAMJ;EACE;;;AAMR;EACE;EACA;EACA;EACA;EACA;;ALhIA;EACE;;ACEA;EIwHJ;ILtHI;;;ACFA;EIwHJ;IASI;IACA,YHhEG;IGiEH;;EAEA;IACE;;;;AAMJ;EACE;;AAEA;EACE;;AAGE;EACE,ON9JG;;AMiKL;EACE,ONlKG;;;AM2Kb;EACE;EACA;;ALtKA;EACE;;ACEA;EIiKJ;IL/JI;;;AKoKF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AJlLA;EIiKJ;IAqBI,eHpHG;;;;ADlEH;EI4LJ;IAEI;;;;AAIJ;EACE;EACA,eHnIK;EGoIL;;;AAGF;EACE;;AL5MA;EACE;;ACEA;EIwMJ;ILtMI;;;AK0MF;EACE;;AAGF;EACE;EACA,cHlJG;EGmJH,aHnJG;EGoJH,OHpMU;EGqMV;;AAIA;EACE;;;ACrON;AAAA;EAEE;;ANoEA;AAAA;EACE;EACA,aElEuB;;ADKvB;EKXJ;AAAA;IN4EI;;;;AA5BF;AAAA;AAAA;EACE;;ACtCA;EKJJ;AAAA;AAAA;IN8CI;IACA,aEhDuB;;;;AFgCzB;AAAA;EACE;;AC5BA;EKEJ;AAAA;IN8BI;;;;AMzBJ;AAAA;EAEE;EACA;EACA;;ANdA;AAAA;EACE;;ACEA;EKOJ;AAAA;INLI;;;;AMcJ;EACE;;;ANVA;AAAA;EACE;;ACRA;EKoBJ;AAAA;INRI;;;;AAfF;AAAA;EACE;;ACEA;EKyBJ;AAAA;INvBI;;;;AALF;EACE;;ACEA;EK8BJ;IN5BI;;;;AMgCJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;ACvDF;AAAA;EAEE;EACA;EACA,cLoEK;EKnEL,aLmEK;EKlEL,OLiBM;EKhBN;EACA;EACA,kBL6BS;EK5BT;;APLA;AAAA;EACE;;ACEA;EMRJ;AAAA;IPUI;;;;AOKJ;EACE,kBL4BU;;;AKzBZ;EACE,kBLcW;;;AKXb;EACE,kBL4BQ;;;AKzBV;EACE,OLFY;EKGZ,kBLkBW;;;AMlDb;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,OTRW;ESSX;EACA;EACA;EACA,kBNiBY;EMhBZ;EACA,eNyEc;EMxEd,YACE;EAEF;;AAEA;EACE;EACA;EACA;;AAGF;EAEE;;AAGF;EAEE;;AAGF;EAIE;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;AAKA;EAEE;EACA;EACA;EACA;EACA;;;AAKN;EACE,OTtEW;ESuEX;EACA;;AAEA;EAIE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA,YACE;;AAIJ;EAEE;;;AAIJ;ECnGE,OP0BM;EOzBN;EACA;EACA,YACE;;AAGF;EAEE,OPiBI;EOhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;ADgFJ;ECvGE,OP0BM;EOzBN;EACA;EACA,YACE;;AAGF;EAEE,OPiBI;EOhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;ADoFJ;EC3GE,OP0BM;EOzBN;EACA;EACA,YACE;;AAGF;EAEE,OPiBI;EOhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;ADwFJ;EC/GE,OP0BM;EOzBN;EACA;EACA,YACE;;AAGF;EAEE,OPiBI;EOhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;AD4FJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AE3HF;EACE;EACA;EACA;EACA,QRgFM;EQ/EN,SRuEK;EQtEL;;ATME;ESZJ;IASI;IACA;IACA;IACA;IACA;;;;AAIJ;EACE;EACA;EACA,QR8DK;EQ7DL;EACA,eRmEc;EQlEd,YACE;EAEF;;ATdE;ESKJ;IAYI;IACA;IACA,WRwEmB;IQvEnB;IACA;IACA;IACA;;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA,ORTY;EQUZ,kBRfY;EQgBZ;EACA;EACA;EACA;EACA;;ATvCE;ES2BJ;IAeI;IACA;IACA,kBRxBU;IQyBV;;;AAGF;EACE;EACA;;AAEA;EACE,OX/DO;;;AWoEb;EACE;EACA;EACA;EACA,cRIK;;ADlEH;ES0DJ;IAOI,cRGG;IQFH;;;AAGF;EACE;EACA;EACA;EACA,ORzDU;;;AQ6Dd;EACE;EACA;EACA;EACA;EACA;EACA;EACA,kBRjEY;EQkEZ,4BRRc;EQSd,2BRTc;EQUd,YACE;;ATxFA;ES6EJ;IAeI;IACA,ORFmB;IQGnB;;;;AAIJ;EACE;EACA,eRrCK;EQsCL;;AVpFA;EACE;;AClBA;ESkGJ;IV5EI;;;ACtBA;EDOF;IACE;;;ACRA;ESkGJ;IVtFI;;;;AUiGJ;EACE;EACA;;;AAGF;EACE;EACA;;AAEA;EAEE,kBX3Ha;;;AW+HjB;EACE;EACA,aR9DK;EQ+DL,gBR/DK;;ADhEH;ES4HJ;IAMI;IACA;IACA,eRpEG;IQqEH;;;;AAIJ;EACE;EACA;EACA;;AAEA;EACE;;AVxIF;EACE;;ACRA;ES8IF;IVlIE;;;ACZA;EDHF;IACE;;;ACEA;ES8IF;IV5IE;;;AUqJF;EACE,ORtFG;EQuFH,QRvFG;EQwFH,cR1FG;EQ2FH,OXrKS;EWsKT;;AAGF;EACE;;;AAIJ;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA,ORrJY;EQsJZ;EACA;;AV5LA;EACE;;ACYA;ESyKJ;IVjLI;;;;AU2LJ;EACE;EACA,aRrHK;EQsHL,gBRtHK;EQuHL,cRrHK;EQsHL,aRxHK;EQyHL,ORjKY;EQkKZ;EACA,aR/GO;EQgHP,mBR1KY;;AFrBZ;EACE;;ACEA;ESmLJ;IVjLI;;;ACFA;ESmLJ;IAaI;IACA;IACA,cRlIG;IQmIH;IACA;;;;AAIJ;EACE,YR1IK;;;AQ6IP;EACE;;;AAGF;EACE;;AV1MA;EACE;;ACRA;ESgNJ;IVpMI;;;;AUyMJ;EACE;EACA,ORrJK;EQsJL,QRtJK;EQuJL;EACA,ORnJK;EQoJL,QRpJK;EQqJL,kBRzMY;EQ0MZ;EACA;EACA,YACE;EAEF;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YACE;;;AAMF;EACE;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE,QRxLI;EQyLJ;;ATjQA;ES+PF;IAKI,ORzKiB;IQ0KjB,YACE;;;AAKN;EACE,kBRzPU;;ADnBV;ES2QF;IAII;;;AT/QF;ESmRF;IAEI;;;AAIJ;EACE;;AAGF;EACE;EACA;EACA;EACA,YACE;;ATlSF;ESwSA;IACE;IACA;IACA;;;AAIJ;EACE,aRxOI;;ADxEJ;ES+SF;IAII;;;;AC9TN;EACE;EACA;EACA;EACA,eT0EK;ESzEL;EACA,eTkFc;ESjFd,YACE;;;AAIJ;EACE;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA,kBTQY;ESPZ;EACA;;AXNA;AAAA;EACE;;ACRA;EUOJ;AAAA;IXKI;;;AWKF;AAAA;EACE;;;AAOE;AAAA;EAEE;;AAGF;EACE,gBTkCD;;;AS3BL;EACE;;;AC9CF;EACE;EACA;EACA,kBbDoB;EaEpB;EACA,eV+EY;;;AU1EhB;EACE,cVcY;;;AUqCd;AAAA;AAAA;EAGE;EACA,eVMK;EULL,kBbjEsB;EakEtB,eVgBc;EUfd;EACA;EACA;EACA;;AAIA;AAAA;AAAA;EACE,OVLG;EUMH;EACA;EACA;EACA;EACA,SVVG;EUWH;EACA;EACA,OVtDU;EUuDV;;AAEA;AAAA;AAAA;EACE,MV1DQ;;AU6DV;AAAA;AAAA;EACE;EACA;EACA;;AAGF;AAAA;AAAA;EACE;EACA;;AAMF;AAAA;AAAA;EACE;EACA;;;AASJ;EACE;EACA,SV/CG;EUgDH;EACA;EACA,eVtCY;;AUyCd;AAAA;EAEE;EACA;EACA;;;AAUJ;EACE;EACA,eVrEK;;AU6CL;EACE;EACA,SV/CG;EUgDH;EACA;EACA,eVtCY;;AUyCd;AAAA;EAEE;EACA;EACA;;;AAwBF;AAAA;EAEE;EACA,SVpFG;EUqFH;EACA;EACA,eV3EY;;;AUmFhB;EACE;EACA;EACA;EACA;;AAEA;AAAA;EAEE;EACA;EACA,kBb/KoB;EagLpB;;AZ9KF;AAAA;EACE;;ACEA;EWsKF;AAAA;IZpKE;;;AY8KF;EACE;EACA,eVjHG;EUkHH,cVlHG;;AUqHL;EACE;EACA;;;AAKJ;AAAA;EAEE,SV9HK;EU+HL,eV/HK;EUgIL;EACA;EACA,eVtHc;;AUwHd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAIE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAKJ;EACE;EACA;EACA;;;AAIF;AAAA;EAEE,YblOsB;EaqOpB,ObpOoB;;;Aa2OxB;EACE,Yb7OsB;;;AcLxB;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;ACvOF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AbrBE;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;AAQR;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AdhHA;EACE;;ACYA;EcZJ;IfII;;;;AAKF;EACE;;ACEA;EcRJ;IfUI;;;;AAKF;EACE;;ACRA;EcJJ;IfgBI;;;;AAKF;EACE;;AClBA;EcAJ;IfsBI;;;;AAKF;EACE;;AC5BA;EcIJ;If4BI;;;;AAKF;EACE;;ACtCA;EcQJ;IfkCI;IACA,aEhDuB;;;;AFqDzB;EACE;EACA,aEvDuB;;ADKvB;EcYJ;If0CI;;;;AAKF;EACE;EACA,aElEuB;;ADKvB;EcgBJ;IfiDI;;;;AAKF;EACE;EACA,aE7EuB;;ADKvB;EcoBJ;IfwDI;;;;AAKF;EACE;EACA,aExFuB;;ADKvB;EcwBJ;If+DI;;;;Ae3DJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE,abxDiB;;;Aa2DnB;EACE,ab1DyB;;;Aa6D3B;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AC/EF;EACE;EACA;EACA;;AAGE;EACE;;;ACLN;EACE;EACA;;;AAQA;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AhBlCA;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAaN;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AhB7GA;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AC3JR;EACE;AAAA;AAAA;AAAA;AAAA;AAAA;IAME;;EAGF;IACE;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;IACA;;;ACvCJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE,OpBXW;EoBYX,kBjBkBY;EiBjBZ;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ACpBF;EACE,kBlByBY;;;AkBtBd;EACI;EACA;EACA,elB4EY;EkB3EZ;EACA;;AAEA;EACI,OlB8BI;EkB7BJ;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OlBoBM;EkBnBN;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,elBiDY;EkBhDZ;EACA;;AACA;EACE;EACA;EACA,OlBEM;EkBDN;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAMJ;EACI;EACA;EACA,elBGY;EkBFZ;EACA;;AAEA;EACI,OlB/CG;EkBgDH;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OlBzDK;EkB0DL;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,elBxBY;EkByBZ;EACA;;AACA;EACE;EACA;EACA,OlB3EK;EkB4EL;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAMJ;EACI;EACA;EACA,elBtEY;EkBuEZ;EACA;;AAEA;EACI,OlBhHK;EkBiHL;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OlB1HO;EkB2HP;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,elBjGY;EkBkGZ;EACA;;AACA;EACE;EACA;EACA,OlB5IO;EkB6IP;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE","sourcesContent":["/*\ngenerated by accessible-pygments \nCopyright (c) 2022, Quansight Labs\nLicensed under the BSD license, see LICENSE for details.\n--\ngenerated by Pygments \nCopyright 2006-2025 by the Pygments team.\nLicensed under the BSD license, see LICENSE for details.\n*/\n\n.highlight .hll { background-color: #0969da4a }\n.highlight .c { color: #6E7781 } /* Comment */\n.highlight .err { color: #CF222E } /* Error */\n.highlight .k { color: #CF222E } /* Keyword */\n.highlight .l { color: #953800 } /* Literal */\n.highlight .n { color: #8250DF } /* Name */\n.highlight .o { color: #116329 } /* Operator */\n.highlight .p { color: #24292F } /* Punctuation */\n.highlight .ch { color: #6E7781 } /* Comment.Hashbang */\n.highlight .cm { color: #6E7781 } /* Comment.Multiline */\n.highlight .cp { color: #6E7781 } /* Comment.Preproc */\n.highlight .cpf { color: #6E7781 } /* Comment.PreprocFile */\n.highlight .c1 { color: #6E7781 } /* Comment.Single */\n.highlight .cs { color: #6E7781 } /* Comment.Special */\n.highlight .gd { color: #0550AE } /* Generic.Deleted */\n.highlight .ge { font-style: italic } /* Generic.Emph */\n.highlight .gr { color: #CF222E } /* Generic.Error */\n.highlight .gh { color: #0550AE } /* Generic.Heading */\n.highlight .gs { font-weight: bold } /* Generic.Strong */\n.highlight .gu { color: #0550AE } /* Generic.Subheading */\n.highlight .kc { color: #0550AE } /* Keyword.Constant */\n.highlight .kd { color: #CF222E } /* Keyword.Declaration */\n.highlight .kn { color: #CF222E } /* Keyword.Namespace */\n.highlight .kp { color: #CF222E } /* Keyword.Pseudo */\n.highlight .kr { color: #CF222E } /* Keyword.Reserved */\n.highlight .kt { color: #CF222E } /* Keyword.Type */\n.highlight .ld { color: #953800 } /* Literal.Date */\n.highlight .m { color: #953800 } /* Literal.Number */\n.highlight .s { color: #0550AE } /* Literal.String */\n.highlight .na { color: #953800 } /* Name.Attribute */\n.highlight .nb { color: #953800 } /* Name.Builtin */\n.highlight .nc { color: #0550AE } /* Name.Class */\n.highlight .no { color: #0550AE } /* Name.Constant */\n.highlight .nd { color: #953800 } /* Name.Decorator */\n.highlight .ni { color: #116329 } /* Name.Entity */\n.highlight .ne { color: #8250DF } /* Name.Exception */\n.highlight .nf { color: #0550AE } /* Name.Function */\n.highlight .nl { color: #953800 } /* Name.Label */\n.highlight .nn { color: #24292F } /* Name.Namespace */\n.highlight .nx { color: #8250DF } /* Name.Other */\n.highlight .py { color: #0550AE } /* Name.Property */\n.highlight .nt { color: #116329 } /* Name.Tag */\n.highlight .nv { color: #953800 } /* Name.Variable */\n.highlight .ow { color: #8250DF } /* Operator.Word */\n.highlight .pm { color: #24292F } /* Punctuation.Marker */\n.highlight .w { color: #24292F } /* Text.Whitespace */\n.highlight .mb { color: #953800 } /* Literal.Number.Bin */\n.highlight .mf { color: #953800 } /* Literal.Number.Float */\n.highlight .mh { color: #953800 } /* Literal.Number.Hex */\n.highlight .mi { color: #953800 } /* Literal.Number.Integer */\n.highlight .mo { color: #953800 } /* Literal.Number.Oct */\n.highlight .sa { color: #0550AE } /* Literal.String.Affix */\n.highlight .sb { color: #0550AE } /* Literal.String.Backtick */\n.highlight .sc { color: #0550AE } /* Literal.String.Char */\n.highlight .dl { color: #0550AE } /* Literal.String.Delimiter */\n.highlight .sd { color: #0550AE } /* Literal.String.Doc */\n.highlight .s2 { color: #0550AE } /* Literal.String.Double */\n.highlight .se { color: #0550AE } /* Literal.String.Escape */\n.highlight .sh { color: #0550AE } /* Literal.String.Heredoc */\n.highlight .si { color: #0550AE } /* Literal.String.Interpol */\n.highlight .sx { color: #0550AE } /* Literal.String.Other */\n.highlight .sr { color: #0550AE } /* Literal.String.Regex */\n.highlight .s1 { color: #0550AE } /* Literal.String.Single */\n.highlight .ss { color: #0550AE } /* Literal.String.Symbol */\n.highlight .bp { color: #953800 } /* Name.Builtin.Pseudo */\n.highlight .fm { color: #0550AE } /* Name.Function.Magic */\n.highlight .vc { color: #953800 } /* Name.Variable.Class */\n.highlight .vg { color: #953800 } /* Name.Variable.Global */\n.highlight .vi { color: #953800 } /* Name.Variable.Instance */\n.highlight .vm { color: #953800 } /* Name.Variable.Magic */\n.highlight .il { color: #953800 } /* Literal.Number.Integer.Long */\n","/*\ngenerated by accessible-pygments \nCopyright (c) 2022, Quansight Labs\nLicensed under the BSD license, see LICENSE for details.\n--\ngenerated by Pygments \nCopyright 2006-2025 by the Pygments team.\nLicensed under the BSD license, see LICENSE for details.\n*/\n\n.highlight .hll { background-color: #6e7681 }\n.highlight { background: #0d1117; color: #E6EDF3 }\n.highlight .c { color: #8B949E; font-style: italic } /* Comment */\n.highlight .err { color: #F85149 } /* Error */\n.highlight .esc { color: #E6EDF3 } /* Escape */\n.highlight .g { color: #E6EDF3 } /* Generic */\n.highlight .k { color: #FF7B72 } /* Keyword */\n.highlight .l { color: #A5D6FF } /* Literal */\n.highlight .n { color: #E6EDF3 } /* Name */\n.highlight .o { color: #FF7B72; font-weight: bold } /* Operator */\n.highlight .x { color: #E6EDF3 } /* Other */\n.highlight .p { color: #E6EDF3 } /* Punctuation */\n.highlight .ch { color: #8B949E; font-style: italic } /* Comment.Hashbang */\n.highlight .cm { color: #8B949E; font-style: italic } /* Comment.Multiline */\n.highlight .cp { color: #8B949E; font-weight: bold; font-style: italic } /* Comment.Preproc */\n.highlight .cpf { color: #8B949E; font-style: italic } /* Comment.PreprocFile */\n.highlight .c1 { color: #8B949E; font-style: italic } /* Comment.Single */\n.highlight .cs { color: #8B949E; font-weight: bold; font-style: italic } /* Comment.Special */\n.highlight .gd { color: #FFA198; background-color: #490202 } /* Generic.Deleted */\n.highlight .ge { color: #E6EDF3; font-style: italic } /* Generic.Emph */\n.highlight .ges { color: #E6EDF3; font-weight: bold; font-style: italic } /* Generic.EmphStrong */\n.highlight .gr { color: #FFA198 } /* Generic.Error */\n.highlight .gh { color: #79C0FF; font-weight: bold } /* Generic.Heading */\n.highlight .gi { color: #56D364; background-color: #0F5323 } /* Generic.Inserted */\n.highlight .go { color: #8B949E } /* Generic.Output */\n.highlight .gp { color: #8B949E } /* Generic.Prompt */\n.highlight .gs { color: #E6EDF3; font-weight: bold } /* Generic.Strong */\n.highlight .gu { color: #79C0FF } /* Generic.Subheading */\n.highlight .gt { color: #FF7B72 } /* Generic.Traceback */\n.highlight .g-Underline { color: #E6EDF3; text-decoration: underline } /* Generic.Underline */\n.highlight .kc { color: #79C0FF } /* Keyword.Constant */\n.highlight .kd { color: #FF7B72 } /* Keyword.Declaration */\n.highlight .kn { color: #FF7B72 } /* Keyword.Namespace */\n.highlight .kp { color: #79C0FF } /* Keyword.Pseudo */\n.highlight .kr { color: #FF7B72 } /* Keyword.Reserved */\n.highlight .kt { color: #FF7B72 } /* Keyword.Type */\n.highlight .ld { color: #79C0FF } /* Literal.Date */\n.highlight .m { color: #A5D6FF } /* Literal.Number */\n.highlight .s { color: #A5D6FF } /* Literal.String */\n.highlight .na { color: #E6EDF3 } /* Name.Attribute */\n.highlight .nb { color: #E6EDF3 } /* Name.Builtin */\n.highlight .nc { color: #F0883E; font-weight: bold } /* Name.Class */\n.highlight .no { color: #79C0FF; font-weight: bold } /* Name.Constant */\n.highlight .nd { color: #D2A8FF; font-weight: bold } /* Name.Decorator */\n.highlight .ni { color: #FFA657 } /* Name.Entity */\n.highlight .ne { color: #F0883E; font-weight: bold } /* Name.Exception */\n.highlight .nf { color: #D2A8FF; font-weight: bold } /* Name.Function */\n.highlight .nl { color: #79C0FF; font-weight: bold } /* Name.Label */\n.highlight .nn { color: #FF7B72 } /* Name.Namespace */\n.highlight .nx { color: #E6EDF3 } /* Name.Other */\n.highlight .py { color: #79C0FF } /* Name.Property */\n.highlight .nt { color: #7EE787 } /* Name.Tag */\n.highlight .nv { color: #79C0FF } /* Name.Variable */\n.highlight .ow { color: #FF7B72; font-weight: bold } /* Operator.Word */\n.highlight .pm { color: #E6EDF3 } /* Punctuation.Marker */\n.highlight .w { color: #6E7681 } /* Text.Whitespace */\n.highlight .mb { color: #A5D6FF } /* Literal.Number.Bin */\n.highlight .mf { color: #A5D6FF } /* Literal.Number.Float */\n.highlight .mh { color: #A5D6FF } /* Literal.Number.Hex */\n.highlight .mi { color: #A5D6FF } /* Literal.Number.Integer */\n.highlight .mo { color: #A5D6FF } /* Literal.Number.Oct */\n.highlight .sa { color: #79C0FF } /* Literal.String.Affix */\n.highlight .sb { color: #A5D6FF } /* Literal.String.Backtick */\n.highlight .sc { color: #A5D6FF } /* Literal.String.Char */\n.highlight .dl { color: #79C0FF } /* Literal.String.Delimiter */\n.highlight .sd { color: #A5D6FF } /* Literal.String.Doc */\n.highlight .s2 { color: #A5D6FF } /* Literal.String.Double */\n.highlight .se { color: #79C0FF } /* Literal.String.Escape */\n.highlight .sh { color: #79C0FF } /* Literal.String.Heredoc */\n.highlight .si { color: #A5D6FF } /* Literal.String.Interpol */\n.highlight .sx { color: #A5D6FF } /* Literal.String.Other */\n.highlight .sr { color: #79C0FF } /* Literal.String.Regex */\n.highlight .s1 { color: #A5D6FF } /* Literal.String.Single */\n.highlight .ss { color: #A5D6FF } /* Literal.String.Symbol */\n.highlight .bp { color: #E6EDF3 } /* Name.Builtin.Pseudo */\n.highlight .fm { color: #D2A8FF; font-weight: bold } /* Name.Function.Magic */\n.highlight .vc { color: #79C0FF } /* Name.Variable.Class */\n.highlight .vg { color: #79C0FF } /* Name.Variable.Global */\n.highlight .vi { color: #79C0FF } /* Name.Variable.Instance */\n.highlight .vm { color: #79C0FF } /* Name.Variable.Magic */\n.highlight .il { color: #A5D6FF } /* Literal.Number.Integer.Long */\n","/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */\n\n/* Document\n ========================================================================== */\n\n/**\n * 1. Correct the line height in all browsers.\n * 2. Prevent adjustments of font size after orientation changes in iOS.\n */\n\nhtml {\n line-height: 1.15; /* 1 */\n text-size-adjust: 100%; /* 2 */\n}\n\n/* Sections\n ========================================================================== */\n\n/**\n * Remove the margin in all browsers.\n */\n\nbody {\n margin: 0;\n}\n\n/**\n * Render the `main` element consistently in IE.\n */\n\nmain {\n display: block;\n}\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n/* Grouping content\n ========================================================================== */\n\n/**\n * 1. Add the correct box sizing in Firefox.\n * 2. Show the overflow in Edge and IE.\n */\n\nhr {\n box-sizing: content-box; /* 1 */\n height: 0; /* 1 */\n overflow: visible; /* 2 */\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\npre {\n font-family: monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/* Text-level semantics\n ========================================================================== */\n\n/**\n * Remove the gray background on active links in IE 10.\n */\n\na {\n background-color: transparent;\n}\n\n/**\n * 1. Remove the bottom border in Chrome 57-\n * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n */\n\nabbr[title] {\n border-bottom: none; /* 1 */\n text-decoration: underline; /* 2 */\n text-decoration: underline dotted; /* 2 */\n}\n\n/**\n * Add the correct font weight in Chrome, Edge, and Safari.\n */\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\ncode,\nkbd,\nsamp {\n font-family: monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/**\n * Add the correct font size in all browsers.\n */\n\nsmall {\n font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` elements from affecting the line height in\n * all browsers.\n */\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/* Embedded content\n ========================================================================== */\n\n/**\n * Remove the border on images inside links in IE 10.\n */\n\nimg {\n border-style: none;\n}\n\n/* Forms\n ========================================================================== */\n\n/**\n * 1. Change the font styles in all browsers.\n * 2. Remove the margin in Firefox and Safari.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-size: 100%; /* 1 */\n line-height: 1.15; /* 1 */\n margin: 0; /* 2 */\n}\n\n/**\n * Show the overflow in IE.\n * 1. Show the overflow in Edge.\n */\n\nbutton,\ninput {\n /* 1 */\n overflow: visible;\n}\n\n/**\n * Remove the inheritance of text transform in Edge, Firefox, and IE.\n * 1. Remove the inheritance of text transform in Firefox.\n */\n\nbutton,\nselect {\n /* 1 */\n text-transform: none;\n}\n\n/**\n * Correct the inability to style clickable types in iOS and Safari.\n */\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n appearance: button;\n}\n\n/**\n * Remove the inner border and padding in Firefox.\n */\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n border-style: none;\n padding: 0;\n}\n\n/**\n * Restore the focus styles unset by the previous rule.\n */\n\nbutton:-moz-focusring,\n[type=\"button\"]:-moz-focusring,\n[type=\"reset\"]:-moz-focusring,\n[type=\"submit\"]:-moz-focusring {\n outline: 1px dotted ButtonText;\n}\n\n/**\n * Correct the padding in Firefox.\n */\n\nfieldset {\n padding: 0.35em 0.75em 0.625em;\n}\n\n/**\n * 1. Correct the text wrapping in Edge and IE.\n * 2. Correct the color inheritance from `fieldset` elements in IE.\n * 3. Remove the padding so developers are not caught out when they zero out\n * `fieldset` elements in all browsers.\n */\n\nlegend {\n box-sizing: border-box; /* 1 */\n color: inherit; /* 2 */\n display: table; /* 1 */\n max-width: 100%; /* 1 */\n padding: 0; /* 3 */\n white-space: normal; /* 1 */\n}\n\n/**\n * Add the correct vertical alignment in Chrome, Firefox, and Opera.\n */\n\nprogress {\n vertical-align: baseline;\n}\n\n/**\n * Remove the default vertical scrollbar in IE 10+.\n */\n\ntextarea {\n overflow: auto;\n}\n\n/**\n * 1. Add the correct box sizing in IE 10.\n * 2. Remove the padding in IE 10.\n */\n\n[type=\"checkbox\"],\n[type=\"radio\"] {\n box-sizing: border-box; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Correct the cursor style of increment and decrement buttons in Chrome.\n */\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n/**\n * 1. Correct the odd appearance in Chrome and Safari.\n * 2. Correct the outline style in Safari.\n */\n\n[type=\"search\"] {\n appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/**\n * Remove the inner padding in Chrome and Safari on macOS.\n */\n\n[type=\"search\"]::-webkit-search-decoration {\n appearance: none;\n}\n\n/**\n * 1. Correct the inability to style clickable types in iOS and Safari.\n * 2. Change font properties to `inherit` in Safari.\n */\n\n::-webkit-file-upload-button {\n appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/* Interactive\n ========================================================================== */\n\n/*\n * Add the correct display in Edge, IE 10+, and Firefox.\n */\n\ndetails {\n display: block;\n}\n\n/*\n * Add the correct display in all browsers.\n */\n\nsummary {\n display: list-item;\n}\n\n/* Misc\n ========================================================================== */\n\n/**\n * Add the correct display in IE 10+.\n */\n\ntemplate {\n display: none;\n}\n\n/**\n * Add the correct display in IE 10.\n */\n\n[hidden] {\n display: none;\n}\n","// Base element style overrides\n// stylelint-disable selector-no-type, selector-max-type, selector-max-specificity, selector-max-id\n\n:root {\n color-scheme: $color-scheme;\n}\n\n* {\n box-sizing: border-box;\n}\n\nhtml {\n scroll-behavior: smooth;\n\n @include fs-4;\n}\n\nbody {\n font-family: $body-font-family;\n font-size: inherit;\n line-height: $body-line-height;\n color: $body-text-color;\n background-color: $body-background-color;\n overflow-wrap: break-word;\n}\n\nol,\nul,\ndl,\npre,\naddress,\nblockquote,\ntable,\ndiv,\nhr,\nform,\nfieldset,\nnoscript .table-wrapper {\n margin-top: 0;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n#toctitle {\n margin-top: 0;\n margin-bottom: 1em;\n font-weight: 500;\n line-height: $body-heading-line-height;\n color: $body-heading-color;\n}\n\np {\n margin-top: 1em;\n margin-bottom: 1em;\n}\n\na {\n color: $link-color;\n text-decoration: none;\n}\n\na:not([class]) {\n text-decoration: underline;\n text-decoration-color: $border-color;\n text-underline-offset: 2px;\n\n &:hover {\n text-decoration-color: rgba($link-color, 0.45);\n }\n}\n\ncode {\n font-family: $mono-font-family;\n font-size: 0.75em;\n line-height: $body-line-height;\n}\n\nfigure,\npre {\n margin: 0;\n}\n\nli {\n margin: 0.25em 0;\n}\n\nimg {\n max-width: 100%;\n height: auto;\n}\n\nhr {\n height: 1px;\n padding: 0;\n margin: $sp-6 0;\n background-color: $border-color;\n border: 0;\n}\n\n// adds a GitHub-style sidebar to blockquotes\nblockquote {\n margin: 10px 0;\n\n // resets user-agent stylesheets for blockquotes\n margin-block-start: 0;\n margin-inline-start: 0;\n padding-left: 1rem;\n border-left: 3px solid $border-color;\n}\n","$color-scheme: dark;\n$body-background-color: $grey-dk-300;\n$body-heading-color: $grey-lt-000;\n$body-text-color: $grey-lt-300;\n$link-color: lighten($blue-000, 10%);\n$nav-child-link-color: $grey-dk-000;\n$sidebar-color: $grey-dk-300;\n$base-button-color: $grey-dk-250;\n$btn-primary-color: $blue-200;\n$code-background-color: #0d1117; // github-dark bg color\n$code-linenumber-color: #e6edf3; // github-dark line number color\n$feedback-color: darken($sidebar-color, 3%);\n$table-background-color: $grey-dk-250;\n$search-background-color: $grey-dk-250;\n$search-result-preview-color: $grey-lt-300;\n$border-color: $grey-dk-200;\n\n@import \"./vendor/accessible-pygments/github-dark\";\n","@mixin fs-1 {\n & {\n font-size: $font-size-1 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-1-sm !important;\n }\n}\n\n@mixin fs-2 {\n & {\n font-size: $font-size-2 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-3 !important;\n }\n}\n\n@mixin fs-3 {\n & {\n font-size: $font-size-3 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-4 !important;\n }\n}\n\n@mixin fs-4 {\n & {\n font-size: $font-size-4 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-5 !important;\n }\n}\n\n@mixin fs-5 {\n & {\n font-size: $font-size-5 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-6 !important;\n }\n}\n\n@mixin fs-6 {\n & {\n font-size: $font-size-6 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-7 !important;\n line-height: $body-heading-line-height;\n }\n}\n\n@mixin fs-7 {\n & {\n font-size: $font-size-7 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-8 !important;\n }\n}\n\n@mixin fs-8 {\n & {\n font-size: $font-size-8 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-9 !important;\n }\n}\n\n@mixin fs-9 {\n & {\n font-size: $font-size-9 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-10 !important;\n }\n}\n\n@mixin fs-10 {\n & {\n font-size: $font-size-10 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-10-sm !important;\n }\n}\n","// Media query\n\n// Media query mixin\n// Usage:\n// @include mq(md) {\n// ..medium and up styles\n// }\n@mixin mq($name) {\n // Retrieves the value from the key\n $value: map-get($media-queries, $name);\n\n // If the key exists in the map\n @if $value {\n // Prints a media query based on the value\n @media (min-width: $value) {\n @content;\n }\n } @else {\n @warn \"No value could be retrieved from `#{$media-query}`. Please make sure it is defined in `$media-queries` map.\";\n }\n}\n\n// Responsive container\n\n@mixin container {\n padding-right: $gutter-spacing-sm;\n padding-left: $gutter-spacing-sm;\n\n @include mq(md) {\n padding-right: $gutter-spacing;\n padding-left: $gutter-spacing;\n }\n}\n","// Typography\n\n// prettier-ignore\n$body-font-family: system-ui, -apple-system, blinkmacsystemfont, \"Segoe UI\",\n roboto, \"Helvetica Neue\", arial, sans-serif, \"Segoe UI Emoji\" !default;\n$mono-font-family: \"SFMono-Regular\", menlo, consolas, monospace !default;\n$root-font-size: 16px !default; // DEPRECATED: previously base font-size for rems\n$body-line-height: 1.4 !default;\n$content-line-height: 1.6 !default;\n$body-heading-line-height: 1.25 !default;\n\n// Font size\n// `-sm` suffix is the size at the small (and above) media query\n\n$font-size-1: 0.5625rem !default;\n$font-size-1-sm: 0.625rem !default;\n$font-size-2: 0.6875rem !default; // h4 - uppercased!, h6 not uppercased, text-small\n$font-size-3: 0.75rem !default; // h5\n$font-size-4: 0.875rem !default;\n$font-size-5: 1rem !default; // h3\n$font-size-6: 1.125rem !default; // h2\n$font-size-7: 1.5rem !default;\n$font-size-8: 2rem !default; // h1\n$font-size-9: 2.25rem !default;\n$font-size-10: 2.625rem !default;\n$font-size-10-sm: 3rem !default;\n\n// Colors\n\n$white: #fff !default;\n$grey-dk-000: #959396 !default;\n$grey-dk-100: #5c5962 !default;\n$grey-dk-200: #44434d !default;\n$grey-dk-250: #302d36 !default;\n$grey-dk-300: #27262b !default;\n$grey-lt-000: #f5f6fa !default;\n$grey-lt-100: #eeebee !default;\n$grey-lt-200: #ecebed !default;\n$grey-lt-300: #e6e1e8 !default;\n$purple-000: #7253ed !default;\n$purple-100: #5e41d0 !default;\n$purple-200: #4e26af !default;\n$purple-300: #381885 !default;\n$blue-000: #2c84fa !default;\n$blue-100: #2869e6 !default;\n$blue-200: #264caf !default;\n$blue-300: #183385 !default;\n$green-000: #41d693 !default;\n$green-100: #11b584 !default;\n$green-200: #009c7b !default;\n$green-300: #026e57 !default;\n$yellow-000: #ffeb82 !default;\n$yellow-100: #fadf50 !default;\n$yellow-200: #f7d12e !default;\n$yellow-300: #e7af06 !default;\n$red-000: #f77e7e !default;\n$red-100: #f96e65 !default;\n$red-200: #e94c4c !default;\n$red-300: #dd2e2e !default;\n\n// Spacing\n\n$spacing-unit: 1rem; // 1rem == 16px\n\n$spacers: (\n sp-0: 0,\n sp-1: $spacing-unit * 0.25,\n sp-2: $spacing-unit * 0.5,\n sp-3: $spacing-unit * 0.75,\n sp-4: $spacing-unit,\n sp-5: $spacing-unit * 1.5,\n sp-6: $spacing-unit * 2,\n sp-7: $spacing-unit * 2.5,\n sp-8: $spacing-unit * 3,\n sp-9: $spacing-unit * 3.5,\n sp-10: $spacing-unit * 4,\n) !default;\n$sp-1: map-get($spacers, sp-1) !default; // 0.25 rem == 4px\n$sp-2: map-get($spacers, sp-2) !default; // 0.5 rem == 8px\n$sp-3: map-get($spacers, sp-3) !default; // 0.75 rem == 12px\n$sp-4: map-get($spacers, sp-4) !default; // 1 rem == 16px\n$sp-5: map-get($spacers, sp-5) !default; // 1.5 rem == 24px\n$sp-6: map-get($spacers, sp-6) !default; // 2 rem == 32px\n$sp-7: map-get($spacers, sp-7) !default; // 2.5 rem == 40px\n$sp-8: map-get($spacers, sp-8) !default; // 3 rem == 48px\n$sp-9: map-get($spacers, sp-9) !default; // 3.5 rem == 56px\n$sp-10: map-get($spacers, sp-10) !default; // 4 rem == 64px\n\n// Borders\n\n$border: 1px solid !default;\n$border-radius: 4px !default;\n$border-color: $grey-lt-100 !default;\n\n// Grid system\n\n$gutter-spacing: $sp-6 !default;\n$gutter-spacing-sm: $sp-4 !default;\n$nav-width: 16.5rem !default;\n$nav-width-md: 15.5rem !default;\n$nav-list-item-height: $sp-6 !default;\n$nav-list-item-height-sm: $sp-8 !default;\n$nav-list-expander-right: true;\n$content-width: 50rem !default;\n$header-height: 3.75rem !default;\n$search-results-width: $content-width - $nav-width !default;\n$transition-duration: 400ms;\n\n// Media queries in pixels\n\n$media-queries: (\n xs: 20rem,\n sm: 31.25rem,\n md: $content-width,\n lg: $content-width + $nav-width,\n xl: 87.5rem,\n) !default;\n","// The basic two column layout\n\n.side-bar {\n z-index: 0;\n display: flex;\n flex-wrap: wrap;\n background-color: $sidebar-color;\n\n @include mq(md) {\n flex-flow: column nowrap;\n position: fixed;\n width: $nav-width-md;\n height: 100%;\n border-right: $border $border-color;\n align-items: flex-end;\n }\n\n @include mq(lg) {\n width: calc((100% - #{$nav-width + $content-width}) / 2 + #{$nav-width});\n min-width: $nav-width;\n }\n\n & + .main {\n @include mq(md) {\n margin-left: $nav-width-md;\n }\n\n @include mq(lg) {\n // stylelint-disable function-name-case\n // disable for Max(), we want to use the CSS max() function\n margin-left: Max(\n #{$nav-width},\n calc((100% - #{$nav-width + $content-width}) / 2 + #{$nav-width})\n );\n // stylelint-enable function-name-case\n }\n\n .main-header {\n display: none;\n background-color: $sidebar-color;\n\n @include mq(md) {\n display: flex;\n background-color: $body-background-color;\n }\n\n &.nav-open {\n display: block;\n\n @include mq(md) {\n display: flex;\n }\n }\n }\n }\n}\n\n.main {\n margin: auto;\n\n @include mq(md) {\n position: relative;\n max-width: $content-width;\n }\n}\n\n.main-content-wrap {\n padding-top: $gutter-spacing-sm;\n padding-bottom: $gutter-spacing-sm;\n\n @include container;\n\n @include mq(md) {\n padding-top: $gutter-spacing;\n padding-bottom: $gutter-spacing;\n }\n}\n\n.main-header {\n z-index: 0;\n border-bottom: $border $border-color;\n\n @include mq(md) {\n display: flex;\n justify-content: space-between;\n height: $header-height;\n }\n}\n\n.site-nav,\n.site-header,\n.site-footer {\n width: 100%;\n\n @include mq(lg) {\n width: $nav-width;\n }\n}\n\n.site-nav {\n display: none;\n\n &.nav-open {\n display: block;\n }\n\n @include mq(md) {\n display: block;\n padding-top: $sp-8;\n padding-bottom: $gutter-spacing-sm;\n overflow-y: auto;\n flex: 1 1 auto;\n }\n}\n\n.site-header {\n display: flex;\n min-height: $header-height;\n align-items: center;\n\n @include mq(md) {\n height: $header-height;\n max-height: $header-height;\n border-bottom: $border $border-color;\n }\n}\n\n.site-title {\n flex-grow: 1;\n display: flex;\n height: 100%;\n align-items: center;\n padding-top: $sp-3;\n padding-bottom: $sp-3;\n color: $body-heading-color;\n\n @include container;\n\n @include fs-6;\n\n @include mq(md) {\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n }\n}\n\n@if variable-exists(logo) {\n .site-logo {\n width: 100%;\n height: 100%;\n background-image: url($logo);\n background-repeat: no-repeat;\n background-position: left center;\n background-size: contain;\n }\n}\n\n.site-button {\n display: flex;\n height: 100%;\n padding: $gutter-spacing-sm;\n align-items: center;\n}\n\n@include mq(md) {\n .site-header .site-button {\n display: none;\n }\n}\n\n.site-title:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 80%,\n rgba($feedback-color, 0) 100%\n );\n}\n\n.site-button:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 100%\n );\n}\n\n.site-footer {\n position: absolute;\n bottom: 0;\n left: 0;\n padding-top: $sp-4;\n padding-bottom: $sp-4;\n\n @include container;\n\n @include fs-2;\n\n @include mq(md) {\n position: static;\n justify-self: end;\n }\n}\n\n.icon {\n width: $sp-5;\n height: $sp-5;\n color: $link-color;\n}\n","@charset \"UTF-8\";\n\n// Styles for rendered markdown in the .main-content container\n// stylelint-disable selector-no-type, max-nesting-depth, selector-max-compound-selectors, selector-max-type, selector-max-specificity, selector-max-id\n\n.main-content {\n line-height: $content-line-height;\n\n ol,\n ul,\n dl,\n pre,\n address,\n blockquote,\n .table-wrapper {\n margin-top: 0.5em;\n }\n\n a {\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n ul,\n ol {\n padding-left: 1.5em;\n }\n\n li {\n .highlight {\n margin-top: $sp-1;\n }\n }\n\n ol {\n list-style-type: none;\n counter-reset: step-counter;\n\n > li {\n position: relative;\n\n &::before {\n position: absolute;\n top: 0.2em;\n left: -1.6em;\n color: $grey-dk-000;\n content: counter(step-counter);\n counter-increment: step-counter;\n @include fs-3;\n\n @include mq(sm) {\n top: 0.11em;\n }\n }\n\n ol {\n counter-reset: sub-counter;\n\n > li {\n &::before {\n content: counter(sub-counter, lower-alpha);\n counter-increment: sub-counter;\n }\n }\n }\n }\n }\n\n ul {\n list-style: none;\n\n > li {\n &::before {\n position: absolute;\n margin-left: -1.4em;\n color: $grey-dk-000;\n content: \"•\";\n }\n }\n }\n\n .task-list-item {\n &::before {\n content: \"\";\n }\n }\n\n .task-list-item-checkbox {\n margin-right: 0.6em;\n margin-left: -1.4em;\n\n // The same margin-left is used above for ul > li::before\n }\n\n hr + * {\n margin-top: 0;\n }\n\n h1:first-of-type {\n margin-top: 0.5em;\n }\n\n dl {\n display: grid;\n grid-template: auto / 10em 1fr;\n }\n\n dt,\n dd {\n margin: 0.25em 0;\n }\n\n dt {\n grid-column: 1;\n font-weight: 500;\n text-align: right;\n\n &::after {\n content: \":\";\n }\n }\n\n dd {\n grid-column: 2;\n margin-bottom: 0;\n margin-left: 1em;\n\n blockquote,\n div,\n dl,\n dt,\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n li,\n ol,\n p,\n pre,\n table,\n ul,\n .table-wrapper {\n &:first-child {\n margin-top: 0;\n }\n }\n }\n\n dd,\n ol,\n ul {\n dl:first-child {\n dt:first-child,\n dd:nth-child(2) {\n margin-top: 0;\n }\n }\n }\n\n .anchor-heading {\n position: absolute;\n right: -$sp-4;\n width: $sp-5;\n height: 100%;\n padding-right: $sp-1;\n padding-left: $sp-1;\n overflow: visible;\n\n @include mq(md) {\n right: auto;\n left: -$sp-5;\n }\n\n svg {\n display: inline-block;\n width: 100%;\n height: 100%;\n color: $link-color;\n visibility: hidden;\n }\n }\n\n .anchor-heading:hover,\n .anchor-heading:focus,\n h1:hover > .anchor-heading,\n h2:hover > .anchor-heading,\n h3:hover > .anchor-heading,\n h4:hover > .anchor-heading,\n h5:hover > .anchor-heading,\n h6:hover > .anchor-heading {\n svg {\n visibility: visible;\n }\n }\n\n summary {\n cursor: pointer;\n }\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n #toctitle {\n position: relative;\n margin-top: 1.5em;\n margin-bottom: 0.25em;\n\n + table,\n + .table-wrapper,\n + .code-example,\n + .highlighter-rouge,\n + .sectionbody .listingblock {\n margin-top: 1em;\n }\n\n + p:not(.label) {\n margin-top: 0;\n }\n }\n\n > h1:first-child,\n > h2:first-child,\n > h3:first-child,\n > h4:first-child,\n > h5:first-child,\n > h6:first-child,\n > .sect1:first-child > h2,\n > .sect2:first-child > h3,\n > .sect3:first-child > h4,\n > .sect4:first-child > h5,\n > .sect5:first-child > h6 {\n margin-top: $sp-2;\n }\n}\n","// Main nav, breadcrumb, etc...\n// stylelint-disable selector-no-type, max-nesting-depth, selector-max-compound-selectors, selector-max-type, selector-max-specificity\n\n.nav-list {\n padding: 0;\n margin-top: 0;\n margin-bottom: 0;\n list-style: none;\n\n .nav-list-item {\n position: relative;\n margin: 0;\n\n @include fs-4;\n\n @include mq(md) {\n @include fs-3;\n }\n\n .nav-list-link {\n display: block;\n min-height: $nav-list-item-height-sm;\n padding-top: $sp-1;\n padding-bottom: $sp-1;\n line-height: #{$nav-list-item-height-sm - 2 * $sp-1};\n @if $nav-list-expander-right {\n padding-right: $nav-list-item-height-sm;\n padding-left: $gutter-spacing-sm;\n } @else {\n padding-right: $gutter-spacing-sm;\n padding-left: $nav-list-item-height-sm;\n }\n\n @include mq(md) {\n min-height: $nav-list-item-height;\n line-height: #{$nav-list-item-height - 2 * $sp-1};\n @if $nav-list-expander-right {\n padding-right: $nav-list-item-height;\n padding-left: $gutter-spacing;\n } @else {\n padding-right: $gutter-spacing;\n padding-left: $nav-list-item-height;\n }\n }\n\n &.external > svg {\n width: $sp-4;\n height: $sp-4;\n vertical-align: text-bottom;\n }\n\n &.active {\n font-weight: 600;\n text-decoration: none;\n }\n\n &:hover,\n &.active {\n color: darken($link-color, 5%);\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 80%,\n rgba($feedback-color, 0) 100%\n );\n }\n }\n\n .nav-list-expander {\n position: absolute;\n @if $nav-list-expander-right {\n right: 0;\n }\n\n width: $nav-list-item-height-sm;\n height: $nav-list-item-height-sm;\n padding: #{$nav-list-item-height-sm * 0.25};\n color: $link-color;\n\n @include mq(md) {\n width: $nav-list-item-height;\n height: $nav-list-item-height;\n padding: #{$nav-list-item-height * 0.25};\n }\n\n &:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 100%\n );\n }\n\n @if $nav-list-expander-right {\n svg {\n transform: rotate(90deg);\n }\n }\n }\n\n > .nav-list {\n display: none;\n padding-left: $sp-3;\n list-style: none;\n\n .nav-list-item {\n position: relative;\n\n .nav-list-link {\n color: $nav-child-link-color;\n }\n\n .nav-list-expander {\n color: $nav-child-link-color;\n }\n }\n }\n\n &.active {\n > .nav-list-expander svg {\n @if $nav-list-expander-right {\n transform: rotate(-90deg);\n } @else {\n transform: rotate(90deg);\n }\n }\n\n > .nav-list {\n display: block;\n }\n }\n }\n}\n\n.nav-category {\n padding: $sp-2 $gutter-spacing-sm;\n font-weight: 600;\n text-align: start;\n text-transform: uppercase;\n border-bottom: $border $border-color;\n @include fs-2;\n\n @include mq(md) {\n padding: $sp-2 $gutter-spacing;\n margin-top: $gutter-spacing-sm;\n text-align: start;\n\n &:first-child {\n margin-top: 0;\n }\n }\n}\n\n.nav-list.nav-category-list {\n > .nav-list-item {\n margin: 0;\n\n > .nav-list {\n padding: 0;\n\n > .nav-list-item {\n > .nav-list-link {\n color: $link-color;\n }\n\n > .nav-list-expander {\n color: $link-color;\n }\n }\n }\n }\n}\n\n// Aux nav\n\n.aux-nav {\n height: 100%;\n overflow-x: auto;\n @include fs-2;\n\n .aux-nav-list {\n display: flex;\n height: 100%;\n padding: 0;\n margin: 0;\n list-style: none;\n }\n\n .aux-nav-list-item {\n display: inline-block;\n height: 100%;\n padding: 0;\n margin: 0;\n }\n\n @include mq(md) {\n padding-right: $gutter-spacing-sm;\n }\n}\n\n// Breadcrumb nav\n\n.breadcrumb-nav {\n @include mq(md) {\n margin-top: -$sp-4;\n }\n}\n\n.breadcrumb-nav-list {\n padding-left: 0;\n margin-bottom: $sp-3;\n list-style: none;\n}\n\n.breadcrumb-nav-list-item {\n display: table-cell;\n @include fs-2;\n\n &::before {\n display: none;\n }\n\n &::after {\n display: inline-block;\n margin-right: $sp-2;\n margin-left: $sp-2;\n color: $grey-dk-000;\n content: \"/\";\n }\n\n &:last-child {\n &::after {\n content: \"\";\n }\n }\n}\n","// Typography\n// stylelint-disable selector-no-type, selector-max-type, selector-max-specificity, selector-max-id\n\nh1,\n.text-alpha {\n font-weight: 300;\n\n @include fs-8;\n}\n\nh2,\n.text-beta,\n#toctitle {\n @include fs-6;\n}\n\nh3,\n.text-gamma {\n @include fs-5;\n}\n\nh4,\n.text-delta {\n font-weight: 400;\n text-transform: uppercase;\n letter-spacing: 0.1em;\n\n @include fs-2;\n}\n\nh4 code {\n text-transform: none;\n}\n\nh5,\n.text-epsilon {\n @include fs-3;\n}\n\nh6,\n.text-zeta {\n @include fs-2;\n}\n\n.text-small {\n @include fs-2;\n}\n\n.text-mono {\n font-family: $mono-font-family !important;\n}\n\n.text-left {\n text-align: left !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n.text-right {\n text-align: right !important;\n}\n","// Labels (not the form kind)\n\n// this :not() prevents a style clash with Mermaid.js's\n// diagram labels, which also use .label\n// for more, see https://github.com/just-the-docs/just-the-docs/issues/1272\n// and the accompanying PR\n.label:not(g),\n.label-blue:not(g) {\n display: inline-block;\n padding: 0.16em 0.56em;\n margin-right: $sp-2;\n margin-left: $sp-2;\n color: $white;\n text-transform: uppercase;\n vertical-align: middle;\n background-color: $blue-100;\n border-radius: 12px;\n\n @include fs-2;\n}\n\n.label-green:not(g) {\n background-color: $green-300;\n}\n\n.label-purple:not(g) {\n background-color: $purple-100;\n}\n\n.label-red:not(g) {\n background-color: $red-300;\n}\n\n.label-yellow:not(g) {\n color: $grey-dk-200;\n background-color: $yellow-200;\n}\n","// Buttons and things that look like buttons\n// stylelint-disable color-named\n\n.btn {\n display: inline-block;\n box-sizing: border-box;\n padding: 0.3em 1em;\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n font-weight: 500;\n line-height: 1.5;\n color: $link-color;\n text-decoration: none;\n vertical-align: baseline;\n cursor: pointer;\n background-color: $base-button-color;\n border-width: 0;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n appearance: none;\n\n &:focus {\n text-decoration: none;\n outline: none;\n box-shadow: 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:focus:hover,\n &.selected:focus {\n box-shadow: 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:hover,\n &.zeroclipboard-is-hover {\n color: darken($link-color, 2%);\n }\n\n &:hover,\n &:active,\n &.zeroclipboard-is-hover,\n &.zeroclipboard-is-active {\n text-decoration: none;\n background-color: darken($base-button-color, 1%);\n }\n\n &:active,\n &.selected,\n &.zeroclipboard-is-active {\n background-color: darken($base-button-color, 3%);\n background-image: none;\n box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15);\n }\n\n &.selected:hover {\n background-color: darken(#dcdcdc, 5%);\n }\n\n &:disabled,\n &.disabled {\n &,\n &:hover {\n color: rgba(102, 102, 102, 0.5);\n cursor: default;\n background-color: rgba(229, 229, 229, 0.5);\n background-image: none;\n box-shadow: none;\n }\n }\n}\n\n.btn-outline {\n color: $link-color;\n background: transparent;\n box-shadow: inset 0 0 0 2px $grey-lt-300;\n\n &:hover,\n &:active,\n &.zeroclipboard-is-hover,\n &.zeroclipboard-is-active {\n color: darken($link-color, 4%);\n text-decoration: none;\n background-color: transparent;\n box-shadow: inset 0 0 0 3px $grey-lt-300;\n }\n\n &:focus {\n text-decoration: none;\n outline: none;\n box-shadow:\n inset 0 0 0 2px $grey-dk-100,\n 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:focus:hover,\n &.selected:focus {\n box-shadow: inset 0 0 0 2px $grey-dk-100;\n }\n}\n\n.btn-primary {\n @include btn-color($white, $btn-primary-color);\n}\n\n.btn-purple {\n @include btn-color($white, $purple-100);\n}\n\n.btn-blue {\n @include btn-color($white, $blue-200);\n}\n\n.btn-green {\n @include btn-color($white, $green-300);\n}\n\n.btn-reset {\n background: none;\n border: none;\n margin: 0;\n text-align: inherit;\n font: inherit;\n border-radius: 0;\n appearance: none;\n}\n","// Colored button\n\n@mixin btn-color($fg, $bg) {\n color: $fg;\n background-color: darken($bg, 2%);\n background-image: linear-gradient(lighten($bg, 5%), darken($bg, 2%));\n box-shadow:\n 0 1px 3px rgba(0, 0, 0, 0.25),\n 0 4px 10px rgba(0, 0, 0, 0.12);\n\n &:hover,\n &.zeroclipboard-is-hover {\n color: $fg;\n background-color: darken($bg, 4%);\n background-image: linear-gradient((lighten($bg, 2%), darken($bg, 4%)));\n }\n\n &:active,\n &.selected,\n &.zeroclipboard-is-active {\n background-color: darken($bg, 5%);\n background-image: none;\n box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15);\n }\n\n &.selected:hover {\n background-color: darken($bg, 10%);\n }\n}\n","// Search input and autocomplete\n\n.search {\n position: relative;\n z-index: 2;\n flex-grow: 1;\n height: $sp-10;\n padding: $sp-2;\n transition: padding linear #{$transition-duration * 0.5};\n\n @include mq(md) {\n position: relative !important;\n width: auto !important;\n height: 100% !important;\n padding: 0;\n transition: none;\n }\n}\n\n.search-input-wrap {\n position: relative;\n z-index: 1;\n height: $sp-8;\n overflow: hidden;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n transition: height linear #{$transition-duration * 0.5};\n\n @include mq(md) {\n position: absolute;\n width: 100%;\n max-width: $search-results-width;\n height: 100% !important;\n border-radius: 0;\n box-shadow: none;\n transition: width ease $transition-duration;\n }\n}\n\n.search-input {\n position: absolute;\n width: 100%;\n height: 100%;\n padding: $sp-2 $gutter-spacing-sm $sp-2 #{$gutter-spacing-sm + $sp-5};\n font-size: 1rem;\n color: $body-text-color;\n background-color: $search-background-color;\n border-top: 0;\n border-right: 0;\n border-bottom: 0;\n border-left: 0;\n border-radius: 0;\n\n @include mq(md) {\n padding: $sp-2 $gutter-spacing-sm $sp-2 #{$gutter-spacing + $sp-5};\n font-size: 0.875rem;\n background-color: $body-background-color;\n transition: padding-left linear #{$transition-duration * 0.5};\n }\n\n &:focus {\n outline: 2px solid $link-color;\n outline-offset: -2px;\n\n + .search-label .search-icon {\n color: $link-color;\n }\n }\n}\n\n.search-label {\n position: absolute;\n display: flex;\n height: 100%;\n padding-left: $gutter-spacing-sm;\n\n @include mq(md) {\n padding-left: $gutter-spacing;\n transition: padding-left linear #{$transition-duration * 0.5};\n }\n\n .search-icon {\n width: #{$sp-4 * 1.2};\n height: #{$sp-4 * 1.2};\n align-self: center;\n color: $grey-dk-000;\n }\n}\n\n.search-results {\n position: absolute;\n left: 0;\n display: none;\n width: 100%;\n max-height: calc(100% - #{$sp-10});\n overflow-y: auto;\n background-color: $search-background-color;\n border-bottom-right-radius: $border-radius;\n border-bottom-left-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n\n @include mq(md) {\n top: 100%;\n width: $search-results-width;\n max-height: calc(100vh - 200%) !important;\n }\n}\n\n.search-results-list {\n padding-left: 0;\n margin-bottom: $sp-1;\n list-style: none;\n @include fs-4;\n\n @include mq(md) {\n @include fs-3;\n }\n}\n\n.search-results-list-item {\n padding: 0;\n margin: 0;\n}\n\n.search-result {\n display: block;\n padding: $sp-1 $sp-3;\n\n &:hover,\n &.active {\n background-color: $feedback-color;\n }\n}\n\n.search-result-title {\n display: block;\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n\n @include mq(sm) {\n display: inline-block;\n width: 40%;\n padding-right: $sp-2;\n vertical-align: top;\n }\n}\n\n.search-result-doc {\n display: flex;\n align-items: center;\n word-wrap: break-word;\n\n &.search-result-doc-parent {\n opacity: 0.5;\n @include fs-3;\n\n @include mq(md) {\n @include fs-2;\n }\n }\n\n .search-result-icon {\n width: $sp-4;\n height: $sp-4;\n margin-right: $sp-2;\n color: $link-color;\n flex-shrink: 0;\n }\n\n .search-result-doc-title {\n overflow: auto;\n }\n}\n\n.search-result-section {\n margin-left: #{$sp-4 + $sp-2};\n word-wrap: break-word;\n}\n\n.search-result-rel-url {\n display: block;\n margin-left: #{$sp-4 + $sp-2};\n overflow: hidden;\n color: $search-result-preview-color;\n text-overflow: ellipsis;\n white-space: nowrap;\n @include fs-1;\n}\n\n.search-result-previews {\n display: block;\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n padding-left: $sp-4;\n margin-left: $sp-2;\n color: $search-result-preview-color;\n word-wrap: break-word;\n border-left: $border;\n border-left-color: $border-color;\n @include fs-2;\n\n @include mq(sm) {\n display: inline-block;\n width: 60%;\n padding-left: $sp-2;\n margin-left: 0;\n vertical-align: top;\n }\n}\n\n.search-result-preview + .search-result-preview {\n margin-top: $sp-1;\n}\n\n.search-result-highlight {\n font-weight: bold;\n}\n\n.search-no-result {\n padding: $sp-2 $sp-3;\n @include fs-3;\n}\n\n.search-button {\n position: fixed;\n right: $sp-4;\n bottom: $sp-4;\n display: flex;\n width: $sp-9;\n height: $sp-9;\n background-color: $search-background-color;\n border: 1px solid rgba($link-color, 0.3);\n border-radius: #{$sp-9 * 0.5};\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n align-items: center;\n justify-content: center;\n}\n\n.search-overlay {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1;\n width: 0;\n height: 0;\n background-color: rgba(0, 0, 0, 0.3);\n opacity: 0;\n transition:\n opacity ease $transition-duration,\n width 0s $transition-duration,\n height 0s $transition-duration;\n}\n\n.search-active {\n .search {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n padding: 0;\n }\n\n .search-input-wrap {\n height: $sp-10;\n border-radius: 0;\n\n @include mq(md) {\n width: $search-results-width;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n }\n }\n\n .search-input {\n background-color: $search-background-color;\n\n @include mq(md) {\n padding-left: 2.3rem;\n }\n }\n\n .search-label {\n @include mq(md) {\n padding-left: 0.6rem;\n }\n }\n\n .search-results {\n display: block;\n }\n\n .search-overlay {\n width: 100%;\n height: 100%;\n opacity: 1;\n transition:\n opacity ease $transition-duration,\n width 0s,\n height 0s;\n }\n\n @include mq(md) {\n .main {\n position: fixed;\n right: 0;\n left: 0;\n }\n }\n\n .main-header {\n padding-top: $sp-10;\n\n @include mq(md) {\n padding-top: 0;\n }\n }\n}\n","// Tables\n// stylelint-disable max-nesting-depth, selector-no-type, selector-max-type\n\n.table-wrapper {\n display: block;\n width: 100%;\n max-width: 100%;\n margin-bottom: $sp-5;\n overflow-x: auto;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n}\n\ntable {\n display: table;\n min-width: 100%;\n border-collapse: separate;\n}\n\nth,\ntd {\n min-width: 7.5rem;\n padding: $sp-2 $sp-3;\n background-color: $table-background-color;\n border-bottom: $border rgba($border-color, 0.5);\n border-left: $border $border-color;\n\n @include fs-3;\n\n &:first-of-type {\n border-left: 0;\n }\n}\n\ntbody {\n tr {\n &:last-of-type {\n th,\n td {\n border-bottom: 0;\n }\n\n td {\n padding-bottom: $sp-3;\n }\n }\n }\n}\n\nthead {\n th {\n border-bottom: $border $border-color;\n }\n}\n","// Code and syntax highlighting\n// stylelint-disable selector-no-qualifying-type, declaration-block-semicolon-newline-after,declaration-block-single-line-max-declarations, selector-no-type, selector-max-type, scss/comment-no-empty\n\n// {% raw %}\n\n// This instruction applies to all queues not within 'pre' or 'figure', avoiding 'code' generated by the highlight.\n:not(pre, figure) {\n & > code {\n padding: 0.2em 0.15em;\n font-weight: 400;\n background-color: $code-background-color;\n border: $border $border-color;\n border-radius: $border-radius;\n }\n}\n\n// Avoid appearance of dark border around visited code links in Safari\na:visited code {\n border-color: $border-color;\n}\n\n// Content structure for highlighted code blocks using fences or Liquid\n//\n// ```[LANG]...```, no kramdown line_numbers:\n// div.[language-LANG.]highlighter-rouge > div.highlight > pre.highlight > code\n//\n// ```[LANG]...```, kramdown line_numbers = true:\n// div.[language-LANG.]highlighter-rouge > div.highlight > pre.highlight > code\n// > div.table-wrapper > table.rouge-table > tbody > tr\n// > td.rouge-gutter.gl > pre.lineno\n// | td.rouge-code > pre\n//\n// {% highlight LANG %}...{% endhighlight %}:\n// figure.highlight > pre > code.language-LANG\n//\n// {% highlight LANG linenos %}...{% endhighlight %}:\n// figure.highlight > pre > code.language-LANG\n// > div.table-wrapper > table.rouge-table > tbody > tr\n// > td.gutter.gl > pre.lineno\n// | td.code > pre\n//\n// ----...---- (AsciiDoc)\n// div.listingblock > div.content > pre.rouge.highlight\n//\n// fix_linenos removes the outermost pre when it encloses table.rouge-table\n//\n// See docs/index-test.md for some tests.\n//\n// No kramdown line_numbers: fences and Liquid highlighting look the same.\n// Kramdown line_numbers = true: fences have a wider gutter than with Liquid?\n\n// ```[LANG]...```\n// or in AsciiDoc:\n//\n// ----\n// ...\n// ----\n\n// the code may appear with 3 different types:\n// container \\ case: default case, code with line number, code with html rendering\n// top level: div.highlighter-rouge, figure.highlight, figure.highlight\n// second level: div.highlight, div.table-wrapper, pre.highlight\n// third level: pre.highlight, td.code, absent\n// last level: code, pre, code (optionality)\n// highlighter level: span, span, span\n// the spacing are only in the second level for case 1, 3 and in the third level for case 2\n// in AsciiDoc, there is a parent container that contains optionally a title and the content.\n\n// select top level container\ndiv.highlighter-rouge,\ndiv.listingblock > div.content,\nfigure.highlight {\n margin-top: 0;\n margin-bottom: $sp-3;\n background-color: $code-background-color;\n border-radius: $border-radius;\n box-shadow: none;\n -webkit-overflow-scrolling: touch;\n position: relative;\n padding: 0;\n\n // copy button (or other button)\n // the button appear only when there is a hover on the code or focus on button\n > button {\n width: $sp-3;\n opacity: 0;\n position: absolute;\n top: 0;\n right: 0;\n padding: $sp-3;\n border: none;\n background: none;\n color: $body-text-color;\n box-sizing: content-box;\n\n svg {\n fill: $body-text-color;\n }\n\n &:active {\n text-decoration: none;\n outline: none;\n opacity: 1;\n }\n\n &:focus {\n opacity: 1;\n outline: 2px solid $link-color;\n }\n }\n\n // the button can be seen by doing a simple hover in the code, there is no need to go over the location of the button\n &:hover {\n > button {\n cursor: copy;\n opacity: 1;\n }\n }\n}\n\n// setting the spacing and scrollbar on the second level for the first case\n// remove all space on the second and third level\n// this is a mixin to accommodate for the slightly different structures generated via Markdown vs AsciiDoc\n@mixin scroll-and-spacing($code-div, $pre-select) {\n #{$code-div} {\n overflow-x: auto;\n padding: $sp-3;\n margin: 0;\n border: 1px solid $body-text-color;\n border-radius: $border-radius;\n }\n\n #{$pre-select},\n code {\n padding: 0;\n margin: 0;\n border: 0;\n }\n}\n\n// for Markdown\ndiv.highlighter-rouge {\n @include scroll-and-spacing(\"div.highlight\", \"pre.highlight\");\n}\n\n// for AsciiDoc. we also need to fix the margins for its parent container.\ndiv.listingblock {\n margin-top: 0;\n margin-bottom: $sp-3;\n\n @include scroll-and-spacing(\"div.content\", \"div.content > pre\");\n}\n\n// {% highlight LANG %}...{% endhighlight %},\n// {% highlight LANG linenos %}...{% endhighlight %}:\n\n// setting the spacing and scrollbar on the second level for the thirt case\n// the css rule are apply only to the last code enviroment\n// setting the scroolbar\nfigure.highlight {\n pre,\n :not(pre) > code {\n overflow-x: auto;\n padding: $sp-3;\n margin: 0;\n border: 1px solid $body-text-color;\n border-radius: $border-radius;\n }\n}\n\n// ```[LANG]...```, kramdown line_numbers = true,\n// {% highlight LANG linenos %}...{% endhighlight %}:\n\n// setting the spacing and scrollbar on the thirt level for the second case\n.highlight .table-wrapper {\n padding: $sp-3 0;\n margin: 0;\n border: 0;\n box-shadow: none;\n\n td,\n pre {\n min-width: 0;\n padding: 0;\n background-color: $code-background-color;\n border: 0;\n\n @include fs-2;\n }\n\n td.gl {\n width: 1em;\n padding-right: $sp-3;\n padding-left: $sp-3;\n }\n\n pre {\n margin: 0;\n line-height: 2;\n }\n}\n\n// Code examples: html render of a code\n.code-example,\n.listingblock > .title {\n padding: $sp-3;\n margin-bottom: $sp-3;\n overflow: auto;\n border: 1px solid $border-color;\n border-radius: $border-radius;\n\n + .highlighter-rouge,\n + .sectionbody .listingblock,\n + .content,\n + figure.highlight {\n position: relative;\n margin-top: -$sp-4;\n border-right: 1px solid $border-color;\n border-bottom: 1px solid $border-color;\n border-left: 1px solid $border-color;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n }\n}\n\n// Mermaid diagram code blocks should be left unstyled.\ncode.language-mermaid {\n padding: 0;\n background-color: inherit;\n border: 0;\n}\n\n// Override OneDarkJekyll Colors for Code Blocks\n.highlight,\npre.highlight {\n background: $code-background-color; // Code Background\n // For Backwards Compatibility Before $code-linenumber-color was added\n @if variable-exists(code-linenumber-color) {\n color: $code-linenumber-color; // Code Line Numbers\n } @else {\n color: $body-text-color; // Code Line Numbers\n }\n}\n\n// Override OneDarkJekyll Colors for Code Blocks\n.highlight pre {\n background: $code-background-color; // Code Background\n}\n\n// {% endraw %}\n","// Utility classes for colors\n\n// Text colors\n\n.text-grey-dk-000 {\n color: $grey-dk-000 !important;\n}\n\n.text-grey-dk-100 {\n color: $grey-dk-100 !important;\n}\n\n.text-grey-dk-200 {\n color: $grey-dk-200 !important;\n}\n\n.text-grey-dk-250 {\n color: $grey-dk-250 !important;\n}\n\n.text-grey-dk-300 {\n color: $grey-dk-300 !important;\n}\n\n.text-grey-lt-000 {\n color: $grey-lt-000 !important;\n}\n\n.text-grey-lt-100 {\n color: $grey-lt-100 !important;\n}\n\n.text-grey-lt-200 {\n color: $grey-lt-200 !important;\n}\n\n.text-grey-lt-300 {\n color: $grey-lt-300 !important;\n}\n\n.text-blue-000 {\n color: $blue-000 !important;\n}\n\n.text-blue-100 {\n color: $blue-100 !important;\n}\n\n.text-blue-200 {\n color: $blue-200 !important;\n}\n\n.text-blue-300 {\n color: $blue-300 !important;\n}\n\n.text-green-000 {\n color: $green-000 !important;\n}\n\n.text-green-100 {\n color: $green-100 !important;\n}\n\n.text-green-200 {\n color: $green-200 !important;\n}\n\n.text-green-300 {\n color: $green-300 !important;\n}\n\n.text-purple-000 {\n color: $purple-000 !important;\n}\n\n.text-purple-100 {\n color: $purple-100 !important;\n}\n\n.text-purple-200 {\n color: $purple-200 !important;\n}\n\n.text-purple-300 {\n color: $purple-300 !important;\n}\n\n.text-yellow-000 {\n color: $yellow-000 !important;\n}\n\n.text-yellow-100 {\n color: $yellow-100 !important;\n}\n\n.text-yellow-200 {\n color: $yellow-200 !important;\n}\n\n.text-yellow-300 {\n color: $yellow-300 !important;\n}\n\n.text-red-000 {\n color: $red-000 !important;\n}\n\n.text-red-100 {\n color: $red-100 !important;\n}\n\n.text-red-200 {\n color: $red-200 !important;\n}\n\n.text-red-300 {\n color: $red-300 !important;\n}\n\n// Background colors\n\n.bg-grey-dk-000 {\n background-color: $grey-dk-000 !important;\n}\n\n.bg-grey-dk-100 {\n background-color: $grey-dk-100 !important;\n}\n\n.bg-grey-dk-200 {\n background-color: $grey-dk-200 !important;\n}\n\n.bg-grey-dk-250 {\n background-color: $grey-dk-250 !important;\n}\n\n.bg-grey-dk-300 {\n background-color: $grey-dk-300 !important;\n}\n\n.bg-grey-lt-000 {\n background-color: $grey-lt-000 !important;\n}\n\n.bg-grey-lt-100 {\n background-color: $grey-lt-100 !important;\n}\n\n.bg-grey-lt-200 {\n background-color: $grey-lt-200 !important;\n}\n\n.bg-grey-lt-300 {\n background-color: $grey-lt-300 !important;\n}\n\n.bg-blue-000 {\n background-color: $blue-000 !important;\n}\n\n.bg-blue-100 {\n background-color: $blue-100 !important;\n}\n\n.bg-blue-200 {\n background-color: $blue-200 !important;\n}\n\n.bg-blue-300 {\n background-color: $blue-300 !important;\n}\n\n.bg-green-000 {\n background-color: $green-000 !important;\n}\n\n.bg-green-100 {\n background-color: $green-100 !important;\n}\n\n.bg-green-200 {\n background-color: $green-200 !important;\n}\n\n.bg-green-300 {\n background-color: $green-300 !important;\n}\n\n.bg-purple-000 {\n background-color: $purple-000 !important;\n}\n\n.bg-purple-100 {\n background-color: $purple-100 !important;\n}\n\n.bg-purple-200 {\n background-color: $purple-200 !important;\n}\n\n.bg-purple-300 {\n background-color: $purple-300 !important;\n}\n\n.bg-yellow-000 {\n background-color: $yellow-000 !important;\n}\n\n.bg-yellow-100 {\n background-color: $yellow-100 !important;\n}\n\n.bg-yellow-200 {\n background-color: $yellow-200 !important;\n}\n\n.bg-yellow-300 {\n background-color: $yellow-300 !important;\n}\n\n.bg-red-000 {\n background-color: $red-000 !important;\n}\n\n.bg-red-100 {\n background-color: $red-100 !important;\n}\n\n.bg-red-200 {\n background-color: $red-200 !important;\n}\n\n.bg-red-300 {\n background-color: $red-300 !important;\n}\n","// Utility classes for layout\n\n// Display\n\n.d-block {\n display: block !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-none {\n display: none !important;\n}\n\n// Screenreader-only\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border-width: 0;\n}\n\n@each $media-query in map-keys($media-queries) {\n @for $i from 1 through length($spacers) {\n @include mq($media-query) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .d-sm-block, .d-md-none, .d-lg-inline\n .d-#{$media-query}-block {\n display: block !important;\n }\n .d-#{$media-query}-flex {\n display: flex !important;\n }\n .d-#{$media-query}-inline {\n display: inline !important;\n }\n .d-#{$media-query}-inline-block {\n display: inline-block !important;\n }\n .d-#{$media-query}-none {\n display: none !important;\n }\n }\n }\n}\n\n// Horizontal alignment\n\n.float-left {\n float: left !important;\n}\n\n.float-right {\n float: right !important;\n}\n\n.flex-justify-start {\n justify-content: flex-start !important;\n}\n\n.flex-justify-end {\n justify-content: flex-end !important;\n}\n\n.flex-justify-between {\n justify-content: space-between !important;\n}\n\n.flex-justify-around {\n justify-content: space-around !important;\n}\n\n// Vertical alignment\n\n.v-align-baseline {\n vertical-align: baseline !important;\n}\n\n.v-align-bottom {\n vertical-align: bottom !important;\n}\n\n.v-align-middle {\n vertical-align: middle !important;\n}\n\n.v-align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.v-align-text-top {\n vertical-align: text-top !important;\n}\n\n.v-align-top {\n vertical-align: top !important;\n}\n","// Utility classes for typography\n\n.fs-1 {\n @include fs-1;\n}\n\n.fs-2 {\n @include fs-2;\n}\n\n.fs-3 {\n @include fs-3;\n}\n\n.fs-4 {\n @include fs-4;\n}\n\n.fs-5 {\n @include fs-5;\n}\n\n.fs-6 {\n @include fs-6;\n}\n\n.fs-7 {\n @include fs-7;\n}\n\n.fs-8 {\n @include fs-8;\n}\n\n.fs-9 {\n @include fs-9;\n}\n\n.fs-10 {\n @include fs-10;\n}\n\n.fw-300 {\n font-weight: 300 !important;\n}\n\n.fw-400 {\n font-weight: 400 !important;\n}\n\n.fw-500 {\n font-weight: 500 !important;\n}\n\n.fw-700 {\n font-weight: 700 !important;\n}\n\n.lh-0 {\n line-height: 0 !important;\n}\n\n.lh-default {\n line-height: $body-line-height;\n}\n\n.lh-tight {\n line-height: $body-heading-line-height;\n}\n\n.ls-5 {\n letter-spacing: 0.05em !important;\n}\n\n.ls-10 {\n letter-spacing: 0.1em !important;\n}\n\n.ls-0 {\n letter-spacing: 0 !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n","// Utility classes for lists\n\n// stylelint-disable selector-max-type\n\n.list-style-none {\n padding: 0 !important;\n margin: 0 !important;\n list-style: none !important;\n\n li {\n &::before {\n display: none !important;\n }\n }\n}\n","// Utility classes for margins and padding\n\n// stylelint-disable block-opening-brace-space-after, block-opening-brace-space-before\n\n// Margin spacer utilities\n\n.mx-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n}\n\n@for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .m-0, .m-1, .m-2...\n .m-#{$scale} {\n margin: #{$size} !important;\n }\n .mt-#{$scale} {\n margin-top: #{$size} !important;\n }\n .mr-#{$scale} {\n margin-right: #{$size} !important;\n }\n .mb-#{$scale} {\n margin-bottom: #{$size} !important;\n }\n .ml-#{$scale} {\n margin-left: #{$size} !important;\n }\n\n .mx-#{$scale} {\n margin-right: #{$size} !important;\n margin-left: #{$size} !important;\n }\n\n .my-#{$scale} {\n margin-top: #{$size} !important;\n margin-bottom: #{$size} !important;\n }\n\n .mxn-#{$scale} {\n margin-right: -#{$size} !important;\n margin-left: -#{$size} !important;\n }\n .mx-#{$scale}-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n}\n\n@each $media-query in map-keys($media-queries) {\n @for $i from 1 through length($spacers) {\n @include mq($media-query) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .m-sm-0, .m-md-1, .m-lg-2...\n .m-#{$media-query}-#{$scale} {\n margin: #{$size} !important;\n }\n .mt-#{$media-query}-#{$scale} {\n margin-top: #{$size} !important;\n }\n .mr-#{$media-query}-#{$scale} {\n margin-right: #{$size} !important;\n }\n .mb-#{$media-query}-#{$scale} {\n margin-bottom: #{$size} !important;\n }\n .ml-#{$media-query}-#{$scale} {\n margin-left: #{$size} !important;\n }\n\n .mx-#{$media-query}-#{$scale} {\n margin-right: #{$size} !important;\n margin-left: #{$size} !important;\n }\n\n .my-#{$media-query}-#{$scale} {\n margin-top: #{$size} !important;\n margin-bottom: #{$size} !important;\n }\n\n .mxn-#{$media-query}-#{$scale} {\n margin-right: -#{$size} !important;\n margin-left: -#{$size} !important;\n }\n }\n }\n}\n\n// Padding spacer utilities\n\n@for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .p-0, .p-1, .p-2...\n .p-#{$scale} {\n padding: #{$size} !important;\n }\n .pt-#{$scale} {\n padding-top: #{$size} !important;\n }\n .pr-#{$scale} {\n padding-right: #{$size} !important;\n }\n .pb-#{$scale} {\n padding-bottom: #{$size} !important;\n }\n .pl-#{$scale} {\n padding-left: #{$size} !important;\n }\n\n .px-#{$scale} {\n padding-right: #{$size} !important;\n padding-left: #{$size} !important;\n }\n\n .py-#{$scale} {\n padding-top: #{$size} !important;\n padding-bottom: #{$size} !important;\n }\n}\n\n@each $media-query in map-keys($media-queries) {\n @include mq($media-query) {\n @for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .p-sm-0, .p-md-1, .p-lg-2...\n .p-#{$media-query}-#{$scale} {\n padding: #{$size} !important;\n }\n .pt-#{$media-query}-#{$scale} {\n padding-top: #{$size} !important;\n }\n .pr-#{$media-query}-#{$scale} {\n padding-right: #{$size} !important;\n }\n .pb-#{$media-query}-#{$scale} {\n padding-bottom: #{$size} !important;\n }\n .pl-#{$media-query}-#{$scale} {\n padding-left: #{$size} !important;\n }\n\n .px-#{$media-query}-#{$scale} {\n padding-right: #{$size} !important;\n padding-left: #{$size} !important;\n }\n\n .py-#{$media-query}-#{$scale} {\n padding-top: #{$size} !important;\n padding-bottom: #{$size} !important;\n }\n }\n }\n}\n","// stylelint-disable selector-max-specificity, selector-max-id, selector-max-type, selector-no-qualifying-type\n\n@media print {\n .site-footer,\n .site-button,\n #edit-this-page,\n #back-to-top,\n .site-nav,\n .main-header {\n display: none !important;\n }\n\n hr {\n margin-top: 1rem;\n margin-bottom: 1rem;\n }\n\n .side-bar {\n width: 100%;\n height: auto;\n border-right: 0 !important;\n }\n\n .site-header {\n border-bottom: 1px solid $border-color;\n }\n\n .site-title {\n font-size: 1rem !important;\n font-weight: 700 !important;\n }\n\n .text-small {\n font-size: 8pt !important;\n }\n\n pre.highlight {\n border: 1px solid $border-color;\n }\n\n .main {\n max-width: none;\n margin-left: 0;\n }\n}\n","// Skipnav\n// Skip to main content\n\na.skip-to-main {\n left: -999px;\n position: absolute;\n top: auto;\n width: 1px;\n height: 1px;\n overflow: hidden;\n z-index: -999;\n}\n\na.skip-to-main:focus,\na.skip-to-main:active {\n color: $link-color;\n background-color: $body-background-color;\n left: auto;\n top: auto;\n width: 30%;\n height: auto;\n overflow: auto;\n margin: 10px 35%;\n padding: 5px;\n border-radius: 15px;\n border: 4px solid $btn-primary-color;\n text-align: center;\n font-size: 1.2em;\n z-index: 999;\n}\n","\n@import \"./support/support\";\n@import \"./custom/setup\";\n@import \"./color_schemes/light\";\n\n@import \"./color_schemes/dark\";\n\n@import \"./modules\";\ndiv.opaque {\n background-color: $body-background-color;\n}\n\np.tip, blockquote.tip {\n border: 1px $green-300 solid;\n border-left: $border-radius solid $green-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $green-300;\n content: \"Tip\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .tip-title {\n color: $green-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.tip-title, blockquote.tip-title {\n border: 1px $green-300 solid;\n border-left: $border-radius solid $green-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $green-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.tip {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.tip-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n\np.note, blockquote.note {\n border: 1px $blue-300 solid;\n border-left: $border-radius solid $blue-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $blue-300;\n content: \"Note\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .note-title {\n color: $blue-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.note-title, blockquote.note-title {\n border: 1px $blue-300 solid;\n border-left: $border-radius solid $blue-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $blue-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.note {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.note-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n\np.warning, blockquote.warning {\n border: 1px $yellow-300 solid;\n border-left: $border-radius solid $yellow-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $yellow-300;\n content: \"Warning\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .warning-title {\n color: $yellow-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.warning-title, blockquote.warning-title {\n border: 1px $yellow-300 solid;\n border-left: $border-radius solid $yellow-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $yellow-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.warning {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.warning-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n@import \"./custom/custom\";\n\n\n"],"file":"just-the-docs-dark.css"} \ No newline at end of file +{"version":3,"sourceRoot":"","sources":["../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/vendor/accessible-pygments/github-light.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/vendor/accessible-pygments/github-dark.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/vendor/normalize.scss/normalize.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/base.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/color_schemes/dark.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/support/mixins/_typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/support/mixins/_layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/support/_variables.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/content.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/navigation.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/labels.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/buttons.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/support/mixins/_buttons.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/search.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/tables.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/code.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/utilities/_colors.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/utilities/_layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/utilities/_typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/utilities/_lists.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/utilities/_spacing.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/print.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/skiptomain.scss","just-the-docs-dark.scss"],"names":[],"mappings":";AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA;EAAkB;;;AAClB;EAAgB;EAAiB;AACjC;EAAkB;EAAiB;AACnC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAkB;EAAiB;AACnC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAqB;AACtC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAoB;AACrC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAgB;EAAiB;AACjC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AChFlC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA;EAAkB;;;AAClB;EAAa;EAAqB;;;AAClC;EAAgB;EAAgB;EAAqB;AACrD;EAAkB;EAAiB;AACnC;EAAkB;EAAiB;AACnC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAgB;EAAgB;EAAoB;AACpD;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAiB;EAAgB;EAAqB;AACtD;EAAiB;EAAgB;EAAqB;AACtD;EAAiB;EAAgB;EAAmB;EAAqB;AACzE;EAAkB;EAAgB;EAAqB;AACvD;EAAiB;EAAgB;EAAqB;AACtD;EAAiB;EAAgB;EAAmB;EAAqB;AACzE;EAAiB;EAAgB;EAA4B;AAC7D;EAAiB;EAAgB;EAAqB;AACtD;EAAkB;EAAgB;EAAmB;EAAqB;AAC1E;EAAiB;EAAiB;AAClC;EAAiB;EAAgB;EAAoB;AACrD;EAAiB;EAAgB;EAA4B;AAC7D;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAgB;EAAoB;AACrD;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAA0B;EAAgB;EAA6B;AACvE;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAgB;EAAoB;AACrD;EAAiB;EAAgB;EAAoB;AACrD;EAAiB;EAAgB;EAAoB;AACrD;EAAiB;EAAiB;AAClC;EAAiB;EAAgB;EAAoB;AACrD;EAAiB;EAAgB;EAAoB;AACrD;EAAiB;EAAgB;EAAoB;AACrD;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAgB;EAAoB;AACrD;EAAiB;EAAiB;AAClC;EAAgB;EAAiB;AACjC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAgB;EAAoB;AACrD;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AC1FlC;AAEA;AAAA;AAGA;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAAA;AAKA;EACE;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;EAEE;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;AAAA;EAGE;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;EAEE;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAAA;AAKA;AAAA;AAAA;AAAA;AAAA;EAKE;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;AAEE;EACA;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;AAEE;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;EAIE;;;AAGF;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;EAIE;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;EAIE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;EAEE;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;EAEE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AC1VF;EACE,cCJa;;;ADOf;EACE;;;AAGF;EACE;;AEmBA;EACE;;AClBA;EHHJ;IEyBI;;;;AFnBJ;EACE,aIfiB;EJgBjB;EACA,aIbiB;EJcjB,OIiBY;EJhBZ,kBIYY;EJXZ;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAYE;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;EACA;EACA;EACA,aI1CyB;EJ2CzB,OIjBY;;;AJoBd;EACE;EACA;;;AAGF;EACE,OCzDW;ED0DX;;;AAGF;EACE;EACA,uBInCY;EJoCZ;;AAEA;EACE;;;AAIJ;EACE,aIvEiB;EJwEjB;EACA,aIvEiB;;;AJ0EnB;AAAA;EAEE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA,kBInEY;EJoEZ;;;AAIF;EACE;EAGA;EACA;EACA;EACA;;;AK7GF;EACE;EACA;EACA;EACA,kBD4BY;;ADpBV;EEZJ;IAOI;IACA;IACA,ODwFW;ICvFX;IACA;IACA;;;AFAA;EEZJ;IAgBI;IACA,WD+EQ;;;ADpFR;EEQF;IAEI,aD2ES;;;ADrFX;EEQF;IAQI;;;AAOF;EACE;EACA,kBDLQ;;ADpBV;EEuBA;IAKI;IACA,kBDTM;;;ACYR;EACE;;AFjCJ;EEgCE;IAII;;;;AAOV;EACE;;AF5CE;EE2CJ;IAII;IACA,WDyCY;;;;ACrChB;EACE,aDaK;ECZL,gBDYK;EDvDL,eCuDK;EDtDL,cCsDK;;ADlEH;EEoDJ;IFrCI,eCqDG;IDpDH,cCoDG;;;ADpEH;EEoDJ;IAOI,aDSG;ICRH,gBDQG;;;;ACJP;EACE;EACA;;AFlEE;EEgEJ;IAKI;IACA;IACA,QDmBY;;;;ACfhB;AAAA;AAAA;EAGE;;AF9EE;EE2EJ;AAAA;AAAA;IAMI,ODGQ;;;;ACCZ;EACE;;AAEA;EACE;;AFzFA;EEqFJ;IAQI;IACA,aDxBG;ICyBH,gBD7BG;IC8BH;IACA;;;;AAIJ;EACE;EACA,YDbc;ECcd;;AFxGE;EEqGJ;IAMI,QDjBY;ICkBZ,YDlBY;ICmBZ;;;;AAIJ;EACE;EACA;EACA;EACA;EACA,aDrDK;ECsDL,gBDtDK;ECuDL,ODnGY;EDVZ,eCuDK;EDtDL,cCsDK;;ADlEH;EEiHJ;IFlGI,eCqDG;IDpDH,cCoDG;;;AF/BL;EACE;;ACtCA;EEiHJ;IHvEI;IACA,aEhDuB;;;ADKvB;EEiHJ;IAcI,aD/DG;ICgEH,gBDhEG;;;;AC+EP;EACE;EACA;EACA,SDhFK;ECiFL;;;AFnJE;EEuJF;IACE;;;AAIJ;EACE;;;AAQF;EACE;;;AAOF;EACE;EACA;EACA;EACA,aD/GK;ECgHL,gBDhHK;EDvDL,eCuDK;EDtDL,cCsDK;;ADlEH;EE6KJ;IF9JI,eCqDG;IDpDH,cCoDG;;;AFvEL;EACE;;ACEA;EE6KJ;IH3KI;;;ACFA;EE6KJ;IAYI;IACA;;;;AAIJ;EACE,OD5HK;EC6HL,QD7HK;EC8HL,OJ3MW;;;AKCb;EACE,aFEoB;;AEApB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;;AAGF;EACE;EACA;;AAGF;AAAA;EAEE;;AAIA;EACE,YF+CC;;AE3CL;EACE;EACA;;AAEA;EACE;;AAEA;EACE;EACA;EACA;EACA,OFfM;EEgBN;EACA;;AJ1BN;EACE;;ACRA;EG2BE;IJfF;;;ACZA;EG2BE;IAUI;;;AAIJ;EACE;;AAGE;EACE;EACA;;AAOV;EACE;;AAGE;EACE;EACA;EACA,OF7CM;EE8CN;;AAMJ;EACE;;AAIJ;EACE;EACA;;AAKF;EACE;;AAGF;EACE;;AAGF;EACE;EACA;;AAGF;AAAA;EAEE;;AAGF;EACE;EACA;EACA;;AAEA;EACE;;AAIJ;EACE;EACA;EACA;;AAmBE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;;AASF;AAAA;AAAA;AAAA;AAAA;AAAA;EAEE;;AAKN;EACE;EACA;EACA,OFnFG;EEoFH;EACA,eFzFG;EE0FH,cF1FG;EE2FH;;AH1JA;EGmJF;IAUI;IACA;;;AAGF;EACE;EACA;EACA;EACA,OL/KO;EKgLP;;AAYF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;;AAIJ;EACE;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;EACA;EACA;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAKE;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;;AAIJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAWE,YF9JG;;;AG3EP;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;ALoBF;EACE;;AClBA;EILF;IL2BE;;;ACtBA;EDOF;IACE;;;ACRA;EILF;ILiBE;;;AKPA;EACE;EACA,YH+DC;EG9DD,aHuDC;EGtDD,gBHsDC;EGrDD;EAEE,eH0DD;EGzDC,cHqDD;;ADlEH;EIKA;IAeI,YHgDD;IG/CC;IAEE,eH6CH;IG5CG,cH4CH;;;AGrCD;EACE,OHkCD;EGjCC,QHiCD;EGhCC;;AAGF;EACE;EACA;;AAGF;EAEE;EACA;;AASJ;EACE;EAEE;EAGF,OHUC;EGTD,QHSC;EGRD;EACA,ONzEO;;AEUT;EIsDA;IAYI,OHED;IGDC,QHCD;IGAC;;;AAGF;EACE;;AAQA;EACE;;AAKN;EACE;EACA,cHvBC;EGwBD;;AAEA;EACE;;AAEA;EACE,OH/EI;;AGkFN;EACE,OHnFI;;AGyFR;EAEI;;AAMJ;EACE;;;AAMR;EACE;EACA;EACA;EACA;EACA;;ALhIA;EACE;;ACEA;EIwHJ;ILtHI;;;ACFA;EIwHJ;IASI;IACA,YHhEG;IGiEH;;EAEA;IACE;;;;AAMJ;EACE;;AAEA;EACE;;AAGE;EACE,ON9JG;;AMiKL;EACE,ONlKG;;;AM2Kb;EACE;EACA;;ALtKA;EACE;;ACEA;EIiKJ;IL/JI;;;AKoKF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AJlLA;EIiKJ;IAqBI,eHpHG;;;;ADlEH;EI4LJ;IAEI;;;;AAIJ;EACE;EACA,eHnIK;EGoIL;;;AAGF;EACE;;AL5MA;EACE;;ACEA;EIwMJ;ILtMI;;;AK0MF;EACE;;AAGF;EACE;EACA,cHlJG;EGmJH,aHnJG;EGoJH,OHpMU;EGqMV;;AAIA;EACE;;;ACrON;AAAA;EAEE;;ANoEA;AAAA;EACE;EACA,aElEuB;;ADKvB;EKXJ;AAAA;IN4EI;;;;AA5BF;AAAA;AAAA;EACE;;ACtCA;EKJJ;AAAA;AAAA;IN8CI;IACA,aEhDuB;;;;AFgCzB;AAAA;EACE;;AC5BA;EKEJ;AAAA;IN8BI;;;;AMzBJ;AAAA;EAEE;EACA;EACA;;ANdA;AAAA;EACE;;ACEA;EKOJ;AAAA;INLI;;;;AMcJ;EACE;;;ANVA;AAAA;EACE;;ACRA;EKoBJ;AAAA;INRI;;;;AAfF;AAAA;EACE;;ACEA;EKyBJ;AAAA;INvBI;;;;AALF;EACE;;ACEA;EK8BJ;IN5BI;;;;AMgCJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;ACvDF;AAAA;EAEE;EACA;EACA,cLoEK;EKnEL,aLmEK;EKlEL,OLiBM;EKhBN;EACA;EACA,kBL6BS;EK5BT;;APLA;AAAA;EACE;;ACEA;EMRJ;AAAA;IPUI;;;;AOKJ;EACE,kBL4BU;;;AKzBZ;EACE,kBLcW;;;AKXb;EACE,kBL4BQ;;;AKzBV;EACE,OLFY;EKGZ,kBLkBW;;;AMlDb;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,OTRW;ESSX;EACA;EACA;EACA,kBNiBY;EMhBZ;EACA,eNyEc;EMxEd,YACE;EAEF;;AAEA;EACE;EACA;EACA;;AAGF;EAEE;;AAGF;EAEE;;AAGF;EAIE;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;AAKA;EAEE;EACA;EACA;EACA;EACA;;;AAKN;EACE,OTtEW;ESuEX;EACA;;AAEA;EAIE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA,YACE;;AAIJ;EAEE;;;AAIJ;ECnGE,OP0BM;EOzBN;EACA;EACA,YACE;;AAGF;EAEE,OPiBI;EOhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;ADgFJ;ECvGE,OP0BM;EOzBN;EACA;EACA,YACE;;AAGF;EAEE,OPiBI;EOhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;ADoFJ;EC3GE,OP0BM;EOzBN;EACA;EACA,YACE;;AAGF;EAEE,OPiBI;EOhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;ADwFJ;EC/GE,OP0BM;EOzBN;EACA;EACA,YACE;;AAGF;EAEE,OPiBI;EOhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;AD4FJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AE3HF;EACE;EACA;EACA;EACA,QRgFM;EQ/EN,SRuEK;EQtEL;;ATME;ESZJ;IASI;IACA;IACA;IACA;IACA;;;;AAIJ;EACE;EACA;EACA,QR8DK;EQ7DL;EACA,eRmEc;EQlEd,YACE;EAEF;;ATdE;ESKJ;IAYI;IACA;IACA,WRwEmB;IQvEnB;IACA;IACA;IACA;;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA,ORTY;EQUZ,kBRfY;EQgBZ;EACA;EACA;EACA;EACA;;ATvCE;ES2BJ;IAeI;IACA;IACA,kBRxBU;IQyBV;;;AAGF;EACE;EACA;;AAEA;EACE,OX/DO;;;AWoEb;EACE;EACA;EACA;EACA,cRIK;;ADlEH;ES0DJ;IAOI,cRGG;IQFH;;;AAGF;EACE;EACA;EACA;EACA,ORzDU;;;AQ6Dd;EACE;EACA;EACA;EACA;EACA;EACA;EACA,kBRjEY;EQkEZ,4BRRc;EQSd,2BRTc;EQUd,YACE;;ATxFA;ES6EJ;IAeI;IACA,ORFmB;IQGnB;;;;AAIJ;EACE;EACA,eRrCK;EQsCL;;AVpFA;EACE;;AClBA;ESkGJ;IV5EI;;;ACtBA;EDOF;IACE;;;ACRA;ESkGJ;IVtFI;;;;AUiGJ;EACE;EACA;;;AAGF;EACE;EACA;;AAEA;EAEE,kBX3Ha;;;AW+HjB;EACE;EACA,aR9DK;EQ+DL,gBR/DK;;ADhEH;ES4HJ;IAMI;IACA;IACA,eRpEG;IQqEH;;;;AAIJ;EACE;EACA;EACA;;AAEA;EACE;;AVxIF;EACE;;ACRA;ES8IF;IVlIE;;;ACZA;EDHF;IACE;;;ACEA;ES8IF;IV5IE;;;AUqJF;EACE,ORtFG;EQuFH,QRvFG;EQwFH,cR1FG;EQ2FH,OXrKS;EWsKT;;AAGF;EACE;;;AAIJ;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA,ORrJY;EQsJZ;EACA;;AV5LA;EACE;;ACYA;ESyKJ;IVjLI;;;;AU2LJ;EACE;EACA,aRrHK;EQsHL,gBRtHK;EQuHL,cRrHK;EQsHL,aRxHK;EQyHL,ORjKY;EQkKZ;EACA,aR/GO;EQgHP,mBR1KY;;AFrBZ;EACE;;ACEA;ESmLJ;IVjLI;;;ACFA;ESmLJ;IAaI;IACA;IACA,cRlIG;IQmIH;IACA;;;;AAIJ;EACE,YR1IK;;;AQ6IP;EACE;;;AAGF;EACE;;AV1MA;EACE;;ACRA;ESgNJ;IVpMI;;;;AUyMJ;EACE;EACA,ORrJK;EQsJL,QRtJK;EQuJL;EACA,ORnJK;EQoJL,QRpJK;EQqJL,kBRzMY;EQ0MZ;EACA;EACA,YACE;EAEF;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YACE;;;AAMF;EACE;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE,QRxLI;EQyLJ;;ATjQA;ES+PF;IAKI,ORzKiB;IQ0KjB,YACE;;;AAKN;EACE,kBRzPU;;ADnBV;ES2QF;IAII;;;AT/QF;ESmRF;IAEI;;;AAIJ;EACE;;AAGF;EACE;EACA;EACA;EACA,YACE;;ATlSF;ESwSA;IACE;IACA;IACA;;;AAIJ;EACE,aRxOI;;ADxEJ;ES+SF;IAII;;;;AC9TN;EACE;EACA;EACA;EACA,eT0EK;ESzEL;EACA,eTkFc;ESjFd,YACE;;;AAIJ;EACE;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA,kBTQY;ESPZ;EACA;;AXNA;AAAA;EACE;;ACRA;EUOJ;AAAA;IXKI;;;AWKF;AAAA;EACE;;;AAOE;AAAA;EAEE;;AAGF;EACE,gBTkCD;;;AS3BL;EACE;;;AC9CF;EACE;EACA;EACA,kBbDoB;EaEpB;EACA,eV+EY;;;AU1EhB;EACE,cVcY;;;AUqCd;AAAA;AAAA;EAGE;EACA,eVMK;EULL,kBbjEsB;EakEtB,eVgBc;EUfd;EACA;EACA;EACA;;AAIA;AAAA;AAAA;EACE,OVLG;EUMH;EACA;EACA;EACA;EACA,SVVG;EUWH;EACA;EACA,OVtDU;EUuDV;;AAEA;AAAA;AAAA;EACE,MV1DQ;;AU6DV;AAAA;AAAA;EACE;EACA;EACA;;AAGF;AAAA;AAAA;EACE;EACA;;AAMF;AAAA;AAAA;EACE;EACA;;;AASJ;EACE;EACA,SV/CG;EUgDH;EACA;EACA,eVtCY;;AUyCd;AAAA;EAEE;EACA;EACA;;;AAUJ;EACE;EACA,eVrEK;;AU6CL;EACE;EACA,SV/CG;EUgDH;EACA;EACA,eVtCY;;AUyCd;AAAA;EAEE;EACA;EACA;;;AAwBF;AAAA;EAEE;EACA,SVpFG;EUqFH;EACA;EACA,eV3EY;;;AUmFhB;EACE;EACA;EACA;EACA;;AAEA;AAAA;EAEE;EACA;EACA,kBb/KoB;EagLpB;;AZ9KF;AAAA;EACE;;ACEA;EWsKF;AAAA;IZpKE;;;AY8KF;EACE;EACA,eVjHG;EUkHH,cVlHG;;AUqHL;EACE;EACA;;;AAKJ;AAAA;EAEE,SV9HK;EU+HL,eV/HK;EUgIL;EACA;EACA,eVtHc;;AUwHd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAIE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAKJ;EACE;EACA;EACA;;;AAIF;AAAA;EAEE,YblOsB;EaqOpB,ObpOoB;;;Aa2OxB;EACE,Yb7OsB;;;AcLxB;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;ACvOF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AbrBE;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;AAQR;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AdhHA;EACE;;ACYA;EcZJ;IfII;;;;AAKF;EACE;;ACEA;EcRJ;IfUI;;;;AAKF;EACE;;ACRA;EcJJ;IfgBI;;;;AAKF;EACE;;AClBA;EcAJ;IfsBI;;;;AAKF;EACE;;AC5BA;EcIJ;If4BI;;;;AAKF;EACE;;ACtCA;EcQJ;IfkCI;IACA,aEhDuB;;;;AFqDzB;EACE;EACA,aEvDuB;;ADKvB;EcYJ;If0CI;;;;AAKF;EACE;EACA,aElEuB;;ADKvB;EcgBJ;IfiDI;;;;AAKF;EACE;EACA,aE7EuB;;ADKvB;EcoBJ;IfwDI;;;;AAKF;EACE;EACA,aExFuB;;ADKvB;EcwBJ;If+DI;;;;Ae3DJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE,abxDiB;;;Aa2DnB;EACE,ab1DyB;;;Aa6D3B;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AC/EF;EACE;EACA;EACA;;AAGE;EACE;;;ACLN;EACE;EACA;;;AAQA;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AhBlCA;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAaN;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AhB7GA;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AC3JR;EACE;AAAA;AAAA;AAAA;AAAA;AAAA;IAME;;EAGF;IACE;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;IACA;;;ACvCJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE,OpBXW;EoBYX,kBjBkBY;EiBjBZ;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ACpBF;EACE,kBlByBY;;;AkBtBd;EACI;EACA;EACA,elB4EY;EkB3EZ;EACA;;AAEA;EACI,OlB8BI;EkB7BJ;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OlBoBM;EkBnBN;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,elBiDY;EkBhDZ;EACA;;AACA;EACE;EACA;EACA,OlBEM;EkBDN;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAMJ;EACI;EACA;EACA,elBGY;EkBFZ;EACA;;AAEA;EACI,OlB/CG;EkBgDH;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OlBzDK;EkB0DL;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,elBxBY;EkByBZ;EACA;;AACA;EACE;EACA;EACA,OlB3EK;EkB4EL;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAMJ;EACI;EACA;EACA,elBtEY;EkBuEZ;EACA;;AAEA;EACI,OlBhHK;EkBiHL;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OlB1HO;EkB2HP;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,elBjGY;EkBkGZ;EACA;;AACA;EACE;EACA;EACA,OlB5IO;EkB6IP;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE","sourcesContent":["/*\ngenerated by accessible-pygments \nCopyright (c) 2022, Quansight Labs\nLicensed under the BSD license, see LICENSE for details.\n--\ngenerated by Pygments \nCopyright 2006-2025 by the Pygments team.\nLicensed under the BSD license, see LICENSE for details.\n*/\n\n.highlight .hll { background-color: #0969da4a }\n.highlight .c { color: #6E7781 } /* Comment */\n.highlight .err { color: #CF222E } /* Error */\n.highlight .k { color: #CF222E } /* Keyword */\n.highlight .l { color: #953800 } /* Literal */\n.highlight .n { color: #8250DF } /* Name */\n.highlight .o { color: #116329 } /* Operator */\n.highlight .p { color: #24292F } /* Punctuation */\n.highlight .ch { color: #6E7781 } /* Comment.Hashbang */\n.highlight .cm { color: #6E7781 } /* Comment.Multiline */\n.highlight .cp { color: #6E7781 } /* Comment.Preproc */\n.highlight .cpf { color: #6E7781 } /* Comment.PreprocFile */\n.highlight .c1 { color: #6E7781 } /* Comment.Single */\n.highlight .cs { color: #6E7781 } /* Comment.Special */\n.highlight .gd { color: #0550AE } /* Generic.Deleted */\n.highlight .ge { font-style: italic } /* Generic.Emph */\n.highlight .gr { color: #CF222E } /* Generic.Error */\n.highlight .gh { color: #0550AE } /* Generic.Heading */\n.highlight .gs { font-weight: bold } /* Generic.Strong */\n.highlight .gu { color: #0550AE } /* Generic.Subheading */\n.highlight .kc { color: #0550AE } /* Keyword.Constant */\n.highlight .kd { color: #CF222E } /* Keyword.Declaration */\n.highlight .kn { color: #CF222E } /* Keyword.Namespace */\n.highlight .kp { color: #CF222E } /* Keyword.Pseudo */\n.highlight .kr { color: #CF222E } /* Keyword.Reserved */\n.highlight .kt { color: #CF222E } /* Keyword.Type */\n.highlight .ld { color: #953800 } /* Literal.Date */\n.highlight .m { color: #953800 } /* Literal.Number */\n.highlight .s { color: #0550AE } /* Literal.String */\n.highlight .na { color: #953800 } /* Name.Attribute */\n.highlight .nb { color: #953800 } /* Name.Builtin */\n.highlight .nc { color: #0550AE } /* Name.Class */\n.highlight .no { color: #0550AE } /* Name.Constant */\n.highlight .nd { color: #953800 } /* Name.Decorator */\n.highlight .ni { color: #116329 } /* Name.Entity */\n.highlight .ne { color: #8250DF } /* Name.Exception */\n.highlight .nf { color: #0550AE } /* Name.Function */\n.highlight .nl { color: #953800 } /* Name.Label */\n.highlight .nn { color: #24292F } /* Name.Namespace */\n.highlight .nx { color: #8250DF } /* Name.Other */\n.highlight .py { color: #0550AE } /* Name.Property */\n.highlight .nt { color: #116329 } /* Name.Tag */\n.highlight .nv { color: #953800 } /* Name.Variable */\n.highlight .ow { color: #8250DF } /* Operator.Word */\n.highlight .pm { color: #24292F } /* Punctuation.Marker */\n.highlight .w { color: #24292F } /* Text.Whitespace */\n.highlight .mb { color: #953800 } /* Literal.Number.Bin */\n.highlight .mf { color: #953800 } /* Literal.Number.Float */\n.highlight .mh { color: #953800 } /* Literal.Number.Hex */\n.highlight .mi { color: #953800 } /* Literal.Number.Integer */\n.highlight .mo { color: #953800 } /* Literal.Number.Oct */\n.highlight .sa { color: #0550AE } /* Literal.String.Affix */\n.highlight .sb { color: #0550AE } /* Literal.String.Backtick */\n.highlight .sc { color: #0550AE } /* Literal.String.Char */\n.highlight .dl { color: #0550AE } /* Literal.String.Delimiter */\n.highlight .sd { color: #0550AE } /* Literal.String.Doc */\n.highlight .s2 { color: #0550AE } /* Literal.String.Double */\n.highlight .se { color: #0550AE } /* Literal.String.Escape */\n.highlight .sh { color: #0550AE } /* Literal.String.Heredoc */\n.highlight .si { color: #0550AE } /* Literal.String.Interpol */\n.highlight .sx { color: #0550AE } /* Literal.String.Other */\n.highlight .sr { color: #0550AE } /* Literal.String.Regex */\n.highlight .s1 { color: #0550AE } /* Literal.String.Single */\n.highlight .ss { color: #0550AE } /* Literal.String.Symbol */\n.highlight .bp { color: #953800 } /* Name.Builtin.Pseudo */\n.highlight .fm { color: #0550AE } /* Name.Function.Magic */\n.highlight .vc { color: #953800 } /* Name.Variable.Class */\n.highlight .vg { color: #953800 } /* Name.Variable.Global */\n.highlight .vi { color: #953800 } /* Name.Variable.Instance */\n.highlight .vm { color: #953800 } /* Name.Variable.Magic */\n.highlight .il { color: #953800 } /* Literal.Number.Integer.Long */\n","/*\ngenerated by accessible-pygments \nCopyright (c) 2022, Quansight Labs\nLicensed under the BSD license, see LICENSE for details.\n--\ngenerated by Pygments \nCopyright 2006-2025 by the Pygments team.\nLicensed under the BSD license, see LICENSE for details.\n*/\n\n.highlight .hll { background-color: #6e7681 }\n.highlight { background: #0d1117; color: #E6EDF3 }\n.highlight .c { color: #8B949E; font-style: italic } /* Comment */\n.highlight .err { color: #F85149 } /* Error */\n.highlight .esc { color: #E6EDF3 } /* Escape */\n.highlight .g { color: #E6EDF3 } /* Generic */\n.highlight .k { color: #FF7B72 } /* Keyword */\n.highlight .l { color: #A5D6FF } /* Literal */\n.highlight .n { color: #E6EDF3 } /* Name */\n.highlight .o { color: #FF7B72; font-weight: bold } /* Operator */\n.highlight .x { color: #E6EDF3 } /* Other */\n.highlight .p { color: #E6EDF3 } /* Punctuation */\n.highlight .ch { color: #8B949E; font-style: italic } /* Comment.Hashbang */\n.highlight .cm { color: #8B949E; font-style: italic } /* Comment.Multiline */\n.highlight .cp { color: #8B949E; font-weight: bold; font-style: italic } /* Comment.Preproc */\n.highlight .cpf { color: #8B949E; font-style: italic } /* Comment.PreprocFile */\n.highlight .c1 { color: #8B949E; font-style: italic } /* Comment.Single */\n.highlight .cs { color: #8B949E; font-weight: bold; font-style: italic } /* Comment.Special */\n.highlight .gd { color: #FFA198; background-color: #490202 } /* Generic.Deleted */\n.highlight .ge { color: #E6EDF3; font-style: italic } /* Generic.Emph */\n.highlight .ges { color: #E6EDF3; font-weight: bold; font-style: italic } /* Generic.EmphStrong */\n.highlight .gr { color: #FFA198 } /* Generic.Error */\n.highlight .gh { color: #79C0FF; font-weight: bold } /* Generic.Heading */\n.highlight .gi { color: #56D364; background-color: #0F5323 } /* Generic.Inserted */\n.highlight .go { color: #8B949E } /* Generic.Output */\n.highlight .gp { color: #8B949E } /* Generic.Prompt */\n.highlight .gs { color: #E6EDF3; font-weight: bold } /* Generic.Strong */\n.highlight .gu { color: #79C0FF } /* Generic.Subheading */\n.highlight .gt { color: #FF7B72 } /* Generic.Traceback */\n.highlight .g-Underline { color: #E6EDF3; text-decoration: underline } /* Generic.Underline */\n.highlight .kc { color: #79C0FF } /* Keyword.Constant */\n.highlight .kd { color: #FF7B72 } /* Keyword.Declaration */\n.highlight .kn { color: #FF7B72 } /* Keyword.Namespace */\n.highlight .kp { color: #79C0FF } /* Keyword.Pseudo */\n.highlight .kr { color: #FF7B72 } /* Keyword.Reserved */\n.highlight .kt { color: #FF7B72 } /* Keyword.Type */\n.highlight .ld { color: #79C0FF } /* Literal.Date */\n.highlight .m { color: #A5D6FF } /* Literal.Number */\n.highlight .s { color: #A5D6FF } /* Literal.String */\n.highlight .na { color: #E6EDF3 } /* Name.Attribute */\n.highlight .nb { color: #E6EDF3 } /* Name.Builtin */\n.highlight .nc { color: #F0883E; font-weight: bold } /* Name.Class */\n.highlight .no { color: #79C0FF; font-weight: bold } /* Name.Constant */\n.highlight .nd { color: #D2A8FF; font-weight: bold } /* Name.Decorator */\n.highlight .ni { color: #FFA657 } /* Name.Entity */\n.highlight .ne { color: #F0883E; font-weight: bold } /* Name.Exception */\n.highlight .nf { color: #D2A8FF; font-weight: bold } /* Name.Function */\n.highlight .nl { color: #79C0FF; font-weight: bold } /* Name.Label */\n.highlight .nn { color: #FF7B72 } /* Name.Namespace */\n.highlight .nx { color: #E6EDF3 } /* Name.Other */\n.highlight .py { color: #79C0FF } /* Name.Property */\n.highlight .nt { color: #7EE787 } /* Name.Tag */\n.highlight .nv { color: #79C0FF } /* Name.Variable */\n.highlight .ow { color: #FF7B72; font-weight: bold } /* Operator.Word */\n.highlight .pm { color: #E6EDF3 } /* Punctuation.Marker */\n.highlight .w { color: #6E7681 } /* Text.Whitespace */\n.highlight .mb { color: #A5D6FF } /* Literal.Number.Bin */\n.highlight .mf { color: #A5D6FF } /* Literal.Number.Float */\n.highlight .mh { color: #A5D6FF } /* Literal.Number.Hex */\n.highlight .mi { color: #A5D6FF } /* Literal.Number.Integer */\n.highlight .mo { color: #A5D6FF } /* Literal.Number.Oct */\n.highlight .sa { color: #79C0FF } /* Literal.String.Affix */\n.highlight .sb { color: #A5D6FF } /* Literal.String.Backtick */\n.highlight .sc { color: #A5D6FF } /* Literal.String.Char */\n.highlight .dl { color: #79C0FF } /* Literal.String.Delimiter */\n.highlight .sd { color: #A5D6FF } /* Literal.String.Doc */\n.highlight .s2 { color: #A5D6FF } /* Literal.String.Double */\n.highlight .se { color: #79C0FF } /* Literal.String.Escape */\n.highlight .sh { color: #79C0FF } /* Literal.String.Heredoc */\n.highlight .si { color: #A5D6FF } /* Literal.String.Interpol */\n.highlight .sx { color: #A5D6FF } /* Literal.String.Other */\n.highlight .sr { color: #79C0FF } /* Literal.String.Regex */\n.highlight .s1 { color: #A5D6FF } /* Literal.String.Single */\n.highlight .ss { color: #A5D6FF } /* Literal.String.Symbol */\n.highlight .bp { color: #E6EDF3 } /* Name.Builtin.Pseudo */\n.highlight .fm { color: #D2A8FF; font-weight: bold } /* Name.Function.Magic */\n.highlight .vc { color: #79C0FF } /* Name.Variable.Class */\n.highlight .vg { color: #79C0FF } /* Name.Variable.Global */\n.highlight .vi { color: #79C0FF } /* Name.Variable.Instance */\n.highlight .vm { color: #79C0FF } /* Name.Variable.Magic */\n.highlight .il { color: #A5D6FF } /* Literal.Number.Integer.Long */\n","/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */\n\n/* Document\n ========================================================================== */\n\n/**\n * 1. Correct the line height in all browsers.\n * 2. Prevent adjustments of font size after orientation changes in iOS.\n */\n\nhtml {\n line-height: 1.15; /* 1 */\n text-size-adjust: 100%; /* 2 */\n}\n\n/* Sections\n ========================================================================== */\n\n/**\n * Remove the margin in all browsers.\n */\n\nbody {\n margin: 0;\n}\n\n/**\n * Render the `main` element consistently in IE.\n */\n\nmain {\n display: block;\n}\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n/* Grouping content\n ========================================================================== */\n\n/**\n * 1. Add the correct box sizing in Firefox.\n * 2. Show the overflow in Edge and IE.\n */\n\nhr {\n box-sizing: content-box; /* 1 */\n height: 0; /* 1 */\n overflow: visible; /* 2 */\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\npre {\n font-family: monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/* Text-level semantics\n ========================================================================== */\n\n/**\n * Remove the gray background on active links in IE 10.\n */\n\na {\n background-color: transparent;\n}\n\n/**\n * 1. Remove the bottom border in Chrome 57-\n * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n */\n\nabbr[title] {\n border-bottom: none; /* 1 */\n text-decoration: underline; /* 2 */\n text-decoration: underline dotted; /* 2 */\n}\n\n/**\n * Add the correct font weight in Chrome, Edge, and Safari.\n */\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\ncode,\nkbd,\nsamp {\n font-family: monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/**\n * Add the correct font size in all browsers.\n */\n\nsmall {\n font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` elements from affecting the line height in\n * all browsers.\n */\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/* Embedded content\n ========================================================================== */\n\n/**\n * Remove the border on images inside links in IE 10.\n */\n\nimg {\n border-style: none;\n}\n\n/* Forms\n ========================================================================== */\n\n/**\n * 1. Change the font styles in all browsers.\n * 2. Remove the margin in Firefox and Safari.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-size: 100%; /* 1 */\n line-height: 1.15; /* 1 */\n margin: 0; /* 2 */\n}\n\n/**\n * Show the overflow in IE.\n * 1. Show the overflow in Edge.\n */\n\nbutton,\ninput {\n /* 1 */\n overflow: visible;\n}\n\n/**\n * Remove the inheritance of text transform in Edge, Firefox, and IE.\n * 1. Remove the inheritance of text transform in Firefox.\n */\n\nbutton,\nselect {\n /* 1 */\n text-transform: none;\n}\n\n/**\n * Correct the inability to style clickable types in iOS and Safari.\n */\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n appearance: button;\n}\n\n/**\n * Remove the inner border and padding in Firefox.\n */\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n border-style: none;\n padding: 0;\n}\n\n/**\n * Restore the focus styles unset by the previous rule.\n */\n\nbutton:-moz-focusring,\n[type=\"button\"]:-moz-focusring,\n[type=\"reset\"]:-moz-focusring,\n[type=\"submit\"]:-moz-focusring {\n outline: 1px dotted ButtonText;\n}\n\n/**\n * Correct the padding in Firefox.\n */\n\nfieldset {\n padding: 0.35em 0.75em 0.625em;\n}\n\n/**\n * 1. Correct the text wrapping in Edge and IE.\n * 2. Correct the color inheritance from `fieldset` elements in IE.\n * 3. Remove the padding so developers are not caught out when they zero out\n * `fieldset` elements in all browsers.\n */\n\nlegend {\n box-sizing: border-box; /* 1 */\n color: inherit; /* 2 */\n display: table; /* 1 */\n max-width: 100%; /* 1 */\n padding: 0; /* 3 */\n white-space: normal; /* 1 */\n}\n\n/**\n * Add the correct vertical alignment in Chrome, Firefox, and Opera.\n */\n\nprogress {\n vertical-align: baseline;\n}\n\n/**\n * Remove the default vertical scrollbar in IE 10+.\n */\n\ntextarea {\n overflow: auto;\n}\n\n/**\n * 1. Add the correct box sizing in IE 10.\n * 2. Remove the padding in IE 10.\n */\n\n[type=\"checkbox\"],\n[type=\"radio\"] {\n box-sizing: border-box; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Correct the cursor style of increment and decrement buttons in Chrome.\n */\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n/**\n * 1. Correct the odd appearance in Chrome and Safari.\n * 2. Correct the outline style in Safari.\n */\n\n[type=\"search\"] {\n appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/**\n * Remove the inner padding in Chrome and Safari on macOS.\n */\n\n[type=\"search\"]::-webkit-search-decoration {\n appearance: none;\n}\n\n/**\n * 1. Correct the inability to style clickable types in iOS and Safari.\n * 2. Change font properties to `inherit` in Safari.\n */\n\n::-webkit-file-upload-button {\n appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/* Interactive\n ========================================================================== */\n\n/*\n * Add the correct display in Edge, IE 10+, and Firefox.\n */\n\ndetails {\n display: block;\n}\n\n/*\n * Add the correct display in all browsers.\n */\n\nsummary {\n display: list-item;\n}\n\n/* Misc\n ========================================================================== */\n\n/**\n * Add the correct display in IE 10+.\n */\n\ntemplate {\n display: none;\n}\n\n/**\n * Add the correct display in IE 10.\n */\n\n[hidden] {\n display: none;\n}\n","// Base element style overrides\n// stylelint-disable selector-no-type, selector-max-type, selector-max-specificity, selector-max-id\n\n:root {\n color-scheme: $color-scheme;\n}\n\n* {\n box-sizing: border-box;\n}\n\nhtml {\n scroll-behavior: smooth;\n\n @include fs-4;\n}\n\nbody {\n font-family: $body-font-family;\n font-size: inherit;\n line-height: $body-line-height;\n color: $body-text-color;\n background-color: $body-background-color;\n overflow-wrap: break-word;\n}\n\nol,\nul,\ndl,\npre,\naddress,\nblockquote,\ntable,\ndiv,\nhr,\nform,\nfieldset,\nnoscript .table-wrapper {\n margin-top: 0;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n#toctitle {\n margin-top: 0;\n margin-bottom: 1em;\n font-weight: 500;\n line-height: $body-heading-line-height;\n color: $body-heading-color;\n}\n\np {\n margin-top: 1em;\n margin-bottom: 1em;\n}\n\na {\n color: $link-color;\n text-decoration: none;\n}\n\na:not([class]) {\n text-decoration: underline;\n text-decoration-color: $border-color;\n text-underline-offset: 2px;\n\n &:hover {\n text-decoration-color: rgba($link-color, 0.45);\n }\n}\n\ncode {\n font-family: $mono-font-family;\n font-size: 0.75em;\n line-height: $body-line-height;\n}\n\nfigure,\npre {\n margin: 0;\n}\n\nli {\n margin: 0.25em 0;\n}\n\nimg {\n max-width: 100%;\n height: auto;\n}\n\nhr {\n height: 1px;\n padding: 0;\n margin: $sp-6 0;\n background-color: $border-color;\n border: 0;\n}\n\n// adds a GitHub-style sidebar to blockquotes\nblockquote {\n margin: 10px 0;\n\n // resets user-agent stylesheets for blockquotes\n margin-block-start: 0;\n margin-inline-start: 0;\n padding-left: 1rem;\n border-left: 3px solid $border-color;\n}\n","$color-scheme: dark;\n$body-background-color: $grey-dk-300;\n$body-heading-color: $grey-lt-000;\n$body-text-color: $grey-lt-300;\n$link-color: lighten($blue-000, 10%);\n$nav-child-link-color: $grey-dk-000;\n$sidebar-color: $grey-dk-300;\n$base-button-color: $grey-dk-250;\n$btn-primary-color: $blue-200;\n$code-background-color: #0d1117; // github-dark bg color\n$code-linenumber-color: #e6edf3; // github-dark line number color\n$feedback-color: darken($sidebar-color, 3%);\n$table-background-color: $grey-dk-250;\n$search-background-color: $grey-dk-250;\n$search-result-preview-color: $grey-lt-300;\n$border-color: $grey-dk-200;\n\n@import \"./vendor/accessible-pygments/github-dark\";\n","@mixin fs-1 {\n & {\n font-size: $font-size-1 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-1-sm !important;\n }\n}\n\n@mixin fs-2 {\n & {\n font-size: $font-size-2 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-3 !important;\n }\n}\n\n@mixin fs-3 {\n & {\n font-size: $font-size-3 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-4 !important;\n }\n}\n\n@mixin fs-4 {\n & {\n font-size: $font-size-4 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-5 !important;\n }\n}\n\n@mixin fs-5 {\n & {\n font-size: $font-size-5 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-6 !important;\n }\n}\n\n@mixin fs-6 {\n & {\n font-size: $font-size-6 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-7 !important;\n line-height: $body-heading-line-height;\n }\n}\n\n@mixin fs-7 {\n & {\n font-size: $font-size-7 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-8 !important;\n }\n}\n\n@mixin fs-8 {\n & {\n font-size: $font-size-8 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-9 !important;\n }\n}\n\n@mixin fs-9 {\n & {\n font-size: $font-size-9 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-10 !important;\n }\n}\n\n@mixin fs-10 {\n & {\n font-size: $font-size-10 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-10-sm !important;\n }\n}\n","// Media query\n\n// Media query mixin\n// Usage:\n// @include mq(md) {\n// ..medium and up styles\n// }\n@mixin mq($name) {\n // Retrieves the value from the key\n $value: map-get($media-queries, $name);\n\n // If the key exists in the map\n @if $value {\n // Prints a media query based on the value\n @media (min-width: $value) {\n @content;\n }\n } @else {\n @warn \"No value could be retrieved from `#{$media-query}`. Please make sure it is defined in `$media-queries` map.\";\n }\n}\n\n// Responsive container\n\n@mixin container {\n padding-right: $gutter-spacing-sm;\n padding-left: $gutter-spacing-sm;\n\n @include mq(md) {\n padding-right: $gutter-spacing;\n padding-left: $gutter-spacing;\n }\n}\n","// Typography\n\n// prettier-ignore\n$body-font-family: system-ui, -apple-system, blinkmacsystemfont, \"Segoe UI\",\n roboto, \"Helvetica Neue\", arial, sans-serif, \"Segoe UI Emoji\" !default;\n$mono-font-family: \"SFMono-Regular\", menlo, consolas, monospace !default;\n$root-font-size: 16px !default; // DEPRECATED: previously base font-size for rems\n$body-line-height: 1.4 !default;\n$content-line-height: 1.6 !default;\n$body-heading-line-height: 1.25 !default;\n\n// Font size\n// `-sm` suffix is the size at the small (and above) media query\n\n$font-size-1: 0.5625rem !default;\n$font-size-1-sm: 0.625rem !default;\n$font-size-2: 0.6875rem !default; // h4 - uppercased!, h6 not uppercased, text-small\n$font-size-3: 0.75rem !default; // h5\n$font-size-4: 0.875rem !default;\n$font-size-5: 1rem !default; // h3\n$font-size-6: 1.125rem !default; // h2\n$font-size-7: 1.5rem !default;\n$font-size-8: 2rem !default; // h1\n$font-size-9: 2.25rem !default;\n$font-size-10: 2.625rem !default;\n$font-size-10-sm: 3rem !default;\n\n// Colors\n\n$white: #fff !default;\n$grey-dk-000: #959396 !default;\n$grey-dk-100: #5c5962 !default;\n$grey-dk-200: #44434d !default;\n$grey-dk-250: #302d36 !default;\n$grey-dk-300: #27262b !default;\n$grey-lt-000: #f5f6fa !default;\n$grey-lt-100: #eeebee !default;\n$grey-lt-200: #ecebed !default;\n$grey-lt-300: #e6e1e8 !default;\n$purple-000: #7253ed !default;\n$purple-100: #5e41d0 !default;\n$purple-200: #4e26af !default;\n$purple-300: #381885 !default;\n$blue-000: #2c84fa !default;\n$blue-100: #2869e6 !default;\n$blue-200: #264caf !default;\n$blue-300: #183385 !default;\n$green-000: #41d693 !default;\n$green-100: #11b584 !default;\n$green-200: #009c7b !default;\n$green-300: #026e57 !default;\n$yellow-000: #ffeb82 !default;\n$yellow-100: #fadf50 !default;\n$yellow-200: #f7d12e !default;\n$yellow-300: #e7af06 !default;\n$red-000: #f77e7e !default;\n$red-100: #f96e65 !default;\n$red-200: #e94c4c !default;\n$red-300: #dd2e2e !default;\n\n// Spacing\n\n$spacing-unit: 1rem; // 1rem == 16px\n\n$spacers: (\n sp-0: 0,\n sp-1: $spacing-unit * 0.25,\n sp-2: $spacing-unit * 0.5,\n sp-3: $spacing-unit * 0.75,\n sp-4: $spacing-unit,\n sp-5: $spacing-unit * 1.5,\n sp-6: $spacing-unit * 2,\n sp-7: $spacing-unit * 2.5,\n sp-8: $spacing-unit * 3,\n sp-9: $spacing-unit * 3.5,\n sp-10: $spacing-unit * 4,\n) !default;\n$sp-1: map-get($spacers, sp-1) !default; // 0.25 rem == 4px\n$sp-2: map-get($spacers, sp-2) !default; // 0.5 rem == 8px\n$sp-3: map-get($spacers, sp-3) !default; // 0.75 rem == 12px\n$sp-4: map-get($spacers, sp-4) !default; // 1 rem == 16px\n$sp-5: map-get($spacers, sp-5) !default; // 1.5 rem == 24px\n$sp-6: map-get($spacers, sp-6) !default; // 2 rem == 32px\n$sp-7: map-get($spacers, sp-7) !default; // 2.5 rem == 40px\n$sp-8: map-get($spacers, sp-8) !default; // 3 rem == 48px\n$sp-9: map-get($spacers, sp-9) !default; // 3.5 rem == 56px\n$sp-10: map-get($spacers, sp-10) !default; // 4 rem == 64px\n\n// Borders\n\n$border: 1px solid !default;\n$border-radius: 4px !default;\n$border-color: $grey-lt-100 !default;\n\n// Grid system\n\n$gutter-spacing: $sp-6 !default;\n$gutter-spacing-sm: $sp-4 !default;\n$nav-width: 16.5rem !default;\n$nav-width-md: 15.5rem !default;\n$nav-list-item-height: $sp-6 !default;\n$nav-list-item-height-sm: $sp-8 !default;\n$nav-list-expander-right: true;\n$content-width: 50rem !default;\n$header-height: 3.75rem !default;\n$search-results-width: $content-width - $nav-width !default;\n$transition-duration: 400ms;\n\n// Media queries in pixels\n\n$media-queries: (\n xs: 20rem,\n sm: 31.25rem,\n md: $content-width,\n lg: $content-width + $nav-width,\n xl: 87.5rem,\n) !default;\n","// The basic two column layout\n\n.side-bar {\n z-index: 0;\n display: flex;\n flex-wrap: wrap;\n background-color: $sidebar-color;\n\n @include mq(md) {\n flex-flow: column nowrap;\n position: fixed;\n width: $nav-width-md;\n height: 100%;\n border-right: $border $border-color;\n align-items: flex-end;\n }\n\n @include mq(lg) {\n width: calc((100% - #{$nav-width + $content-width}) / 2 + #{$nav-width});\n min-width: $nav-width;\n }\n\n & + .main {\n @include mq(md) {\n margin-left: $nav-width-md;\n }\n\n @include mq(lg) {\n // stylelint-disable function-name-case\n // disable for Max(), we want to use the CSS max() function\n margin-left: Max(\n #{$nav-width},\n calc((100% - #{$nav-width + $content-width}) / 2 + #{$nav-width})\n );\n // stylelint-enable function-name-case\n }\n\n .main-header {\n display: none;\n background-color: $sidebar-color;\n\n @include mq(md) {\n display: flex;\n background-color: $body-background-color;\n }\n\n &.nav-open {\n display: block;\n\n @include mq(md) {\n display: flex;\n }\n }\n }\n }\n}\n\n.main {\n margin: auto;\n\n @include mq(md) {\n position: relative;\n max-width: $content-width;\n }\n}\n\n.main-content-wrap {\n padding-top: $gutter-spacing-sm;\n padding-bottom: $gutter-spacing-sm;\n\n @include container;\n\n @include mq(md) {\n padding-top: $gutter-spacing;\n padding-bottom: $gutter-spacing;\n }\n}\n\n.main-header {\n z-index: 0;\n border-bottom: $border $border-color;\n\n @include mq(md) {\n display: flex;\n justify-content: space-between;\n height: $header-height;\n }\n}\n\n.site-nav,\n.site-header,\n.site-footer {\n width: 100%;\n\n @include mq(lg) {\n width: $nav-width;\n }\n}\n\n.site-nav {\n display: none;\n\n &.nav-open {\n display: block;\n }\n\n @include mq(md) {\n display: block;\n padding-top: $sp-8;\n padding-bottom: $gutter-spacing-sm;\n overflow-y: auto;\n flex: 1 1 auto;\n }\n}\n\n.site-header {\n display: flex;\n min-height: $header-height;\n align-items: center;\n\n @include mq(md) {\n height: $header-height;\n max-height: $header-height;\n border-bottom: $border $border-color;\n }\n}\n\n.site-title {\n flex-grow: 1;\n display: flex;\n height: 100%;\n align-items: center;\n padding-top: $sp-3;\n padding-bottom: $sp-3;\n color: $body-heading-color;\n\n @include container;\n\n @include fs-6;\n\n @include mq(md) {\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n }\n}\n\n@if variable-exists(logo) {\n .site-logo {\n width: 100%;\n height: 100%;\n background-image: url($logo);\n background-repeat: no-repeat;\n background-position: left center;\n background-size: contain;\n }\n}\n\n.site-button {\n display: flex;\n height: 100%;\n padding: $gutter-spacing-sm;\n align-items: center;\n}\n\n@include mq(md) {\n .site-header .site-button {\n display: none;\n }\n}\n\n.site-title:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 80%,\n rgba($feedback-color, 0) 100%\n );\n}\n\n.site-button:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 100%\n );\n}\n\n.site-footer {\n position: absolute;\n bottom: 0;\n left: 0;\n padding-top: $sp-4;\n padding-bottom: $sp-4;\n\n @include container;\n\n @include fs-2;\n\n @include mq(md) {\n position: static;\n justify-self: end;\n }\n}\n\n.icon {\n width: $sp-5;\n height: $sp-5;\n color: $link-color;\n}\n","@charset \"UTF-8\";\n\n// Styles for rendered markdown in the .main-content container\n// stylelint-disable selector-no-type, max-nesting-depth, selector-max-compound-selectors, selector-max-type, selector-max-specificity, selector-max-id\n\n.main-content {\n line-height: $content-line-height;\n\n ol,\n ul,\n dl,\n pre,\n address,\n blockquote,\n .table-wrapper {\n margin-top: 0.5em;\n }\n\n a {\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n ul,\n ol {\n padding-left: 1.5em;\n }\n\n li {\n .highlight {\n margin-top: $sp-1;\n }\n }\n\n ol {\n list-style-type: none;\n counter-reset: step-counter;\n\n > li {\n position: relative;\n\n &::before {\n position: absolute;\n top: 0.2em;\n left: -1.6em;\n color: $grey-dk-000;\n content: counter(step-counter);\n counter-increment: step-counter;\n @include fs-3;\n\n @include mq(sm) {\n top: 0.11em;\n }\n }\n\n ol {\n counter-reset: sub-counter;\n\n > li {\n &::before {\n content: counter(sub-counter, lower-alpha);\n counter-increment: sub-counter;\n }\n }\n }\n }\n }\n\n ul {\n list-style: none;\n\n > li {\n &::before {\n position: absolute;\n margin-left: -1.4em;\n color: $grey-dk-000;\n content: \"•\";\n }\n }\n }\n\n .task-list-item {\n &::before {\n content: \"\";\n }\n }\n\n .task-list-item-checkbox {\n margin-right: 0.6em;\n margin-left: -1.4em;\n\n // The same margin-left is used above for ul > li::before\n }\n\n hr + * {\n margin-top: 0;\n }\n\n h1:first-of-type {\n margin-top: 0.5em;\n }\n\n dl {\n display: grid;\n grid-template: auto / 10em 1fr;\n }\n\n dt,\n dd {\n margin: 0.25em 0;\n }\n\n dt {\n grid-column: 1;\n font-weight: 500;\n text-align: right;\n\n &::after {\n content: \":\";\n }\n }\n\n dd {\n grid-column: 2;\n margin-bottom: 0;\n margin-left: 1em;\n\n blockquote,\n div,\n dl,\n dt,\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n li,\n ol,\n p,\n pre,\n table,\n ul,\n .table-wrapper {\n &:first-child {\n margin-top: 0;\n }\n }\n }\n\n dd,\n ol,\n ul {\n dl:first-child {\n dt:first-child,\n dd:nth-child(2) {\n margin-top: 0;\n }\n }\n }\n\n .anchor-heading {\n position: absolute;\n right: -$sp-4;\n width: $sp-5;\n height: 100%;\n padding-right: $sp-1;\n padding-left: $sp-1;\n overflow: visible;\n\n @include mq(md) {\n right: auto;\n left: -$sp-5;\n }\n\n svg {\n display: inline-block;\n width: 100%;\n height: 100%;\n color: $link-color;\n visibility: hidden;\n }\n }\n\n .anchor-heading:hover,\n .anchor-heading:focus,\n h1:hover > .anchor-heading,\n h2:hover > .anchor-heading,\n h3:hover > .anchor-heading,\n h4:hover > .anchor-heading,\n h5:hover > .anchor-heading,\n h6:hover > .anchor-heading {\n svg {\n visibility: visible;\n }\n }\n\n summary {\n cursor: pointer;\n }\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n #toctitle {\n position: relative;\n margin-top: 1.5em;\n margin-bottom: 0.25em;\n\n + table,\n + .table-wrapper,\n + .code-example,\n + .highlighter-rouge,\n + .sectionbody .listingblock {\n margin-top: 1em;\n }\n\n + p:not(.label) {\n margin-top: 0;\n }\n }\n\n > h1:first-child,\n > h2:first-child,\n > h3:first-child,\n > h4:first-child,\n > h5:first-child,\n > h6:first-child,\n > .sect1:first-child > h2,\n > .sect2:first-child > h3,\n > .sect3:first-child > h4,\n > .sect4:first-child > h5,\n > .sect5:first-child > h6 {\n margin-top: $sp-2;\n }\n}\n","// Main nav, breadcrumb, etc...\n// stylelint-disable selector-no-type, max-nesting-depth, selector-max-compound-selectors, selector-max-type, selector-max-specificity\n\n.nav-list {\n padding: 0;\n margin-top: 0;\n margin-bottom: 0;\n list-style: none;\n\n .nav-list-item {\n position: relative;\n margin: 0;\n\n @include fs-4;\n\n @include mq(md) {\n @include fs-3;\n }\n\n .nav-list-link {\n display: block;\n min-height: $nav-list-item-height-sm;\n padding-top: $sp-1;\n padding-bottom: $sp-1;\n line-height: #{$nav-list-item-height-sm - 2 * $sp-1};\n @if $nav-list-expander-right {\n padding-right: $nav-list-item-height-sm;\n padding-left: $gutter-spacing-sm;\n } @else {\n padding-right: $gutter-spacing-sm;\n padding-left: $nav-list-item-height-sm;\n }\n\n @include mq(md) {\n min-height: $nav-list-item-height;\n line-height: #{$nav-list-item-height - 2 * $sp-1};\n @if $nav-list-expander-right {\n padding-right: $nav-list-item-height;\n padding-left: $gutter-spacing;\n } @else {\n padding-right: $gutter-spacing;\n padding-left: $nav-list-item-height;\n }\n }\n\n &.external > svg {\n width: $sp-4;\n height: $sp-4;\n vertical-align: text-bottom;\n }\n\n &.active {\n font-weight: 600;\n text-decoration: none;\n }\n\n &:hover,\n &.active {\n color: darken($link-color, 5%);\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 80%,\n rgba($feedback-color, 0) 100%\n );\n }\n }\n\n .nav-list-expander {\n position: absolute;\n @if $nav-list-expander-right {\n right: 0;\n }\n\n width: $nav-list-item-height-sm;\n height: $nav-list-item-height-sm;\n padding: #{$nav-list-item-height-sm * 0.25};\n color: $link-color;\n\n @include mq(md) {\n width: $nav-list-item-height;\n height: $nav-list-item-height;\n padding: #{$nav-list-item-height * 0.25};\n }\n\n &:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 100%\n );\n }\n\n @if $nav-list-expander-right {\n svg {\n transform: rotate(90deg);\n }\n }\n }\n\n > .nav-list {\n display: none;\n padding-left: $sp-3;\n list-style: none;\n\n .nav-list-item {\n position: relative;\n\n .nav-list-link {\n color: $nav-child-link-color;\n }\n\n .nav-list-expander {\n color: $nav-child-link-color;\n }\n }\n }\n\n &.active {\n > .nav-list-expander svg {\n @if $nav-list-expander-right {\n transform: rotate(-90deg);\n } @else {\n transform: rotate(90deg);\n }\n }\n\n > .nav-list {\n display: block;\n }\n }\n }\n}\n\n.nav-category {\n padding: $sp-2 $gutter-spacing-sm;\n font-weight: 600;\n text-align: start;\n text-transform: uppercase;\n border-bottom: $border $border-color;\n @include fs-2;\n\n @include mq(md) {\n padding: $sp-2 $gutter-spacing;\n margin-top: $gutter-spacing-sm;\n text-align: start;\n\n &:first-child {\n margin-top: 0;\n }\n }\n}\n\n.nav-list.nav-category-list {\n > .nav-list-item {\n margin: 0;\n\n > .nav-list {\n padding: 0;\n\n > .nav-list-item {\n > .nav-list-link {\n color: $link-color;\n }\n\n > .nav-list-expander {\n color: $link-color;\n }\n }\n }\n }\n}\n\n// Aux nav\n\n.aux-nav {\n height: 100%;\n overflow-x: auto;\n @include fs-2;\n\n .aux-nav-list {\n display: flex;\n height: 100%;\n padding: 0;\n margin: 0;\n list-style: none;\n }\n\n .aux-nav-list-item {\n display: inline-block;\n height: 100%;\n padding: 0;\n margin: 0;\n }\n\n @include mq(md) {\n padding-right: $gutter-spacing-sm;\n }\n}\n\n// Breadcrumb nav\n\n.breadcrumb-nav {\n @include mq(md) {\n margin-top: -$sp-4;\n }\n}\n\n.breadcrumb-nav-list {\n padding-left: 0;\n margin-bottom: $sp-3;\n list-style: none;\n}\n\n.breadcrumb-nav-list-item {\n display: table-cell;\n @include fs-2;\n\n &::before {\n display: none;\n }\n\n &::after {\n display: inline-block;\n margin-right: $sp-2;\n margin-left: $sp-2;\n color: $grey-dk-000;\n content: \"/\";\n }\n\n &:last-child {\n &::after {\n content: \"\";\n }\n }\n}\n","// Typography\n// stylelint-disable selector-no-type, selector-max-type, selector-max-specificity, selector-max-id\n\nh1,\n.text-alpha {\n font-weight: 300;\n\n @include fs-8;\n}\n\nh2,\n.text-beta,\n#toctitle {\n @include fs-6;\n}\n\nh3,\n.text-gamma {\n @include fs-5;\n}\n\nh4,\n.text-delta {\n font-weight: 400;\n text-transform: uppercase;\n letter-spacing: 0.1em;\n\n @include fs-2;\n}\n\nh4 code {\n text-transform: none;\n}\n\nh5,\n.text-epsilon {\n @include fs-3;\n}\n\nh6,\n.text-zeta {\n @include fs-2;\n}\n\n.text-small {\n @include fs-2;\n}\n\n.text-mono {\n font-family: $mono-font-family !important;\n}\n\n.text-left {\n text-align: left !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n.text-right {\n text-align: right !important;\n}\n","// Labels (not the form kind)\n\n// this :not() prevents a style clash with Mermaid.js's\n// diagram labels, which also use .label\n// for more, see https://github.com/just-the-docs/just-the-docs/issues/1272\n// and the accompanying PR\n.label:not(g),\n.label-blue:not(g) {\n display: inline-block;\n padding: 0.16em 0.56em;\n margin-right: $sp-2;\n margin-left: $sp-2;\n color: $white;\n text-transform: uppercase;\n vertical-align: middle;\n background-color: $blue-100;\n border-radius: 12px;\n\n @include fs-2;\n}\n\n.label-green:not(g) {\n background-color: $green-300;\n}\n\n.label-purple:not(g) {\n background-color: $purple-100;\n}\n\n.label-red:not(g) {\n background-color: $red-300;\n}\n\n.label-yellow:not(g) {\n color: $grey-dk-200;\n background-color: $yellow-200;\n}\n","// Buttons and things that look like buttons\n// stylelint-disable color-named\n\n.btn {\n display: inline-block;\n box-sizing: border-box;\n padding: 0.3em 1em;\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n font-weight: 500;\n line-height: 1.5;\n color: $link-color;\n text-decoration: none;\n vertical-align: baseline;\n cursor: pointer;\n background-color: $base-button-color;\n border-width: 0;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n appearance: none;\n\n &:focus {\n text-decoration: none;\n outline: none;\n box-shadow: 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:focus:hover,\n &.selected:focus {\n box-shadow: 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:hover,\n &.zeroclipboard-is-hover {\n color: darken($link-color, 2%);\n }\n\n &:hover,\n &:active,\n &.zeroclipboard-is-hover,\n &.zeroclipboard-is-active {\n text-decoration: none;\n background-color: darken($base-button-color, 1%);\n }\n\n &:active,\n &.selected,\n &.zeroclipboard-is-active {\n background-color: darken($base-button-color, 3%);\n background-image: none;\n box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15);\n }\n\n &.selected:hover {\n background-color: darken(#dcdcdc, 5%);\n }\n\n &:disabled,\n &.disabled {\n &,\n &:hover {\n color: rgba(102, 102, 102, 0.5);\n cursor: default;\n background-color: rgba(229, 229, 229, 0.5);\n background-image: none;\n box-shadow: none;\n }\n }\n}\n\n.btn-outline {\n color: $link-color;\n background: transparent;\n box-shadow: inset 0 0 0 2px $grey-lt-300;\n\n &:hover,\n &:active,\n &.zeroclipboard-is-hover,\n &.zeroclipboard-is-active {\n color: darken($link-color, 4%);\n text-decoration: none;\n background-color: transparent;\n box-shadow: inset 0 0 0 3px $grey-lt-300;\n }\n\n &:focus {\n text-decoration: none;\n outline: none;\n box-shadow:\n inset 0 0 0 2px $grey-dk-100,\n 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:focus:hover,\n &.selected:focus {\n box-shadow: inset 0 0 0 2px $grey-dk-100;\n }\n}\n\n.btn-primary {\n @include btn-color($white, $btn-primary-color);\n}\n\n.btn-purple {\n @include btn-color($white, $purple-100);\n}\n\n.btn-blue {\n @include btn-color($white, $blue-200);\n}\n\n.btn-green {\n @include btn-color($white, $green-300);\n}\n\n.btn-reset {\n background: none;\n border: none;\n margin: 0;\n text-align: inherit;\n font: inherit;\n border-radius: 0;\n appearance: none;\n}\n","// Colored button\n\n@mixin btn-color($fg, $bg) {\n color: $fg;\n background-color: darken($bg, 2%);\n background-image: linear-gradient(lighten($bg, 5%), darken($bg, 2%));\n box-shadow:\n 0 1px 3px rgba(0, 0, 0, 0.25),\n 0 4px 10px rgba(0, 0, 0, 0.12);\n\n &:hover,\n &.zeroclipboard-is-hover {\n color: $fg;\n background-color: darken($bg, 4%);\n background-image: linear-gradient((lighten($bg, 2%), darken($bg, 4%)));\n }\n\n &:active,\n &.selected,\n &.zeroclipboard-is-active {\n background-color: darken($bg, 5%);\n background-image: none;\n box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15);\n }\n\n &.selected:hover {\n background-color: darken($bg, 10%);\n }\n}\n","// Search input and autocomplete\n\n.search {\n position: relative;\n z-index: 2;\n flex-grow: 1;\n height: $sp-10;\n padding: $sp-2;\n transition: padding linear #{$transition-duration * 0.5};\n\n @include mq(md) {\n position: relative !important;\n width: auto !important;\n height: 100% !important;\n padding: 0;\n transition: none;\n }\n}\n\n.search-input-wrap {\n position: relative;\n z-index: 1;\n height: $sp-8;\n overflow: hidden;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n transition: height linear #{$transition-duration * 0.5};\n\n @include mq(md) {\n position: absolute;\n width: 100%;\n max-width: $search-results-width;\n height: 100% !important;\n border-radius: 0;\n box-shadow: none;\n transition: width ease $transition-duration;\n }\n}\n\n.search-input {\n position: absolute;\n width: 100%;\n height: 100%;\n padding: $sp-2 $gutter-spacing-sm $sp-2 #{$gutter-spacing-sm + $sp-5};\n font-size: 1rem;\n color: $body-text-color;\n background-color: $search-background-color;\n border-top: 0;\n border-right: 0;\n border-bottom: 0;\n border-left: 0;\n border-radius: 0;\n\n @include mq(md) {\n padding: $sp-2 $gutter-spacing-sm $sp-2 #{$gutter-spacing + $sp-5};\n font-size: 0.875rem;\n background-color: $body-background-color;\n transition: padding-left linear #{$transition-duration * 0.5};\n }\n\n &:focus {\n outline: 2px solid $link-color;\n outline-offset: -2px;\n\n + .search-label .search-icon {\n color: $link-color;\n }\n }\n}\n\n.search-label {\n position: absolute;\n display: flex;\n height: 100%;\n padding-left: $gutter-spacing-sm;\n\n @include mq(md) {\n padding-left: $gutter-spacing;\n transition: padding-left linear #{$transition-duration * 0.5};\n }\n\n .search-icon {\n width: #{$sp-4 * 1.2};\n height: #{$sp-4 * 1.2};\n align-self: center;\n color: $grey-dk-000;\n }\n}\n\n.search-results {\n position: absolute;\n left: 0;\n display: none;\n width: 100%;\n max-height: calc(100% - #{$sp-10});\n overflow-y: auto;\n background-color: $search-background-color;\n border-bottom-right-radius: $border-radius;\n border-bottom-left-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n\n @include mq(md) {\n top: 100%;\n width: $search-results-width;\n max-height: calc(100vh - 200%) !important;\n }\n}\n\n.search-results-list {\n padding-left: 0;\n margin-bottom: $sp-1;\n list-style: none;\n @include fs-4;\n\n @include mq(md) {\n @include fs-3;\n }\n}\n\n.search-results-list-item {\n padding: 0;\n margin: 0;\n}\n\n.search-result {\n display: block;\n padding: $sp-1 $sp-3;\n\n &:hover,\n &.active {\n background-color: $feedback-color;\n }\n}\n\n.search-result-title {\n display: block;\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n\n @include mq(sm) {\n display: inline-block;\n width: 40%;\n padding-right: $sp-2;\n vertical-align: top;\n }\n}\n\n.search-result-doc {\n display: flex;\n align-items: center;\n word-wrap: break-word;\n\n &.search-result-doc-parent {\n opacity: 0.5;\n @include fs-3;\n\n @include mq(md) {\n @include fs-2;\n }\n }\n\n .search-result-icon {\n width: $sp-4;\n height: $sp-4;\n margin-right: $sp-2;\n color: $link-color;\n flex-shrink: 0;\n }\n\n .search-result-doc-title {\n overflow: auto;\n }\n}\n\n.search-result-section {\n margin-left: #{$sp-4 + $sp-2};\n word-wrap: break-word;\n}\n\n.search-result-rel-url {\n display: block;\n margin-left: #{$sp-4 + $sp-2};\n overflow: hidden;\n color: $search-result-preview-color;\n text-overflow: ellipsis;\n white-space: nowrap;\n @include fs-1;\n}\n\n.search-result-previews {\n display: block;\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n padding-left: $sp-4;\n margin-left: $sp-2;\n color: $search-result-preview-color;\n word-wrap: break-word;\n border-left: $border;\n border-left-color: $border-color;\n @include fs-2;\n\n @include mq(sm) {\n display: inline-block;\n width: 60%;\n padding-left: $sp-2;\n margin-left: 0;\n vertical-align: top;\n }\n}\n\n.search-result-preview + .search-result-preview {\n margin-top: $sp-1;\n}\n\n.search-result-highlight {\n font-weight: bold;\n}\n\n.search-no-result {\n padding: $sp-2 $sp-3;\n @include fs-3;\n}\n\n.search-button {\n position: fixed;\n right: $sp-4;\n bottom: $sp-4;\n display: flex;\n width: $sp-9;\n height: $sp-9;\n background-color: $search-background-color;\n border: 1px solid rgba($link-color, 0.3);\n border-radius: #{$sp-9 * 0.5};\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n align-items: center;\n justify-content: center;\n}\n\n.search-overlay {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1;\n width: 0;\n height: 0;\n background-color: rgba(0, 0, 0, 0.3);\n opacity: 0;\n transition:\n opacity ease $transition-duration,\n width 0s $transition-duration,\n height 0s $transition-duration;\n}\n\n.search-active {\n .search {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n padding: 0;\n }\n\n .search-input-wrap {\n height: $sp-10;\n border-radius: 0;\n\n @include mq(md) {\n width: $search-results-width;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n }\n }\n\n .search-input {\n background-color: $search-background-color;\n\n @include mq(md) {\n padding-left: 2.3rem;\n }\n }\n\n .search-label {\n @include mq(md) {\n padding-left: 0.6rem;\n }\n }\n\n .search-results {\n display: block;\n }\n\n .search-overlay {\n width: 100%;\n height: 100%;\n opacity: 1;\n transition:\n opacity ease $transition-duration,\n width 0s,\n height 0s;\n }\n\n @include mq(md) {\n .main {\n position: fixed;\n right: 0;\n left: 0;\n }\n }\n\n .main-header {\n padding-top: $sp-10;\n\n @include mq(md) {\n padding-top: 0;\n }\n }\n}\n","// Tables\n// stylelint-disable max-nesting-depth, selector-no-type, selector-max-type\n\n.table-wrapper {\n display: block;\n width: 100%;\n max-width: 100%;\n margin-bottom: $sp-5;\n overflow-x: auto;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n}\n\ntable {\n display: table;\n min-width: 100%;\n border-collapse: separate;\n}\n\nth,\ntd {\n min-width: 7.5rem;\n padding: $sp-2 $sp-3;\n background-color: $table-background-color;\n border-bottom: $border rgba($border-color, 0.5);\n border-left: $border $border-color;\n\n @include fs-3;\n\n &:first-of-type {\n border-left: 0;\n }\n}\n\ntbody {\n tr {\n &:last-of-type {\n th,\n td {\n border-bottom: 0;\n }\n\n td {\n padding-bottom: $sp-3;\n }\n }\n }\n}\n\nthead {\n th {\n border-bottom: $border $border-color;\n }\n}\n","// Code and syntax highlighting\n// stylelint-disable selector-no-qualifying-type, declaration-block-semicolon-newline-after,declaration-block-single-line-max-declarations, selector-no-type, selector-max-type, scss/comment-no-empty\n\n// {% raw %}\n\n// This instruction applies to all queues not within 'pre' or 'figure', avoiding 'code' generated by the highlight.\n:not(pre, figure) {\n & > code {\n padding: 0.2em 0.15em;\n font-weight: 400;\n background-color: $code-background-color;\n border: $border $border-color;\n border-radius: $border-radius;\n }\n}\n\n// Avoid appearance of dark border around visited code links in Safari\na:visited code {\n border-color: $border-color;\n}\n\n// Content structure for highlighted code blocks using fences or Liquid\n//\n// ```[LANG]...```, no kramdown line_numbers:\n// div.[language-LANG.]highlighter-rouge > div.highlight > pre.highlight > code\n//\n// ```[LANG]...```, kramdown line_numbers = true:\n// div.[language-LANG.]highlighter-rouge > div.highlight > pre.highlight > code\n// > div.table-wrapper > table.rouge-table > tbody > tr\n// > td.rouge-gutter.gl > pre.lineno\n// | td.rouge-code > pre\n//\n// {% highlight LANG %}...{% endhighlight %}:\n// figure.highlight > pre > code.language-LANG\n//\n// {% highlight LANG linenos %}...{% endhighlight %}:\n// figure.highlight > pre > code.language-LANG\n// > div.table-wrapper > table.rouge-table > tbody > tr\n// > td.gutter.gl > pre.lineno\n// | td.code > pre\n//\n// ----...---- (AsciiDoc)\n// div.listingblock > div.content > pre.rouge.highlight\n//\n// fix_linenos removes the outermost pre when it encloses table.rouge-table\n//\n// See docs/index-test.md for some tests.\n//\n// No kramdown line_numbers: fences and Liquid highlighting look the same.\n// Kramdown line_numbers = true: fences have a wider gutter than with Liquid?\n\n// ```[LANG]...```\n// or in AsciiDoc:\n//\n// ----\n// ...\n// ----\n\n// the code may appear with 3 different types:\n// container \\ case: default case, code with line number, code with html rendering\n// top level: div.highlighter-rouge, figure.highlight, figure.highlight\n// second level: div.highlight, div.table-wrapper, pre.highlight\n// third level: pre.highlight, td.code, absent\n// last level: code, pre, code (optionality)\n// highlighter level: span, span, span\n// the spacing are only in the second level for case 1, 3 and in the third level for case 2\n// in AsciiDoc, there is a parent container that contains optionally a title and the content.\n\n// select top level container\ndiv.highlighter-rouge,\ndiv.listingblock > div.content,\nfigure.highlight {\n margin-top: 0;\n margin-bottom: $sp-3;\n background-color: $code-background-color;\n border-radius: $border-radius;\n box-shadow: none;\n -webkit-overflow-scrolling: touch;\n position: relative;\n padding: 0;\n\n // copy button (or other button)\n // the button appear only when there is a hover on the code or focus on button\n > button {\n width: $sp-3;\n opacity: 0;\n position: absolute;\n top: 0;\n right: 0;\n padding: $sp-3;\n border: none;\n background: none;\n color: $body-text-color;\n box-sizing: content-box;\n\n svg {\n fill: $body-text-color;\n }\n\n &:active {\n text-decoration: none;\n outline: none;\n opacity: 1;\n }\n\n &:focus {\n opacity: 1;\n outline: 2px solid $link-color;\n }\n }\n\n // the button can be seen by doing a simple hover in the code, there is no need to go over the location of the button\n &:hover {\n > button {\n cursor: copy;\n opacity: 1;\n }\n }\n}\n\n// setting the spacing and scrollbar on the second level for the first case\n// remove all space on the second and third level\n// this is a mixin to accommodate for the slightly different structures generated via Markdown vs AsciiDoc\n@mixin scroll-and-spacing($code-div, $pre-select) {\n #{$code-div} {\n overflow-x: auto;\n padding: $sp-3;\n margin: 0;\n border: 1px solid $body-text-color;\n border-radius: $border-radius;\n }\n\n #{$pre-select},\n code {\n padding: 0;\n margin: 0;\n border: 0;\n }\n}\n\n// for Markdown\ndiv.highlighter-rouge {\n @include scroll-and-spacing(\"div.highlight\", \"pre.highlight\");\n}\n\n// for AsciiDoc. we also need to fix the margins for its parent container.\ndiv.listingblock {\n margin-top: 0;\n margin-bottom: $sp-3;\n\n @include scroll-and-spacing(\"div.content\", \"div.content > pre\");\n}\n\n// {% highlight LANG %}...{% endhighlight %},\n// {% highlight LANG linenos %}...{% endhighlight %}:\n\n// setting the spacing and scrollbar on the second level for the thirt case\n// the css rule are apply only to the last code enviroment\n// setting the scroolbar\nfigure.highlight {\n pre,\n :not(pre) > code {\n overflow-x: auto;\n padding: $sp-3;\n margin: 0;\n border: 1px solid $body-text-color;\n border-radius: $border-radius;\n }\n}\n\n// ```[LANG]...```, kramdown line_numbers = true,\n// {% highlight LANG linenos %}...{% endhighlight %}:\n\n// setting the spacing and scrollbar on the thirt level for the second case\n.highlight .table-wrapper {\n padding: $sp-3 0;\n margin: 0;\n border: 0;\n box-shadow: none;\n\n td,\n pre {\n min-width: 0;\n padding: 0;\n background-color: $code-background-color;\n border: 0;\n\n @include fs-2;\n }\n\n td.gl {\n width: 1em;\n padding-right: $sp-3;\n padding-left: $sp-3;\n }\n\n pre {\n margin: 0;\n line-height: 2;\n }\n}\n\n// Code examples: html render of a code\n.code-example,\n.listingblock > .title {\n padding: $sp-3;\n margin-bottom: $sp-3;\n overflow: auto;\n border: 1px solid $border-color;\n border-radius: $border-radius;\n\n + .highlighter-rouge,\n + .sectionbody .listingblock,\n + .content,\n + figure.highlight {\n position: relative;\n margin-top: -$sp-4;\n border-right: 1px solid $border-color;\n border-bottom: 1px solid $border-color;\n border-left: 1px solid $border-color;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n }\n}\n\n// Mermaid diagram code blocks should be left unstyled.\ncode.language-mermaid {\n padding: 0;\n background-color: inherit;\n border: 0;\n}\n\n// Override OneDarkJekyll Colors for Code Blocks\n.highlight,\npre.highlight {\n background: $code-background-color; // Code Background\n // For Backwards Compatibility Before $code-linenumber-color was added\n @if variable-exists(code-linenumber-color) {\n color: $code-linenumber-color; // Code Line Numbers\n } @else {\n color: $body-text-color; // Code Line Numbers\n }\n}\n\n// Override OneDarkJekyll Colors for Code Blocks\n.highlight pre {\n background: $code-background-color; // Code Background\n}\n\n// {% endraw %}\n","// Utility classes for colors\n\n// Text colors\n\n.text-grey-dk-000 {\n color: $grey-dk-000 !important;\n}\n\n.text-grey-dk-100 {\n color: $grey-dk-100 !important;\n}\n\n.text-grey-dk-200 {\n color: $grey-dk-200 !important;\n}\n\n.text-grey-dk-250 {\n color: $grey-dk-250 !important;\n}\n\n.text-grey-dk-300 {\n color: $grey-dk-300 !important;\n}\n\n.text-grey-lt-000 {\n color: $grey-lt-000 !important;\n}\n\n.text-grey-lt-100 {\n color: $grey-lt-100 !important;\n}\n\n.text-grey-lt-200 {\n color: $grey-lt-200 !important;\n}\n\n.text-grey-lt-300 {\n color: $grey-lt-300 !important;\n}\n\n.text-blue-000 {\n color: $blue-000 !important;\n}\n\n.text-blue-100 {\n color: $blue-100 !important;\n}\n\n.text-blue-200 {\n color: $blue-200 !important;\n}\n\n.text-blue-300 {\n color: $blue-300 !important;\n}\n\n.text-green-000 {\n color: $green-000 !important;\n}\n\n.text-green-100 {\n color: $green-100 !important;\n}\n\n.text-green-200 {\n color: $green-200 !important;\n}\n\n.text-green-300 {\n color: $green-300 !important;\n}\n\n.text-purple-000 {\n color: $purple-000 !important;\n}\n\n.text-purple-100 {\n color: $purple-100 !important;\n}\n\n.text-purple-200 {\n color: $purple-200 !important;\n}\n\n.text-purple-300 {\n color: $purple-300 !important;\n}\n\n.text-yellow-000 {\n color: $yellow-000 !important;\n}\n\n.text-yellow-100 {\n color: $yellow-100 !important;\n}\n\n.text-yellow-200 {\n color: $yellow-200 !important;\n}\n\n.text-yellow-300 {\n color: $yellow-300 !important;\n}\n\n.text-red-000 {\n color: $red-000 !important;\n}\n\n.text-red-100 {\n color: $red-100 !important;\n}\n\n.text-red-200 {\n color: $red-200 !important;\n}\n\n.text-red-300 {\n color: $red-300 !important;\n}\n\n// Background colors\n\n.bg-grey-dk-000 {\n background-color: $grey-dk-000 !important;\n}\n\n.bg-grey-dk-100 {\n background-color: $grey-dk-100 !important;\n}\n\n.bg-grey-dk-200 {\n background-color: $grey-dk-200 !important;\n}\n\n.bg-grey-dk-250 {\n background-color: $grey-dk-250 !important;\n}\n\n.bg-grey-dk-300 {\n background-color: $grey-dk-300 !important;\n}\n\n.bg-grey-lt-000 {\n background-color: $grey-lt-000 !important;\n}\n\n.bg-grey-lt-100 {\n background-color: $grey-lt-100 !important;\n}\n\n.bg-grey-lt-200 {\n background-color: $grey-lt-200 !important;\n}\n\n.bg-grey-lt-300 {\n background-color: $grey-lt-300 !important;\n}\n\n.bg-blue-000 {\n background-color: $blue-000 !important;\n}\n\n.bg-blue-100 {\n background-color: $blue-100 !important;\n}\n\n.bg-blue-200 {\n background-color: $blue-200 !important;\n}\n\n.bg-blue-300 {\n background-color: $blue-300 !important;\n}\n\n.bg-green-000 {\n background-color: $green-000 !important;\n}\n\n.bg-green-100 {\n background-color: $green-100 !important;\n}\n\n.bg-green-200 {\n background-color: $green-200 !important;\n}\n\n.bg-green-300 {\n background-color: $green-300 !important;\n}\n\n.bg-purple-000 {\n background-color: $purple-000 !important;\n}\n\n.bg-purple-100 {\n background-color: $purple-100 !important;\n}\n\n.bg-purple-200 {\n background-color: $purple-200 !important;\n}\n\n.bg-purple-300 {\n background-color: $purple-300 !important;\n}\n\n.bg-yellow-000 {\n background-color: $yellow-000 !important;\n}\n\n.bg-yellow-100 {\n background-color: $yellow-100 !important;\n}\n\n.bg-yellow-200 {\n background-color: $yellow-200 !important;\n}\n\n.bg-yellow-300 {\n background-color: $yellow-300 !important;\n}\n\n.bg-red-000 {\n background-color: $red-000 !important;\n}\n\n.bg-red-100 {\n background-color: $red-100 !important;\n}\n\n.bg-red-200 {\n background-color: $red-200 !important;\n}\n\n.bg-red-300 {\n background-color: $red-300 !important;\n}\n","// Utility classes for layout\n\n// Display\n\n.d-block {\n display: block !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-none {\n display: none !important;\n}\n\n// Screenreader-only\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border-width: 0;\n}\n\n@each $media-query in map-keys($media-queries) {\n @for $i from 1 through length($spacers) {\n @include mq($media-query) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .d-sm-block, .d-md-none, .d-lg-inline\n .d-#{$media-query}-block {\n display: block !important;\n }\n .d-#{$media-query}-flex {\n display: flex !important;\n }\n .d-#{$media-query}-inline {\n display: inline !important;\n }\n .d-#{$media-query}-inline-block {\n display: inline-block !important;\n }\n .d-#{$media-query}-none {\n display: none !important;\n }\n }\n }\n}\n\n// Horizontal alignment\n\n.float-left {\n float: left !important;\n}\n\n.float-right {\n float: right !important;\n}\n\n.flex-justify-start {\n justify-content: flex-start !important;\n}\n\n.flex-justify-end {\n justify-content: flex-end !important;\n}\n\n.flex-justify-between {\n justify-content: space-between !important;\n}\n\n.flex-justify-around {\n justify-content: space-around !important;\n}\n\n// Vertical alignment\n\n.v-align-baseline {\n vertical-align: baseline !important;\n}\n\n.v-align-bottom {\n vertical-align: bottom !important;\n}\n\n.v-align-middle {\n vertical-align: middle !important;\n}\n\n.v-align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.v-align-text-top {\n vertical-align: text-top !important;\n}\n\n.v-align-top {\n vertical-align: top !important;\n}\n","// Utility classes for typography\n\n.fs-1 {\n @include fs-1;\n}\n\n.fs-2 {\n @include fs-2;\n}\n\n.fs-3 {\n @include fs-3;\n}\n\n.fs-4 {\n @include fs-4;\n}\n\n.fs-5 {\n @include fs-5;\n}\n\n.fs-6 {\n @include fs-6;\n}\n\n.fs-7 {\n @include fs-7;\n}\n\n.fs-8 {\n @include fs-8;\n}\n\n.fs-9 {\n @include fs-9;\n}\n\n.fs-10 {\n @include fs-10;\n}\n\n.fw-300 {\n font-weight: 300 !important;\n}\n\n.fw-400 {\n font-weight: 400 !important;\n}\n\n.fw-500 {\n font-weight: 500 !important;\n}\n\n.fw-700 {\n font-weight: 700 !important;\n}\n\n.lh-0 {\n line-height: 0 !important;\n}\n\n.lh-default {\n line-height: $body-line-height;\n}\n\n.lh-tight {\n line-height: $body-heading-line-height;\n}\n\n.ls-5 {\n letter-spacing: 0.05em !important;\n}\n\n.ls-10 {\n letter-spacing: 0.1em !important;\n}\n\n.ls-0 {\n letter-spacing: 0 !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n","// Utility classes for lists\n\n// stylelint-disable selector-max-type\n\n.list-style-none {\n padding: 0 !important;\n margin: 0 !important;\n list-style: none !important;\n\n li {\n &::before {\n display: none !important;\n }\n }\n}\n","// Utility classes for margins and padding\n\n// stylelint-disable block-opening-brace-space-after, block-opening-brace-space-before\n\n// Margin spacer utilities\n\n.mx-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n}\n\n@for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .m-0, .m-1, .m-2...\n .m-#{$scale} {\n margin: #{$size} !important;\n }\n .mt-#{$scale} {\n margin-top: #{$size} !important;\n }\n .mr-#{$scale} {\n margin-right: #{$size} !important;\n }\n .mb-#{$scale} {\n margin-bottom: #{$size} !important;\n }\n .ml-#{$scale} {\n margin-left: #{$size} !important;\n }\n\n .mx-#{$scale} {\n margin-right: #{$size} !important;\n margin-left: #{$size} !important;\n }\n\n .my-#{$scale} {\n margin-top: #{$size} !important;\n margin-bottom: #{$size} !important;\n }\n\n .mxn-#{$scale} {\n margin-right: -#{$size} !important;\n margin-left: -#{$size} !important;\n }\n .mx-#{$scale}-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n}\n\n@each $media-query in map-keys($media-queries) {\n @for $i from 1 through length($spacers) {\n @include mq($media-query) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .m-sm-0, .m-md-1, .m-lg-2...\n .m-#{$media-query}-#{$scale} {\n margin: #{$size} !important;\n }\n .mt-#{$media-query}-#{$scale} {\n margin-top: #{$size} !important;\n }\n .mr-#{$media-query}-#{$scale} {\n margin-right: #{$size} !important;\n }\n .mb-#{$media-query}-#{$scale} {\n margin-bottom: #{$size} !important;\n }\n .ml-#{$media-query}-#{$scale} {\n margin-left: #{$size} !important;\n }\n\n .mx-#{$media-query}-#{$scale} {\n margin-right: #{$size} !important;\n margin-left: #{$size} !important;\n }\n\n .my-#{$media-query}-#{$scale} {\n margin-top: #{$size} !important;\n margin-bottom: #{$size} !important;\n }\n\n .mxn-#{$media-query}-#{$scale} {\n margin-right: -#{$size} !important;\n margin-left: -#{$size} !important;\n }\n }\n }\n}\n\n// Padding spacer utilities\n\n@for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .p-0, .p-1, .p-2...\n .p-#{$scale} {\n padding: #{$size} !important;\n }\n .pt-#{$scale} {\n padding-top: #{$size} !important;\n }\n .pr-#{$scale} {\n padding-right: #{$size} !important;\n }\n .pb-#{$scale} {\n padding-bottom: #{$size} !important;\n }\n .pl-#{$scale} {\n padding-left: #{$size} !important;\n }\n\n .px-#{$scale} {\n padding-right: #{$size} !important;\n padding-left: #{$size} !important;\n }\n\n .py-#{$scale} {\n padding-top: #{$size} !important;\n padding-bottom: #{$size} !important;\n }\n}\n\n@each $media-query in map-keys($media-queries) {\n @include mq($media-query) {\n @for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .p-sm-0, .p-md-1, .p-lg-2...\n .p-#{$media-query}-#{$scale} {\n padding: #{$size} !important;\n }\n .pt-#{$media-query}-#{$scale} {\n padding-top: #{$size} !important;\n }\n .pr-#{$media-query}-#{$scale} {\n padding-right: #{$size} !important;\n }\n .pb-#{$media-query}-#{$scale} {\n padding-bottom: #{$size} !important;\n }\n .pl-#{$media-query}-#{$scale} {\n padding-left: #{$size} !important;\n }\n\n .px-#{$media-query}-#{$scale} {\n padding-right: #{$size} !important;\n padding-left: #{$size} !important;\n }\n\n .py-#{$media-query}-#{$scale} {\n padding-top: #{$size} !important;\n padding-bottom: #{$size} !important;\n }\n }\n }\n}\n","// stylelint-disable selector-max-specificity, selector-max-id, selector-max-type, selector-no-qualifying-type\n\n@media print {\n .site-footer,\n .site-button,\n #edit-this-page,\n #back-to-top,\n .site-nav,\n .main-header {\n display: none !important;\n }\n\n hr {\n margin-top: 1rem;\n margin-bottom: 1rem;\n }\n\n .side-bar {\n width: 100%;\n height: auto;\n border-right: 0 !important;\n }\n\n .site-header {\n border-bottom: 1px solid $border-color;\n }\n\n .site-title {\n font-size: 1rem !important;\n font-weight: 700 !important;\n }\n\n .text-small {\n font-size: 8pt !important;\n }\n\n pre.highlight {\n border: 1px solid $border-color;\n }\n\n .main {\n max-width: none;\n margin-left: 0;\n }\n}\n","// Skipnav\n// Skip to main content\n\na.skip-to-main {\n left: -999px;\n position: absolute;\n top: auto;\n width: 1px;\n height: 1px;\n overflow: hidden;\n z-index: -999;\n}\n\na.skip-to-main:focus,\na.skip-to-main:active {\n color: $link-color;\n background-color: $body-background-color;\n left: auto;\n top: auto;\n width: 30%;\n height: auto;\n overflow: auto;\n margin: 10px 35%;\n padding: 5px;\n border-radius: 15px;\n border: 4px solid $btn-primary-color;\n text-align: center;\n font-size: 1.2em;\n z-index: 999;\n}\n","\n@import \"./support/support\";\n@import \"./custom/setup\";\n@import \"./color_schemes/light\";\n\n@import \"./color_schemes/dark\";\n\n@import \"./modules\";\ndiv.opaque {\n background-color: $body-background-color;\n}\n\np.tip, blockquote.tip {\n border: 1px $green-300 solid;\n border-left: $border-radius solid $green-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $green-300;\n content: \"Tip\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .tip-title {\n color: $green-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.tip-title, blockquote.tip-title {\n border: 1px $green-300 solid;\n border-left: $border-radius solid $green-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $green-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.tip {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.tip-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n\np.note, blockquote.note {\n border: 1px $blue-300 solid;\n border-left: $border-radius solid $blue-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $blue-300;\n content: \"Note\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .note-title {\n color: $blue-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.note-title, blockquote.note-title {\n border: 1px $blue-300 solid;\n border-left: $border-radius solid $blue-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $blue-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.note {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.note-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n\np.warning, blockquote.warning {\n border: 1px $yellow-300 solid;\n border-left: $border-radius solid $yellow-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $yellow-300;\n content: \"Warning\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .warning-title {\n color: $yellow-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.warning-title, blockquote.warning-title {\n border: 1px $yellow-300 solid;\n border-left: $border-radius solid $yellow-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $yellow-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.warning {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.warning-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n@import \"./custom/custom\";\n\n\n"],"file":"just-the-docs-dark.css"} \ No newline at end of file diff --git a/main/assets/css/just-the-docs-default.css.map b/main/assets/css/just-the-docs-default.css.map index 747c119b61..4640506a64 100644 --- a/main/assets/css/just-the-docs-default.css.map +++ b/main/assets/css/just-the-docs-default.css.map @@ -1 +1 @@ -{"version":3,"sourceRoot":"","sources":["../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/vendor/accessible-pygments/github-light.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/vendor/normalize.scss/normalize.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/base.scss","../../_sass/color_schemes/meshtastic.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/support/mixins/_typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/support/mixins/_layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/support/_variables.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/content.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/navigation.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/labels.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/buttons.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/color_schemes/light.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/support/mixins/_buttons.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/search.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/tables.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/code.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/utilities/_colors.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/utilities/_layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/utilities/_typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/utilities/_lists.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/utilities/_spacing.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/print.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/skiptomain.scss","just-the-docs-default.scss"],"names":[],"mappings":";AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA;EAAkB;;;AAClB;EAAgB;EAAiB;AACjC;EAAkB;EAAiB;AACnC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAkB;EAAiB;AACnC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAqB;AACtC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAoB;AACrC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAgB;EAAiB;AACjC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AChFlC;AAEA;AAAA;AAGA;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAAA;AAKA;EACE;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;EAEE;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;AAAA;EAGE;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;EAEE;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAAA;AAKA;AAAA;AAAA;AAAA;AAAA;EAKE;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;AAEE;EACA;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;AAEE;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;EAIE;;;AAGF;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;EAIE;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;EAIE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;EAEE;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;EAEE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AC1VF;EACE,cCGa;;;ADAf;EACE;;;AAGF;EACE;;AEmBA;EACE;;AClBA;EHHJ;IEyBI;;;;AFnBJ;EACE,aIfiB;EJgBjB;EACA,aIbiB;EJcjB,OCTgB;EDUhB,kBCZsB;EDatB;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAYE;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;EACA;EACA;EACA,aI1CyB;EJ2CzB,OCvCmB;;;AD0CrB;EACE;EACA;;;AAGF;EACE,OC7CW;ED8CX;;;AAGF;EACE;EACA,uBCvCa;EDwCb;;AAEA;EACE;;;AAIJ;EACE,aIvEiB;EJwEjB;EACA,aIvEiB;;;AJ0EnB;AAAA;EAEE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA,kBCvEa;EDwEb;;;AAIF;EACE;EAGA;EACA;EACA;EACA;;;AK7GF;EACE;EACA;EACA;EACA,kBJKc;;AEGZ;EEZJ;IAOI;IACA;IACA,ODwFW;ICvFX;IACA;IACA;;;AFAA;EEZJ;IAgBI;IACA,WD+EQ;;;ADpFR;EEQF;IAEI,aD2ES;;;ADrFX;EEQF;IAQI;;;AAOF;EACE;EACA,kBJ5BU;;AEGZ;EEuBA;IAKI;IACA,kBJjCgB;;;AIoClB;EACE;;AFjCJ;EEgCE;IAII;;;;AAOV;EACE;;AF5CE;EE2CJ;IAII;IACA,WDyCY;;;;ACrChB;EACE,aDaK;ECZL,gBDYK;EDvDL,eCuDK;EDtDL,cCsDK;;ADlEH;EEoDJ;IFrCI,eCqDG;IDpDH,cCoDG;;;ADpEH;EEoDJ;IAOI,aDSG;ICRH,gBDQG;;;;ACJP;EACE;EACA;;AFlEE;EEgEJ;IAKI;IACA;IACA,QDmBY;;;;ACfhB;AAAA;AAAA;EAGE;;AF9EE;EE2EJ;AAAA;AAAA;IAMI,ODGQ;;;;ACCZ;EACE;;AAEA;EACE;;AFzFA;EEqFJ;IAQI;IACA,aDxBG;ICyBH,gBD7BG;IC8BH;IACA;;;;AAIJ;EACE;EACA,YDbc;ECcd;;AFxGE;EEqGJ;IAMI,QDjBY;ICkBZ,YDlBY;ICmBZ;;;;AAIJ;EACE;EACA;EACA;EACA;EACA,aDrDK;ECsDL,gBDtDK;ECuDL,OJzHmB;EEYnB,eCuDK;EDtDL,cCsDK;;ADlEH;EEiHJ;IFlGI,eCqDG;IDpDH,cCoDG;;;AF/BL;EACE;;ACtCA;EEiHJ;IHvEI;IACA,aEhDuB;;;ADKvB;EEiHJ;IAcI,aD/DG;ICgEH,gBDhEG;;;;AC+EP;EACE;EACA;EACA,SDhFK;ECiFL;;;AFnJE;EEuJF;IACE;;;AAIJ;EACE;;;AAQF;EACE;;;AAOF;EACE;EACA;EACA;EACA,aD/GK;ECgHL,gBDhHK;EDvDL,eCuDK;EDtDL,cCsDK;;ADlEH;EE6KJ;IF9JI,eCqDG;IDpDH,cCoDG;;;AFvEL;EACE;;ACEA;EE6KJ;IH3KI;;;ACFA;EE6KJ;IAYI;IACA;;;;AAIJ;EACE,OD5HK;EC6HL,QD7HK;EC8HL,OJ/LW;;;AKXb;EACE,aFEoB;;AEApB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;;AAGF;EACE;EACA;;AAGF;AAAA;EAEE;;AAIA;EACE,YF+CC;;AE3CL;EACE;EACA;;AAEA;EACE;;AAEA;EACE;EACA;EACA;EACA,OFfM;EEgBN;EACA;;AJ1BN;EACE;;ACRA;EG2BE;IJfF;;;ACZA;EG2BE;IAUI;;;AAIJ;EACE;;AAGE;EACE;EACA;;AAOV;EACE;;AAGE;EACE;EACA;EACA,OF7CM;EE8CN;;AAMJ;EACE;;AAIJ;EACE;EACA;;AAKF;EACE;;AAGF;EACE;;AAGF;EACE;EACA;;AAGF;AAAA;EAEE;;AAGF;EACE;EACA;EACA;;AAEA;EACE;;AAIJ;EACE;EACA;EACA;;AAmBE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;;AASF;AAAA;AAAA;AAAA;AAAA;AAAA;EAEE;;AAKN;EACE;EACA;EACA,OFnFG;EEoFH;EACA,eFzFG;EE0FH,cF1FG;EE2FH;;AH1JA;EGmJF;IAUI;IACA;;;AAGF;EACE;EACA;EACA;EACA,OLnKO;EKoKP;;AAYF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;;AAIJ;EACE;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;EACA;EACA;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAKE;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;;AAIJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAWE,YF9JG;;;AG3EP;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;ALoBF;EACE;;AClBA;EILF;IL2BE;;;ACtBA;EDOF;IACE;;;ACRA;EILF;ILiBE;;;AKPA;EACE;EACA,YH+DC;EG9DD,aHuDC;EGtDD,gBHsDC;EGrDD;EAEE,eH0DD;EGzDC,cHqDD;;ADlEH;EIKA;IAeI,YHgDD;IG/CC;IAEE,eH6CH;IG5CG,cH4CH;;;AGrCD;EACE,OHkCD;EGjCC,QHiCD;EGhCC;;AAGF;EACE;EACA;;AAGF;EAEE;EACA;;AASJ;EACE;EAEE;EAGF,OHUC;EGTD,QHSC;EGRD;EACA,ON7DO;;AEFT;EIsDA;IAYI,OHED;IGDC,QHCD;IGAC;;;AAGF;EACE;;AAQA;EACE;;AAKN;EACE;EACA,cHvBC;EGwBD;;AAEA;EACE;;AAEA;EACE,ONzFa;;AM4Ff;EACE,ON7Fa;;AMmGjB;EAEI;;AAMJ;EACE;;;AAMR;EACE;EACA;EACA;EACA;EACA;;ALhIA;EACE;;ACEA;EIwHJ;ILtHI;;;ACFA;EIwHJ;IASI;IACA,YHhEG;IGiEH;;EAEA;IACE;;;;AAMJ;EACE;;AAEA;EACE;;AAGE;EACE,ONlJG;;AMqJL;EACE,ONtJG;;;AM+Jb;EACE;EACA;;ALtKA;EACE;;ACEA;EIiKJ;IL/JI;;;AKoKF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AJlLA;EIiKJ;IAqBI,eHpHG;;;;ADlEH;EI4LJ;IAEI;;;;AAIJ;EACE;EACA,eHnIK;EGoIL;;;AAGF;EACE;;AL5MA;EACE;;ACEA;EIwMJ;ILtMI;;;AK0MF;EACE;;AAGF;EACE;EACA,cHlJG;EGmJH,aHnJG;EGoJH,OHpMU;EGqMV;;AAIA;EACE;;;ACrON;AAAA;EAEE;;ANoEA;AAAA;EACE;EACA,aElEuB;;ADKvB;EKXJ;AAAA;IN4EI;;;;AA5BF;AAAA;AAAA;EACE;;ACtCA;EKJJ;AAAA;AAAA;IN8CI;IACA,aEhDuB;;;;AFgCzB;AAAA;EACE;;AC5BA;EKEJ;AAAA;IN8BI;;;;AMzBJ;AAAA;EAEE;EACA;EACA;;ANdA;AAAA;EACE;;ACEA;EKOJ;AAAA;INLI;;;;AMcJ;EACE;;;ANVA;AAAA;EACE;;ACRA;EKoBJ;AAAA;INRI;;;;AAfF;AAAA;EACE;;ACEA;EKyBJ;AAAA;INvBI;;;;AALF;EACE;;ACEA;EK8BJ;IN5BI;;;;AMgCJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;ACvDF;AAAA;EAEE;EACA;EACA,cLoEK;EKnEL,aLmEK;EKlEL,OLiBM;EKhBN;EACA;EACA,kBL6BS;EK5BT;;APLA;AAAA;EACE;;ACEA;EMRJ;AAAA;IPUI;;;;AOKJ;EACE,kBL4BU;;;AKzBZ;EACE,kBLcW;;;AKXb;EACE,kBL4BQ;;;AKzBV;EACE,OLFY;EKGZ,kBLkBW;;;AMlDb;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,OTIW;ESHX;EACA;EACA;EACA,kBCTkB;EDUlB;EACA,eNyEc;EMxEd,YACE;EAEF;;AAEA;EACE;EACA;EACA;;AAGF;EAEE;;AAGF;EAEE;;AAGF;EAIE;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;AAKA;EAEE;EACA;EACA;EACA;EACA;;;AAKN;EACE,OT1DW;ES2DX;EACA;;AAEA;EAIE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA,YACE;;AAIJ;EAEE;;;AAIJ;EEnGE,OR0BM;EQzBN;EACA;EACA,YACE;;AAGF;EAEE,ORiBI;EQhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;AFgFJ;EEvGE,OR0BM;EQzBN;EACA;EACA,YACE;;AAGF;EAEE,ORiBI;EQhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;AFoFJ;EE3GE,OR0BM;EQzBN;EACA;EACA,YACE;;AAGF;EAEE,ORiBI;EQhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;AFwFJ;EE/GE,OR0BM;EQzBN;EACA;EACA,YACE;;AAGF;EAEE,ORiBI;EQhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;AF4FJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AG3HF;EACE;EACA;EACA;EACA,QTgFM;ES/EN,STuEK;EStEL;;AVME;EUZJ;IASI;IACA;IACA;IACA;IACA;;;;AAIJ;EACE;EACA;EACA,QT8DK;ES7DL;EACA,eTmEc;ESlEd,YACE;EAEF;;AVdE;EUKJ;IAYI;IACA;IACA,WTwEmB;ISvEnB;IACA;IACA;IACA;;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA,OZnCgB;EYoChB,kBZVwB;EYWxB;EACA;EACA;EACA;EACA;;AVvCE;EU2BJ;IAeI;IACA;IACA,kBZhDoB;IYiDpB;;;AAGF;EACE;EACA;;AAEA;EACE,OZnDO;;;AYwDb;EACE;EACA;EACA;EACA,cTIK;;ADlEH;EU0DJ;IAOI,cTGG;ISFH;;;AAGF;EACE;EACA;EACA;EACA,OTzDU;;;AS6Dd;EACE;EACA;EACA;EACA;EACA;EACA;EACA,kBZ5DwB;EY6DxB,4BTRc;ESSd,2BTTc;ESUd,YACE;;AVxFA;EU6EJ;IAeI;IACA,OTFmB;ISGnB;;;;AAIJ;EACE;EACA,eTrCK;ESsCL;;AXpFA;EACE;;AClBA;EUkGJ;IX5EI;;;ACtBA;EDOF;IACE;;;ACRA;EUkGJ;IXtFI;;;;AWiGJ;EACE;EACA;;;AAGF;EACE;EACA;;AAEA;EAEE,kBZnGa;;;AYuGjB;EACE;EACA,aT9DK;ES+DL,gBT/DK;;ADhEH;EU4HJ;IAMI;IACA;IACA,eTpEG;ISqEH;;;;AAIJ;EACE;EACA;EACA;;AAEA;EACE;;AXxIF;EACE;;ACRA;EU8IF;IXlIE;;;ACZA;EDHF;IACE;;;ACEA;EU8IF;IX5IE;;;AWqJF;EACE,OTtFG;ESuFH,QTvFG;ESwFH,cT1FG;ES2FH,OZzJS;EY0JT;;AAGF;EACE;;;AAIJ;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA,OZtK4B;EYuK5B;EACA;;AX5LA;EACE;;ACYA;EUyKJ;IXjLI;;;;AW2LJ;EACE;EACA,aTrHK;ESsHL,gBTtHK;ESuHL,cTrHK;ESsHL,aTxHK;ESyHL,OZlL4B;EYmL5B;EACA,aT/GO;ESgHP,mBZ9Ka;;ACjBb;EACE;;ACEA;EUmLJ;IXjLI;;;ACFA;EUmLJ;IAaI;IACA;IACA,cTlIG;ISmIH;IACA;;;;AAIJ;EACE,YT1IK;;;AS6IP;EACE;;;AAGF;EACE;;AX1MA;EACE;;ACRA;EUgNJ;IXpMI;;;;AWyMJ;EACE;EACA,OTrJK;ESsJL,QTtJK;ESuJL;EACA,OTnJK;ESoJL,QTpJK;ESqJL,kBZpMwB;EYqMxB;EACA;EACA,YACE;EAEF;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YACE;;;AAMF;EACE;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE,QTxLI;ESyLJ;;AVjQA;EU+PF;IAKI,OTzKiB;IS0KjB,YACE;;;AAKN;EACE,kBZpPsB;;AExBtB;EU2QF;IAII;;;AV/QF;EUmRF;IAEI;;;AAIJ;EACE;;AAGF;EACE;EACA;EACA;EACA,YACE;;AVlSF;EUwSA;IACE;IACA;IACA;;;AAIJ;EACE,aTxOI;;ADxEJ;EU+SF;IAII;;;;AC9TN;EACE;EACA;EACA;EACA,eV0EK;EUzEL;EACA,eVkFc;EUjFd,YACE;;;AAIJ;EACE;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA,kBbIuB;EaHvB;EACA;;AZNA;AAAA;EACE;;ACRA;EWOJ;AAAA;IZKI;;;AYKF;AAAA;EACE;;;AAOE;AAAA;EAEE;;AAGF;EACE,gBVkCD;;;AU3BL;EACE;;;AC9CF;EACE;EACA;EACA,kBdcoB;EcbpB;EACA,eX+EY;;;AW1EhB;EACE,cdUa;;;AcyCf;AAAA;AAAA;EAGE;EACA,eXMK;EWLL,kBdlDsB;EcmDtB,eXgBc;EWfd;EACA;EACA;EACA;;AAIA;AAAA;AAAA;EACE,OXLG;EWMH;EACA;EACA;EACA;EACA,SXVG;EWWH;EACA;EACA,OdhFc;EciFd;;AAEA;AAAA;AAAA;EACE,MdpFY;;AcuFd;AAAA;AAAA;EACE;EACA;EACA;;AAGF;AAAA;AAAA;EACE;EACA;;AAMF;AAAA;AAAA;EACE;EACA;;;AASJ;EACE;EACA,SX/CG;EWgDH;EACA;EACA,eXtCY;;AWyCd;AAAA;EAEE;EACA;EACA;;;AAUJ;EACE;EACA,eXrEK;;AW6CL;EACE;EACA,SX/CG;EWgDH;EACA;EACA,eXtCY;;AWyCd;AAAA;EAEE;EACA;EACA;;;AAwBF;AAAA;EAEE;EACA,SXpFG;EWqFH;EACA;EACA,eX3EY;;;AWmFhB;EACE;EACA;EACA;EACA;;AAEA;AAAA;EAEE;EACA;EACA,kBdhKoB;EciKpB;;Ab9KF;AAAA;EACE;;ACEA;EYsKF;AAAA;IbpKE;;;Aa8KF;EACE;EACA,eXjHG;EWkHH,cXlHG;;AWqHL;EACE;EACA;;;AAKJ;AAAA;EAEE,SX9HK;EW+HL,eX/HK;EWgIL;EACA;EACA,eXtHc;;AWwHd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAIE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAKJ;EACE;EACA;EACA;;;AAIF;AAAA;EAEE,YdnNsB;EcsNpB,OdrNoB;;;Ac4NxB;EACE,Yd9NsB;;;AepBxB;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;ACvOF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AdrBE;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;AAQR;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AfhHA;EACE;;ACYA;EeZJ;IhBII;;;;AAKF;EACE;;ACEA;EeRJ;IhBUI;;;;AAKF;EACE;;ACRA;EeJJ;IhBgBI;;;;AAKF;EACE;;AClBA;EeAJ;IhBsBI;;;;AAKF;EACE;;AC5BA;EeIJ;IhB4BI;;;;AAKF;EACE;;ACtCA;EeQJ;IhBkCI;IACA,aEhDuB;;;;AFqDzB;EACE;EACA,aEvDuB;;ADKvB;EeYJ;IhB0CI;;;;AAKF;EACE;EACA,aElEuB;;ADKvB;EegBJ;IhBiDI;;;;AAKF;EACE;EACA,aE7EuB;;ADKvB;EeoBJ;IhBwDI;;;;AAKF;EACE;EACA,aExFuB;;ADKvB;EewBJ;IhB+DI;;;;AgB3DJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE,adxDiB;;;Ac2DnB;EACE,ad1DyB;;;Ac6D3B;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AC/EF;EACE;EACA;EACA;;AAGE;EACE;;;ACLN;EACE;EACA;;;AAQA;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AjBlCA;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAaN;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AjB7GA;EiBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjB/IJ;EiBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjB/IJ;EiBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjB/IJ;EiBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjB/IJ;EiBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AC3JR;EACE;AAAA;AAAA;AAAA;AAAA;AAAA;IAME;;EAGF;IACE;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;IACA;;;ACvCJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE,OrBCW;EqBAX,kBrBNsB;EqBOtB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ACnBF;EACE;;;AAGF;EACI;EACA;EACA,enB2EY;EmB1EZ;EACA;;AAEA;EACI,OnB6BI;EmB5BJ;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OnBmBM;EmBlBN;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,enBgDY;EmB/CZ;EACA;;AACA;EACE;EACA;EACA,OnBCM;EmBAN;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAMJ;EACI;EACA;EACA,enBEY;EmBDZ;EACA;;AAEA;EACI,OnBhDG;EmBiDH;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OnB1DK;EmB2DL;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,enBzBY;EmB0BZ;EACA;;AACA;EACE;EACA;EACA,OnB5EK;EmB6EL;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAMJ;EACI;EACA;EACA,enBvEY;EmBwEZ;EACA;;AAEA;EACI,OnBjHK;EmBkHL;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OnB3HO;EmB4HP;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,enBlGY;EmBmGZ;EACA;;AACA;EACE;EACA;EACA,OnB7IO;EmB8IP;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE","sourcesContent":["/*\ngenerated by accessible-pygments \nCopyright (c) 2022, Quansight Labs\nLicensed under the BSD license, see LICENSE for details.\n--\ngenerated by Pygments \nCopyright 2006-2025 by the Pygments team.\nLicensed under the BSD license, see LICENSE for details.\n*/\n\n.highlight .hll { background-color: #0969da4a }\n.highlight .c { color: #6E7781 } /* Comment */\n.highlight .err { color: #CF222E } /* Error */\n.highlight .k { color: #CF222E } /* Keyword */\n.highlight .l { color: #953800 } /* Literal */\n.highlight .n { color: #8250DF } /* Name */\n.highlight .o { color: #116329 } /* Operator */\n.highlight .p { color: #24292F } /* Punctuation */\n.highlight .ch { color: #6E7781 } /* Comment.Hashbang */\n.highlight .cm { color: #6E7781 } /* Comment.Multiline */\n.highlight .cp { color: #6E7781 } /* Comment.Preproc */\n.highlight .cpf { color: #6E7781 } /* Comment.PreprocFile */\n.highlight .c1 { color: #6E7781 } /* Comment.Single */\n.highlight .cs { color: #6E7781 } /* Comment.Special */\n.highlight .gd { color: #0550AE } /* Generic.Deleted */\n.highlight .ge { font-style: italic } /* Generic.Emph */\n.highlight .gr { color: #CF222E } /* Generic.Error */\n.highlight .gh { color: #0550AE } /* Generic.Heading */\n.highlight .gs { font-weight: bold } /* Generic.Strong */\n.highlight .gu { color: #0550AE } /* Generic.Subheading */\n.highlight .kc { color: #0550AE } /* Keyword.Constant */\n.highlight .kd { color: #CF222E } /* Keyword.Declaration */\n.highlight .kn { color: #CF222E } /* Keyword.Namespace */\n.highlight .kp { color: #CF222E } /* Keyword.Pseudo */\n.highlight .kr { color: #CF222E } /* Keyword.Reserved */\n.highlight .kt { color: #CF222E } /* Keyword.Type */\n.highlight .ld { color: #953800 } /* Literal.Date */\n.highlight .m { color: #953800 } /* Literal.Number */\n.highlight .s { color: #0550AE } /* Literal.String */\n.highlight .na { color: #953800 } /* Name.Attribute */\n.highlight .nb { color: #953800 } /* Name.Builtin */\n.highlight .nc { color: #0550AE } /* Name.Class */\n.highlight .no { color: #0550AE } /* Name.Constant */\n.highlight .nd { color: #953800 } /* Name.Decorator */\n.highlight .ni { color: #116329 } /* Name.Entity */\n.highlight .ne { color: #8250DF } /* Name.Exception */\n.highlight .nf { color: #0550AE } /* Name.Function */\n.highlight .nl { color: #953800 } /* Name.Label */\n.highlight .nn { color: #24292F } /* Name.Namespace */\n.highlight .nx { color: #8250DF } /* Name.Other */\n.highlight .py { color: #0550AE } /* Name.Property */\n.highlight .nt { color: #116329 } /* Name.Tag */\n.highlight .nv { color: #953800 } /* Name.Variable */\n.highlight .ow { color: #8250DF } /* Operator.Word */\n.highlight .pm { color: #24292F } /* Punctuation.Marker */\n.highlight .w { color: #24292F } /* Text.Whitespace */\n.highlight .mb { color: #953800 } /* Literal.Number.Bin */\n.highlight .mf { color: #953800 } /* Literal.Number.Float */\n.highlight .mh { color: #953800 } /* Literal.Number.Hex */\n.highlight .mi { color: #953800 } /* Literal.Number.Integer */\n.highlight .mo { color: #953800 } /* Literal.Number.Oct */\n.highlight .sa { color: #0550AE } /* Literal.String.Affix */\n.highlight .sb { color: #0550AE } /* Literal.String.Backtick */\n.highlight .sc { color: #0550AE } /* Literal.String.Char */\n.highlight .dl { color: #0550AE } /* Literal.String.Delimiter */\n.highlight .sd { color: #0550AE } /* Literal.String.Doc */\n.highlight .s2 { color: #0550AE } /* Literal.String.Double */\n.highlight .se { color: #0550AE } /* Literal.String.Escape */\n.highlight .sh { color: #0550AE } /* Literal.String.Heredoc */\n.highlight .si { color: #0550AE } /* Literal.String.Interpol */\n.highlight .sx { color: #0550AE } /* Literal.String.Other */\n.highlight .sr { color: #0550AE } /* Literal.String.Regex */\n.highlight .s1 { color: #0550AE } /* Literal.String.Single */\n.highlight .ss { color: #0550AE } /* Literal.String.Symbol */\n.highlight .bp { color: #953800 } /* Name.Builtin.Pseudo */\n.highlight .fm { color: #0550AE } /* Name.Function.Magic */\n.highlight .vc { color: #953800 } /* Name.Variable.Class */\n.highlight .vg { color: #953800 } /* Name.Variable.Global */\n.highlight .vi { color: #953800 } /* Name.Variable.Instance */\n.highlight .vm { color: #953800 } /* Name.Variable.Magic */\n.highlight .il { color: #953800 } /* Literal.Number.Integer.Long */\n","/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */\n\n/* Document\n ========================================================================== */\n\n/**\n * 1. Correct the line height in all browsers.\n * 2. Prevent adjustments of font size after orientation changes in iOS.\n */\n\nhtml {\n line-height: 1.15; /* 1 */\n text-size-adjust: 100%; /* 2 */\n}\n\n/* Sections\n ========================================================================== */\n\n/**\n * Remove the margin in all browsers.\n */\n\nbody {\n margin: 0;\n}\n\n/**\n * Render the `main` element consistently in IE.\n */\n\nmain {\n display: block;\n}\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n/* Grouping content\n ========================================================================== */\n\n/**\n * 1. Add the correct box sizing in Firefox.\n * 2. Show the overflow in Edge and IE.\n */\n\nhr {\n box-sizing: content-box; /* 1 */\n height: 0; /* 1 */\n overflow: visible; /* 2 */\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\npre {\n font-family: monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/* Text-level semantics\n ========================================================================== */\n\n/**\n * Remove the gray background on active links in IE 10.\n */\n\na {\n background-color: transparent;\n}\n\n/**\n * 1. Remove the bottom border in Chrome 57-\n * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n */\n\nabbr[title] {\n border-bottom: none; /* 1 */\n text-decoration: underline; /* 2 */\n text-decoration: underline dotted; /* 2 */\n}\n\n/**\n * Add the correct font weight in Chrome, Edge, and Safari.\n */\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\ncode,\nkbd,\nsamp {\n font-family: monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/**\n * Add the correct font size in all browsers.\n */\n\nsmall {\n font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` elements from affecting the line height in\n * all browsers.\n */\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/* Embedded content\n ========================================================================== */\n\n/**\n * Remove the border on images inside links in IE 10.\n */\n\nimg {\n border-style: none;\n}\n\n/* Forms\n ========================================================================== */\n\n/**\n * 1. Change the font styles in all browsers.\n * 2. Remove the margin in Firefox and Safari.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-size: 100%; /* 1 */\n line-height: 1.15; /* 1 */\n margin: 0; /* 2 */\n}\n\n/**\n * Show the overflow in IE.\n * 1. Show the overflow in Edge.\n */\n\nbutton,\ninput {\n /* 1 */\n overflow: visible;\n}\n\n/**\n * Remove the inheritance of text transform in Edge, Firefox, and IE.\n * 1. Remove the inheritance of text transform in Firefox.\n */\n\nbutton,\nselect {\n /* 1 */\n text-transform: none;\n}\n\n/**\n * Correct the inability to style clickable types in iOS and Safari.\n */\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n appearance: button;\n}\n\n/**\n * Remove the inner border and padding in Firefox.\n */\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n border-style: none;\n padding: 0;\n}\n\n/**\n * Restore the focus styles unset by the previous rule.\n */\n\nbutton:-moz-focusring,\n[type=\"button\"]:-moz-focusring,\n[type=\"reset\"]:-moz-focusring,\n[type=\"submit\"]:-moz-focusring {\n outline: 1px dotted ButtonText;\n}\n\n/**\n * Correct the padding in Firefox.\n */\n\nfieldset {\n padding: 0.35em 0.75em 0.625em;\n}\n\n/**\n * 1. Correct the text wrapping in Edge and IE.\n * 2. Correct the color inheritance from `fieldset` elements in IE.\n * 3. Remove the padding so developers are not caught out when they zero out\n * `fieldset` elements in all browsers.\n */\n\nlegend {\n box-sizing: border-box; /* 1 */\n color: inherit; /* 2 */\n display: table; /* 1 */\n max-width: 100%; /* 1 */\n padding: 0; /* 3 */\n white-space: normal; /* 1 */\n}\n\n/**\n * Add the correct vertical alignment in Chrome, Firefox, and Opera.\n */\n\nprogress {\n vertical-align: baseline;\n}\n\n/**\n * Remove the default vertical scrollbar in IE 10+.\n */\n\ntextarea {\n overflow: auto;\n}\n\n/**\n * 1. Add the correct box sizing in IE 10.\n * 2. Remove the padding in IE 10.\n */\n\n[type=\"checkbox\"],\n[type=\"radio\"] {\n box-sizing: border-box; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Correct the cursor style of increment and decrement buttons in Chrome.\n */\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n/**\n * 1. Correct the odd appearance in Chrome and Safari.\n * 2. Correct the outline style in Safari.\n */\n\n[type=\"search\"] {\n appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/**\n * Remove the inner padding in Chrome and Safari on macOS.\n */\n\n[type=\"search\"]::-webkit-search-decoration {\n appearance: none;\n}\n\n/**\n * 1. Correct the inability to style clickable types in iOS and Safari.\n * 2. Change font properties to `inherit` in Safari.\n */\n\n::-webkit-file-upload-button {\n appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/* Interactive\n ========================================================================== */\n\n/*\n * Add the correct display in Edge, IE 10+, and Firefox.\n */\n\ndetails {\n display: block;\n}\n\n/*\n * Add the correct display in all browsers.\n */\n\nsummary {\n display: list-item;\n}\n\n/* Misc\n ========================================================================== */\n\n/**\n * Add the correct display in IE 10+.\n */\n\ntemplate {\n display: none;\n}\n\n/**\n * Add the correct display in IE 10.\n */\n\n[hidden] {\n display: none;\n}\n","// Base element style overrides\n// stylelint-disable selector-no-type, selector-max-type, selector-max-specificity, selector-max-id\n\n:root {\n color-scheme: $color-scheme;\n}\n\n* {\n box-sizing: border-box;\n}\n\nhtml {\n scroll-behavior: smooth;\n\n @include fs-4;\n}\n\nbody {\n font-family: $body-font-family;\n font-size: inherit;\n line-height: $body-line-height;\n color: $body-text-color;\n background-color: $body-background-color;\n overflow-wrap: break-word;\n}\n\nol,\nul,\ndl,\npre,\naddress,\nblockquote,\ntable,\ndiv,\nhr,\nform,\nfieldset,\nnoscript .table-wrapper {\n margin-top: 0;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n#toctitle {\n margin-top: 0;\n margin-bottom: 1em;\n font-weight: 500;\n line-height: $body-heading-line-height;\n color: $body-heading-color;\n}\n\np {\n margin-top: 1em;\n margin-bottom: 1em;\n}\n\na {\n color: $link-color;\n text-decoration: none;\n}\n\na:not([class]) {\n text-decoration: underline;\n text-decoration-color: $border-color;\n text-underline-offset: 2px;\n\n &:hover {\n text-decoration-color: rgba($link-color, 0.45);\n }\n}\n\ncode {\n font-family: $mono-font-family;\n font-size: 0.75em;\n line-height: $body-line-height;\n}\n\nfigure,\npre {\n margin: 0;\n}\n\nli {\n margin: 0.25em 0;\n}\n\nimg {\n max-width: 100%;\n height: auto;\n}\n\nhr {\n height: 1px;\n padding: 0;\n margin: $sp-6 0;\n background-color: $border-color;\n border: 0;\n}\n\n// adds a GitHub-style sidebar to blockquotes\nblockquote {\n margin: 10px 0;\n\n // resets user-agent stylesheets for blockquotes\n margin-block-start: 0;\n margin-inline-start: 0;\n padding-left: 1rem;\n border-left: 3px solid $border-color;\n}\n","// Meshtastic Material 3 — Light color scheme for just-the-docs\n// Source: core/ui/.../Color.kt §8.2 (Light Scheme)\n//\n// Brand colors:\n// Primary (Light): #2D8F52 (Green 700)\n// Surface (Light): #F5F6FA (Neutral 50)\n\n$color-scheme: light;\n\n// Body / page background\n$body-background-color: #F5F6FA; // Neutral 50 — surfaceLight\n$sidebar-color: #ECEDF3; // Neutral 100 — surfaceContainerLight\n$body-text-color: #2C2D3C; // Neutral 800 — onSurfaceLight\n$body-heading-color: #2C2D3C; // Neutral 800\n\n// Links\n$link-color: #2D8F52; // Green 700 — primaryLight\n$nav-link-color: #2D8F52; // Green 700\n\n// Navigation\n$nav-child-link-color: #555668; // Neutral 600 — secondaryLight\n$search-result-preview-color: #555668;\n\n// Code\n$code-background-color: #ECEDF3; // Neutral 100\n$code-linenumber-color: #9496A6; // Neutral 400\n\n// Borders\n$border-color: #D5D6E0; // Neutral 200 — outlineVariantLight\n$table-background-color: #F5F6FA; // Neutral 50\n\n// Buttons\n$btn-primary-color: #2D8F52; // Green 700\n\n// Feedback / callouts\n$feedback-color: #E0E1EB; // surfaceContainerHighLight\n\n// Search\n$search-background-color: #FFFFFF; // surfaceContainerLowestLight\n","@mixin fs-1 {\n & {\n font-size: $font-size-1 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-1-sm !important;\n }\n}\n\n@mixin fs-2 {\n & {\n font-size: $font-size-2 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-3 !important;\n }\n}\n\n@mixin fs-3 {\n & {\n font-size: $font-size-3 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-4 !important;\n }\n}\n\n@mixin fs-4 {\n & {\n font-size: $font-size-4 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-5 !important;\n }\n}\n\n@mixin fs-5 {\n & {\n font-size: $font-size-5 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-6 !important;\n }\n}\n\n@mixin fs-6 {\n & {\n font-size: $font-size-6 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-7 !important;\n line-height: $body-heading-line-height;\n }\n}\n\n@mixin fs-7 {\n & {\n font-size: $font-size-7 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-8 !important;\n }\n}\n\n@mixin fs-8 {\n & {\n font-size: $font-size-8 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-9 !important;\n }\n}\n\n@mixin fs-9 {\n & {\n font-size: $font-size-9 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-10 !important;\n }\n}\n\n@mixin fs-10 {\n & {\n font-size: $font-size-10 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-10-sm !important;\n }\n}\n","// Media query\n\n// Media query mixin\n// Usage:\n// @include mq(md) {\n// ..medium and up styles\n// }\n@mixin mq($name) {\n // Retrieves the value from the key\n $value: map-get($media-queries, $name);\n\n // If the key exists in the map\n @if $value {\n // Prints a media query based on the value\n @media (min-width: $value) {\n @content;\n }\n } @else {\n @warn \"No value could be retrieved from `#{$media-query}`. Please make sure it is defined in `$media-queries` map.\";\n }\n}\n\n// Responsive container\n\n@mixin container {\n padding-right: $gutter-spacing-sm;\n padding-left: $gutter-spacing-sm;\n\n @include mq(md) {\n padding-right: $gutter-spacing;\n padding-left: $gutter-spacing;\n }\n}\n","// Typography\n\n// prettier-ignore\n$body-font-family: system-ui, -apple-system, blinkmacsystemfont, \"Segoe UI\",\n roboto, \"Helvetica Neue\", arial, sans-serif, \"Segoe UI Emoji\" !default;\n$mono-font-family: \"SFMono-Regular\", menlo, consolas, monospace !default;\n$root-font-size: 16px !default; // DEPRECATED: previously base font-size for rems\n$body-line-height: 1.4 !default;\n$content-line-height: 1.6 !default;\n$body-heading-line-height: 1.25 !default;\n\n// Font size\n// `-sm` suffix is the size at the small (and above) media query\n\n$font-size-1: 0.5625rem !default;\n$font-size-1-sm: 0.625rem !default;\n$font-size-2: 0.6875rem !default; // h4 - uppercased!, h6 not uppercased, text-small\n$font-size-3: 0.75rem !default; // h5\n$font-size-4: 0.875rem !default;\n$font-size-5: 1rem !default; // h3\n$font-size-6: 1.125rem !default; // h2\n$font-size-7: 1.5rem !default;\n$font-size-8: 2rem !default; // h1\n$font-size-9: 2.25rem !default;\n$font-size-10: 2.625rem !default;\n$font-size-10-sm: 3rem !default;\n\n// Colors\n\n$white: #fff !default;\n$grey-dk-000: #959396 !default;\n$grey-dk-100: #5c5962 !default;\n$grey-dk-200: #44434d !default;\n$grey-dk-250: #302d36 !default;\n$grey-dk-300: #27262b !default;\n$grey-lt-000: #f5f6fa !default;\n$grey-lt-100: #eeebee !default;\n$grey-lt-200: #ecebed !default;\n$grey-lt-300: #e6e1e8 !default;\n$purple-000: #7253ed !default;\n$purple-100: #5e41d0 !default;\n$purple-200: #4e26af !default;\n$purple-300: #381885 !default;\n$blue-000: #2c84fa !default;\n$blue-100: #2869e6 !default;\n$blue-200: #264caf !default;\n$blue-300: #183385 !default;\n$green-000: #41d693 !default;\n$green-100: #11b584 !default;\n$green-200: #009c7b !default;\n$green-300: #026e57 !default;\n$yellow-000: #ffeb82 !default;\n$yellow-100: #fadf50 !default;\n$yellow-200: #f7d12e !default;\n$yellow-300: #e7af06 !default;\n$red-000: #f77e7e !default;\n$red-100: #f96e65 !default;\n$red-200: #e94c4c !default;\n$red-300: #dd2e2e !default;\n\n// Spacing\n\n$spacing-unit: 1rem; // 1rem == 16px\n\n$spacers: (\n sp-0: 0,\n sp-1: $spacing-unit * 0.25,\n sp-2: $spacing-unit * 0.5,\n sp-3: $spacing-unit * 0.75,\n sp-4: $spacing-unit,\n sp-5: $spacing-unit * 1.5,\n sp-6: $spacing-unit * 2,\n sp-7: $spacing-unit * 2.5,\n sp-8: $spacing-unit * 3,\n sp-9: $spacing-unit * 3.5,\n sp-10: $spacing-unit * 4,\n) !default;\n$sp-1: map-get($spacers, sp-1) !default; // 0.25 rem == 4px\n$sp-2: map-get($spacers, sp-2) !default; // 0.5 rem == 8px\n$sp-3: map-get($spacers, sp-3) !default; // 0.75 rem == 12px\n$sp-4: map-get($spacers, sp-4) !default; // 1 rem == 16px\n$sp-5: map-get($spacers, sp-5) !default; // 1.5 rem == 24px\n$sp-6: map-get($spacers, sp-6) !default; // 2 rem == 32px\n$sp-7: map-get($spacers, sp-7) !default; // 2.5 rem == 40px\n$sp-8: map-get($spacers, sp-8) !default; // 3 rem == 48px\n$sp-9: map-get($spacers, sp-9) !default; // 3.5 rem == 56px\n$sp-10: map-get($spacers, sp-10) !default; // 4 rem == 64px\n\n// Borders\n\n$border: 1px solid !default;\n$border-radius: 4px !default;\n$border-color: $grey-lt-100 !default;\n\n// Grid system\n\n$gutter-spacing: $sp-6 !default;\n$gutter-spacing-sm: $sp-4 !default;\n$nav-width: 16.5rem !default;\n$nav-width-md: 15.5rem !default;\n$nav-list-item-height: $sp-6 !default;\n$nav-list-item-height-sm: $sp-8 !default;\n$nav-list-expander-right: true;\n$content-width: 50rem !default;\n$header-height: 3.75rem !default;\n$search-results-width: $content-width - $nav-width !default;\n$transition-duration: 400ms;\n\n// Media queries in pixels\n\n$media-queries: (\n xs: 20rem,\n sm: 31.25rem,\n md: $content-width,\n lg: $content-width + $nav-width,\n xl: 87.5rem,\n) !default;\n","// The basic two column layout\n\n.side-bar {\n z-index: 0;\n display: flex;\n flex-wrap: wrap;\n background-color: $sidebar-color;\n\n @include mq(md) {\n flex-flow: column nowrap;\n position: fixed;\n width: $nav-width-md;\n height: 100%;\n border-right: $border $border-color;\n align-items: flex-end;\n }\n\n @include mq(lg) {\n width: calc((100% - #{$nav-width + $content-width}) / 2 + #{$nav-width});\n min-width: $nav-width;\n }\n\n & + .main {\n @include mq(md) {\n margin-left: $nav-width-md;\n }\n\n @include mq(lg) {\n // stylelint-disable function-name-case\n // disable for Max(), we want to use the CSS max() function\n margin-left: Max(\n #{$nav-width},\n calc((100% - #{$nav-width + $content-width}) / 2 + #{$nav-width})\n );\n // stylelint-enable function-name-case\n }\n\n .main-header {\n display: none;\n background-color: $sidebar-color;\n\n @include mq(md) {\n display: flex;\n background-color: $body-background-color;\n }\n\n &.nav-open {\n display: block;\n\n @include mq(md) {\n display: flex;\n }\n }\n }\n }\n}\n\n.main {\n margin: auto;\n\n @include mq(md) {\n position: relative;\n max-width: $content-width;\n }\n}\n\n.main-content-wrap {\n padding-top: $gutter-spacing-sm;\n padding-bottom: $gutter-spacing-sm;\n\n @include container;\n\n @include mq(md) {\n padding-top: $gutter-spacing;\n padding-bottom: $gutter-spacing;\n }\n}\n\n.main-header {\n z-index: 0;\n border-bottom: $border $border-color;\n\n @include mq(md) {\n display: flex;\n justify-content: space-between;\n height: $header-height;\n }\n}\n\n.site-nav,\n.site-header,\n.site-footer {\n width: 100%;\n\n @include mq(lg) {\n width: $nav-width;\n }\n}\n\n.site-nav {\n display: none;\n\n &.nav-open {\n display: block;\n }\n\n @include mq(md) {\n display: block;\n padding-top: $sp-8;\n padding-bottom: $gutter-spacing-sm;\n overflow-y: auto;\n flex: 1 1 auto;\n }\n}\n\n.site-header {\n display: flex;\n min-height: $header-height;\n align-items: center;\n\n @include mq(md) {\n height: $header-height;\n max-height: $header-height;\n border-bottom: $border $border-color;\n }\n}\n\n.site-title {\n flex-grow: 1;\n display: flex;\n height: 100%;\n align-items: center;\n padding-top: $sp-3;\n padding-bottom: $sp-3;\n color: $body-heading-color;\n\n @include container;\n\n @include fs-6;\n\n @include mq(md) {\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n }\n}\n\n@if variable-exists(logo) {\n .site-logo {\n width: 100%;\n height: 100%;\n background-image: url($logo);\n background-repeat: no-repeat;\n background-position: left center;\n background-size: contain;\n }\n}\n\n.site-button {\n display: flex;\n height: 100%;\n padding: $gutter-spacing-sm;\n align-items: center;\n}\n\n@include mq(md) {\n .site-header .site-button {\n display: none;\n }\n}\n\n.site-title:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 80%,\n rgba($feedback-color, 0) 100%\n );\n}\n\n.site-button:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 100%\n );\n}\n\n.site-footer {\n position: absolute;\n bottom: 0;\n left: 0;\n padding-top: $sp-4;\n padding-bottom: $sp-4;\n\n @include container;\n\n @include fs-2;\n\n @include mq(md) {\n position: static;\n justify-self: end;\n }\n}\n\n.icon {\n width: $sp-5;\n height: $sp-5;\n color: $link-color;\n}\n","@charset \"UTF-8\";\n\n// Styles for rendered markdown in the .main-content container\n// stylelint-disable selector-no-type, max-nesting-depth, selector-max-compound-selectors, selector-max-type, selector-max-specificity, selector-max-id\n\n.main-content {\n line-height: $content-line-height;\n\n ol,\n ul,\n dl,\n pre,\n address,\n blockquote,\n .table-wrapper {\n margin-top: 0.5em;\n }\n\n a {\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n ul,\n ol {\n padding-left: 1.5em;\n }\n\n li {\n .highlight {\n margin-top: $sp-1;\n }\n }\n\n ol {\n list-style-type: none;\n counter-reset: step-counter;\n\n > li {\n position: relative;\n\n &::before {\n position: absolute;\n top: 0.2em;\n left: -1.6em;\n color: $grey-dk-000;\n content: counter(step-counter);\n counter-increment: step-counter;\n @include fs-3;\n\n @include mq(sm) {\n top: 0.11em;\n }\n }\n\n ol {\n counter-reset: sub-counter;\n\n > li {\n &::before {\n content: counter(sub-counter, lower-alpha);\n counter-increment: sub-counter;\n }\n }\n }\n }\n }\n\n ul {\n list-style: none;\n\n > li {\n &::before {\n position: absolute;\n margin-left: -1.4em;\n color: $grey-dk-000;\n content: \"•\";\n }\n }\n }\n\n .task-list-item {\n &::before {\n content: \"\";\n }\n }\n\n .task-list-item-checkbox {\n margin-right: 0.6em;\n margin-left: -1.4em;\n\n // The same margin-left is used above for ul > li::before\n }\n\n hr + * {\n margin-top: 0;\n }\n\n h1:first-of-type {\n margin-top: 0.5em;\n }\n\n dl {\n display: grid;\n grid-template: auto / 10em 1fr;\n }\n\n dt,\n dd {\n margin: 0.25em 0;\n }\n\n dt {\n grid-column: 1;\n font-weight: 500;\n text-align: right;\n\n &::after {\n content: \":\";\n }\n }\n\n dd {\n grid-column: 2;\n margin-bottom: 0;\n margin-left: 1em;\n\n blockquote,\n div,\n dl,\n dt,\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n li,\n ol,\n p,\n pre,\n table,\n ul,\n .table-wrapper {\n &:first-child {\n margin-top: 0;\n }\n }\n }\n\n dd,\n ol,\n ul {\n dl:first-child {\n dt:first-child,\n dd:nth-child(2) {\n margin-top: 0;\n }\n }\n }\n\n .anchor-heading {\n position: absolute;\n right: -$sp-4;\n width: $sp-5;\n height: 100%;\n padding-right: $sp-1;\n padding-left: $sp-1;\n overflow: visible;\n\n @include mq(md) {\n right: auto;\n left: -$sp-5;\n }\n\n svg {\n display: inline-block;\n width: 100%;\n height: 100%;\n color: $link-color;\n visibility: hidden;\n }\n }\n\n .anchor-heading:hover,\n .anchor-heading:focus,\n h1:hover > .anchor-heading,\n h2:hover > .anchor-heading,\n h3:hover > .anchor-heading,\n h4:hover > .anchor-heading,\n h5:hover > .anchor-heading,\n h6:hover > .anchor-heading {\n svg {\n visibility: visible;\n }\n }\n\n summary {\n cursor: pointer;\n }\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n #toctitle {\n position: relative;\n margin-top: 1.5em;\n margin-bottom: 0.25em;\n\n + table,\n + .table-wrapper,\n + .code-example,\n + .highlighter-rouge,\n + .sectionbody .listingblock {\n margin-top: 1em;\n }\n\n + p:not(.label) {\n margin-top: 0;\n }\n }\n\n > h1:first-child,\n > h2:first-child,\n > h3:first-child,\n > h4:first-child,\n > h5:first-child,\n > h6:first-child,\n > .sect1:first-child > h2,\n > .sect2:first-child > h3,\n > .sect3:first-child > h4,\n > .sect4:first-child > h5,\n > .sect5:first-child > h6 {\n margin-top: $sp-2;\n }\n}\n","// Main nav, breadcrumb, etc...\n// stylelint-disable selector-no-type, max-nesting-depth, selector-max-compound-selectors, selector-max-type, selector-max-specificity\n\n.nav-list {\n padding: 0;\n margin-top: 0;\n margin-bottom: 0;\n list-style: none;\n\n .nav-list-item {\n position: relative;\n margin: 0;\n\n @include fs-4;\n\n @include mq(md) {\n @include fs-3;\n }\n\n .nav-list-link {\n display: block;\n min-height: $nav-list-item-height-sm;\n padding-top: $sp-1;\n padding-bottom: $sp-1;\n line-height: #{$nav-list-item-height-sm - 2 * $sp-1};\n @if $nav-list-expander-right {\n padding-right: $nav-list-item-height-sm;\n padding-left: $gutter-spacing-sm;\n } @else {\n padding-right: $gutter-spacing-sm;\n padding-left: $nav-list-item-height-sm;\n }\n\n @include mq(md) {\n min-height: $nav-list-item-height;\n line-height: #{$nav-list-item-height - 2 * $sp-1};\n @if $nav-list-expander-right {\n padding-right: $nav-list-item-height;\n padding-left: $gutter-spacing;\n } @else {\n padding-right: $gutter-spacing;\n padding-left: $nav-list-item-height;\n }\n }\n\n &.external > svg {\n width: $sp-4;\n height: $sp-4;\n vertical-align: text-bottom;\n }\n\n &.active {\n font-weight: 600;\n text-decoration: none;\n }\n\n &:hover,\n &.active {\n color: darken($link-color, 5%);\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 80%,\n rgba($feedback-color, 0) 100%\n );\n }\n }\n\n .nav-list-expander {\n position: absolute;\n @if $nav-list-expander-right {\n right: 0;\n }\n\n width: $nav-list-item-height-sm;\n height: $nav-list-item-height-sm;\n padding: #{$nav-list-item-height-sm * 0.25};\n color: $link-color;\n\n @include mq(md) {\n width: $nav-list-item-height;\n height: $nav-list-item-height;\n padding: #{$nav-list-item-height * 0.25};\n }\n\n &:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 100%\n );\n }\n\n @if $nav-list-expander-right {\n svg {\n transform: rotate(90deg);\n }\n }\n }\n\n > .nav-list {\n display: none;\n padding-left: $sp-3;\n list-style: none;\n\n .nav-list-item {\n position: relative;\n\n .nav-list-link {\n color: $nav-child-link-color;\n }\n\n .nav-list-expander {\n color: $nav-child-link-color;\n }\n }\n }\n\n &.active {\n > .nav-list-expander svg {\n @if $nav-list-expander-right {\n transform: rotate(-90deg);\n } @else {\n transform: rotate(90deg);\n }\n }\n\n > .nav-list {\n display: block;\n }\n }\n }\n}\n\n.nav-category {\n padding: $sp-2 $gutter-spacing-sm;\n font-weight: 600;\n text-align: start;\n text-transform: uppercase;\n border-bottom: $border $border-color;\n @include fs-2;\n\n @include mq(md) {\n padding: $sp-2 $gutter-spacing;\n margin-top: $gutter-spacing-sm;\n text-align: start;\n\n &:first-child {\n margin-top: 0;\n }\n }\n}\n\n.nav-list.nav-category-list {\n > .nav-list-item {\n margin: 0;\n\n > .nav-list {\n padding: 0;\n\n > .nav-list-item {\n > .nav-list-link {\n color: $link-color;\n }\n\n > .nav-list-expander {\n color: $link-color;\n }\n }\n }\n }\n}\n\n// Aux nav\n\n.aux-nav {\n height: 100%;\n overflow-x: auto;\n @include fs-2;\n\n .aux-nav-list {\n display: flex;\n height: 100%;\n padding: 0;\n margin: 0;\n list-style: none;\n }\n\n .aux-nav-list-item {\n display: inline-block;\n height: 100%;\n padding: 0;\n margin: 0;\n }\n\n @include mq(md) {\n padding-right: $gutter-spacing-sm;\n }\n}\n\n// Breadcrumb nav\n\n.breadcrumb-nav {\n @include mq(md) {\n margin-top: -$sp-4;\n }\n}\n\n.breadcrumb-nav-list {\n padding-left: 0;\n margin-bottom: $sp-3;\n list-style: none;\n}\n\n.breadcrumb-nav-list-item {\n display: table-cell;\n @include fs-2;\n\n &::before {\n display: none;\n }\n\n &::after {\n display: inline-block;\n margin-right: $sp-2;\n margin-left: $sp-2;\n color: $grey-dk-000;\n content: \"/\";\n }\n\n &:last-child {\n &::after {\n content: \"\";\n }\n }\n}\n","// Typography\n// stylelint-disable selector-no-type, selector-max-type, selector-max-specificity, selector-max-id\n\nh1,\n.text-alpha {\n font-weight: 300;\n\n @include fs-8;\n}\n\nh2,\n.text-beta,\n#toctitle {\n @include fs-6;\n}\n\nh3,\n.text-gamma {\n @include fs-5;\n}\n\nh4,\n.text-delta {\n font-weight: 400;\n text-transform: uppercase;\n letter-spacing: 0.1em;\n\n @include fs-2;\n}\n\nh4 code {\n text-transform: none;\n}\n\nh5,\n.text-epsilon {\n @include fs-3;\n}\n\nh6,\n.text-zeta {\n @include fs-2;\n}\n\n.text-small {\n @include fs-2;\n}\n\n.text-mono {\n font-family: $mono-font-family !important;\n}\n\n.text-left {\n text-align: left !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n.text-right {\n text-align: right !important;\n}\n","// Labels (not the form kind)\n\n// this :not() prevents a style clash with Mermaid.js's\n// diagram labels, which also use .label\n// for more, see https://github.com/just-the-docs/just-the-docs/issues/1272\n// and the accompanying PR\n.label:not(g),\n.label-blue:not(g) {\n display: inline-block;\n padding: 0.16em 0.56em;\n margin-right: $sp-2;\n margin-left: $sp-2;\n color: $white;\n text-transform: uppercase;\n vertical-align: middle;\n background-color: $blue-100;\n border-radius: 12px;\n\n @include fs-2;\n}\n\n.label-green:not(g) {\n background-color: $green-300;\n}\n\n.label-purple:not(g) {\n background-color: $purple-100;\n}\n\n.label-red:not(g) {\n background-color: $red-300;\n}\n\n.label-yellow:not(g) {\n color: $grey-dk-200;\n background-color: $yellow-200;\n}\n","// Buttons and things that look like buttons\n// stylelint-disable color-named\n\n.btn {\n display: inline-block;\n box-sizing: border-box;\n padding: 0.3em 1em;\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n font-weight: 500;\n line-height: 1.5;\n color: $link-color;\n text-decoration: none;\n vertical-align: baseline;\n cursor: pointer;\n background-color: $base-button-color;\n border-width: 0;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n appearance: none;\n\n &:focus {\n text-decoration: none;\n outline: none;\n box-shadow: 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:focus:hover,\n &.selected:focus {\n box-shadow: 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:hover,\n &.zeroclipboard-is-hover {\n color: darken($link-color, 2%);\n }\n\n &:hover,\n &:active,\n &.zeroclipboard-is-hover,\n &.zeroclipboard-is-active {\n text-decoration: none;\n background-color: darken($base-button-color, 1%);\n }\n\n &:active,\n &.selected,\n &.zeroclipboard-is-active {\n background-color: darken($base-button-color, 3%);\n background-image: none;\n box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15);\n }\n\n &.selected:hover {\n background-color: darken(#dcdcdc, 5%);\n }\n\n &:disabled,\n &.disabled {\n &,\n &:hover {\n color: rgba(102, 102, 102, 0.5);\n cursor: default;\n background-color: rgba(229, 229, 229, 0.5);\n background-image: none;\n box-shadow: none;\n }\n }\n}\n\n.btn-outline {\n color: $link-color;\n background: transparent;\n box-shadow: inset 0 0 0 2px $grey-lt-300;\n\n &:hover,\n &:active,\n &.zeroclipboard-is-hover,\n &.zeroclipboard-is-active {\n color: darken($link-color, 4%);\n text-decoration: none;\n background-color: transparent;\n box-shadow: inset 0 0 0 3px $grey-lt-300;\n }\n\n &:focus {\n text-decoration: none;\n outline: none;\n box-shadow:\n inset 0 0 0 2px $grey-dk-100,\n 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:focus:hover,\n &.selected:focus {\n box-shadow: inset 0 0 0 2px $grey-dk-100;\n }\n}\n\n.btn-primary {\n @include btn-color($white, $btn-primary-color);\n}\n\n.btn-purple {\n @include btn-color($white, $purple-100);\n}\n\n.btn-blue {\n @include btn-color($white, $blue-200);\n}\n\n.btn-green {\n @include btn-color($white, $green-300);\n}\n\n.btn-reset {\n background: none;\n border: none;\n margin: 0;\n text-align: inherit;\n font: inherit;\n border-radius: 0;\n appearance: none;\n}\n","$color-scheme: light !default;\n$body-background-color: $white !default;\n$body-heading-color: $grey-dk-300 !default;\n$body-text-color: $grey-dk-100 !default;\n$link-color: $purple-000 !default;\n$nav-child-link-color: $grey-dk-100 !default;\n$sidebar-color: $grey-lt-000 !default;\n$base-button-color: #f7f7f7 !default;\n$btn-primary-color: $purple-100 !default;\n$code-background-color: $white !default;\n$feedback-color: darken($sidebar-color, 3%) !default;\n$table-background-color: $white !default;\n$search-background-color: $white !default;\n$search-result-preview-color: $grey-dk-100 !default;\n\n@import \"./vendor/accessible-pygments/github-light\";\n","// Colored button\n\n@mixin btn-color($fg, $bg) {\n color: $fg;\n background-color: darken($bg, 2%);\n background-image: linear-gradient(lighten($bg, 5%), darken($bg, 2%));\n box-shadow:\n 0 1px 3px rgba(0, 0, 0, 0.25),\n 0 4px 10px rgba(0, 0, 0, 0.12);\n\n &:hover,\n &.zeroclipboard-is-hover {\n color: $fg;\n background-color: darken($bg, 4%);\n background-image: linear-gradient((lighten($bg, 2%), darken($bg, 4%)));\n }\n\n &:active,\n &.selected,\n &.zeroclipboard-is-active {\n background-color: darken($bg, 5%);\n background-image: none;\n box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15);\n }\n\n &.selected:hover {\n background-color: darken($bg, 10%);\n }\n}\n","// Search input and autocomplete\n\n.search {\n position: relative;\n z-index: 2;\n flex-grow: 1;\n height: $sp-10;\n padding: $sp-2;\n transition: padding linear #{$transition-duration * 0.5};\n\n @include mq(md) {\n position: relative !important;\n width: auto !important;\n height: 100% !important;\n padding: 0;\n transition: none;\n }\n}\n\n.search-input-wrap {\n position: relative;\n z-index: 1;\n height: $sp-8;\n overflow: hidden;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n transition: height linear #{$transition-duration * 0.5};\n\n @include mq(md) {\n position: absolute;\n width: 100%;\n max-width: $search-results-width;\n height: 100% !important;\n border-radius: 0;\n box-shadow: none;\n transition: width ease $transition-duration;\n }\n}\n\n.search-input {\n position: absolute;\n width: 100%;\n height: 100%;\n padding: $sp-2 $gutter-spacing-sm $sp-2 #{$gutter-spacing-sm + $sp-5};\n font-size: 1rem;\n color: $body-text-color;\n background-color: $search-background-color;\n border-top: 0;\n border-right: 0;\n border-bottom: 0;\n border-left: 0;\n border-radius: 0;\n\n @include mq(md) {\n padding: $sp-2 $gutter-spacing-sm $sp-2 #{$gutter-spacing + $sp-5};\n font-size: 0.875rem;\n background-color: $body-background-color;\n transition: padding-left linear #{$transition-duration * 0.5};\n }\n\n &:focus {\n outline: 2px solid $link-color;\n outline-offset: -2px;\n\n + .search-label .search-icon {\n color: $link-color;\n }\n }\n}\n\n.search-label {\n position: absolute;\n display: flex;\n height: 100%;\n padding-left: $gutter-spacing-sm;\n\n @include mq(md) {\n padding-left: $gutter-spacing;\n transition: padding-left linear #{$transition-duration * 0.5};\n }\n\n .search-icon {\n width: #{$sp-4 * 1.2};\n height: #{$sp-4 * 1.2};\n align-self: center;\n color: $grey-dk-000;\n }\n}\n\n.search-results {\n position: absolute;\n left: 0;\n display: none;\n width: 100%;\n max-height: calc(100% - #{$sp-10});\n overflow-y: auto;\n background-color: $search-background-color;\n border-bottom-right-radius: $border-radius;\n border-bottom-left-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n\n @include mq(md) {\n top: 100%;\n width: $search-results-width;\n max-height: calc(100vh - 200%) !important;\n }\n}\n\n.search-results-list {\n padding-left: 0;\n margin-bottom: $sp-1;\n list-style: none;\n @include fs-4;\n\n @include mq(md) {\n @include fs-3;\n }\n}\n\n.search-results-list-item {\n padding: 0;\n margin: 0;\n}\n\n.search-result {\n display: block;\n padding: $sp-1 $sp-3;\n\n &:hover,\n &.active {\n background-color: $feedback-color;\n }\n}\n\n.search-result-title {\n display: block;\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n\n @include mq(sm) {\n display: inline-block;\n width: 40%;\n padding-right: $sp-2;\n vertical-align: top;\n }\n}\n\n.search-result-doc {\n display: flex;\n align-items: center;\n word-wrap: break-word;\n\n &.search-result-doc-parent {\n opacity: 0.5;\n @include fs-3;\n\n @include mq(md) {\n @include fs-2;\n }\n }\n\n .search-result-icon {\n width: $sp-4;\n height: $sp-4;\n margin-right: $sp-2;\n color: $link-color;\n flex-shrink: 0;\n }\n\n .search-result-doc-title {\n overflow: auto;\n }\n}\n\n.search-result-section {\n margin-left: #{$sp-4 + $sp-2};\n word-wrap: break-word;\n}\n\n.search-result-rel-url {\n display: block;\n margin-left: #{$sp-4 + $sp-2};\n overflow: hidden;\n color: $search-result-preview-color;\n text-overflow: ellipsis;\n white-space: nowrap;\n @include fs-1;\n}\n\n.search-result-previews {\n display: block;\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n padding-left: $sp-4;\n margin-left: $sp-2;\n color: $search-result-preview-color;\n word-wrap: break-word;\n border-left: $border;\n border-left-color: $border-color;\n @include fs-2;\n\n @include mq(sm) {\n display: inline-block;\n width: 60%;\n padding-left: $sp-2;\n margin-left: 0;\n vertical-align: top;\n }\n}\n\n.search-result-preview + .search-result-preview {\n margin-top: $sp-1;\n}\n\n.search-result-highlight {\n font-weight: bold;\n}\n\n.search-no-result {\n padding: $sp-2 $sp-3;\n @include fs-3;\n}\n\n.search-button {\n position: fixed;\n right: $sp-4;\n bottom: $sp-4;\n display: flex;\n width: $sp-9;\n height: $sp-9;\n background-color: $search-background-color;\n border: 1px solid rgba($link-color, 0.3);\n border-radius: #{$sp-9 * 0.5};\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n align-items: center;\n justify-content: center;\n}\n\n.search-overlay {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1;\n width: 0;\n height: 0;\n background-color: rgba(0, 0, 0, 0.3);\n opacity: 0;\n transition:\n opacity ease $transition-duration,\n width 0s $transition-duration,\n height 0s $transition-duration;\n}\n\n.search-active {\n .search {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n padding: 0;\n }\n\n .search-input-wrap {\n height: $sp-10;\n border-radius: 0;\n\n @include mq(md) {\n width: $search-results-width;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n }\n }\n\n .search-input {\n background-color: $search-background-color;\n\n @include mq(md) {\n padding-left: 2.3rem;\n }\n }\n\n .search-label {\n @include mq(md) {\n padding-left: 0.6rem;\n }\n }\n\n .search-results {\n display: block;\n }\n\n .search-overlay {\n width: 100%;\n height: 100%;\n opacity: 1;\n transition:\n opacity ease $transition-duration,\n width 0s,\n height 0s;\n }\n\n @include mq(md) {\n .main {\n position: fixed;\n right: 0;\n left: 0;\n }\n }\n\n .main-header {\n padding-top: $sp-10;\n\n @include mq(md) {\n padding-top: 0;\n }\n }\n}\n","// Tables\n// stylelint-disable max-nesting-depth, selector-no-type, selector-max-type\n\n.table-wrapper {\n display: block;\n width: 100%;\n max-width: 100%;\n margin-bottom: $sp-5;\n overflow-x: auto;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n}\n\ntable {\n display: table;\n min-width: 100%;\n border-collapse: separate;\n}\n\nth,\ntd {\n min-width: 7.5rem;\n padding: $sp-2 $sp-3;\n background-color: $table-background-color;\n border-bottom: $border rgba($border-color, 0.5);\n border-left: $border $border-color;\n\n @include fs-3;\n\n &:first-of-type {\n border-left: 0;\n }\n}\n\ntbody {\n tr {\n &:last-of-type {\n th,\n td {\n border-bottom: 0;\n }\n\n td {\n padding-bottom: $sp-3;\n }\n }\n }\n}\n\nthead {\n th {\n border-bottom: $border $border-color;\n }\n}\n","// Code and syntax highlighting\n// stylelint-disable selector-no-qualifying-type, declaration-block-semicolon-newline-after,declaration-block-single-line-max-declarations, selector-no-type, selector-max-type, scss/comment-no-empty\n\n// {% raw %}\n\n// This instruction applies to all queues not within 'pre' or 'figure', avoiding 'code' generated by the highlight.\n:not(pre, figure) {\n & > code {\n padding: 0.2em 0.15em;\n font-weight: 400;\n background-color: $code-background-color;\n border: $border $border-color;\n border-radius: $border-radius;\n }\n}\n\n// Avoid appearance of dark border around visited code links in Safari\na:visited code {\n border-color: $border-color;\n}\n\n// Content structure for highlighted code blocks using fences or Liquid\n//\n// ```[LANG]...```, no kramdown line_numbers:\n// div.[language-LANG.]highlighter-rouge > div.highlight > pre.highlight > code\n//\n// ```[LANG]...```, kramdown line_numbers = true:\n// div.[language-LANG.]highlighter-rouge > div.highlight > pre.highlight > code\n// > div.table-wrapper > table.rouge-table > tbody > tr\n// > td.rouge-gutter.gl > pre.lineno\n// | td.rouge-code > pre\n//\n// {% highlight LANG %}...{% endhighlight %}:\n// figure.highlight > pre > code.language-LANG\n//\n// {% highlight LANG linenos %}...{% endhighlight %}:\n// figure.highlight > pre > code.language-LANG\n// > div.table-wrapper > table.rouge-table > tbody > tr\n// > td.gutter.gl > pre.lineno\n// | td.code > pre\n//\n// ----...---- (AsciiDoc)\n// div.listingblock > div.content > pre.rouge.highlight\n//\n// fix_linenos removes the outermost pre when it encloses table.rouge-table\n//\n// See docs/index-test.md for some tests.\n//\n// No kramdown line_numbers: fences and Liquid highlighting look the same.\n// Kramdown line_numbers = true: fences have a wider gutter than with Liquid?\n\n// ```[LANG]...```\n// or in AsciiDoc:\n//\n// ----\n// ...\n// ----\n\n// the code may appear with 3 different types:\n// container \\ case: default case, code with line number, code with html rendering\n// top level: div.highlighter-rouge, figure.highlight, figure.highlight\n// second level: div.highlight, div.table-wrapper, pre.highlight\n// third level: pre.highlight, td.code, absent\n// last level: code, pre, code (optionality)\n// highlighter level: span, span, span\n// the spacing are only in the second level for case 1, 3 and in the third level for case 2\n// in AsciiDoc, there is a parent container that contains optionally a title and the content.\n\n// select top level container\ndiv.highlighter-rouge,\ndiv.listingblock > div.content,\nfigure.highlight {\n margin-top: 0;\n margin-bottom: $sp-3;\n background-color: $code-background-color;\n border-radius: $border-radius;\n box-shadow: none;\n -webkit-overflow-scrolling: touch;\n position: relative;\n padding: 0;\n\n // copy button (or other button)\n // the button appear only when there is a hover on the code or focus on button\n > button {\n width: $sp-3;\n opacity: 0;\n position: absolute;\n top: 0;\n right: 0;\n padding: $sp-3;\n border: none;\n background: none;\n color: $body-text-color;\n box-sizing: content-box;\n\n svg {\n fill: $body-text-color;\n }\n\n &:active {\n text-decoration: none;\n outline: none;\n opacity: 1;\n }\n\n &:focus {\n opacity: 1;\n outline: 2px solid $link-color;\n }\n }\n\n // the button can be seen by doing a simple hover in the code, there is no need to go over the location of the button\n &:hover {\n > button {\n cursor: copy;\n opacity: 1;\n }\n }\n}\n\n// setting the spacing and scrollbar on the second level for the first case\n// remove all space on the second and third level\n// this is a mixin to accommodate for the slightly different structures generated via Markdown vs AsciiDoc\n@mixin scroll-and-spacing($code-div, $pre-select) {\n #{$code-div} {\n overflow-x: auto;\n padding: $sp-3;\n margin: 0;\n border: 1px solid $body-text-color;\n border-radius: $border-radius;\n }\n\n #{$pre-select},\n code {\n padding: 0;\n margin: 0;\n border: 0;\n }\n}\n\n// for Markdown\ndiv.highlighter-rouge {\n @include scroll-and-spacing(\"div.highlight\", \"pre.highlight\");\n}\n\n// for AsciiDoc. we also need to fix the margins for its parent container.\ndiv.listingblock {\n margin-top: 0;\n margin-bottom: $sp-3;\n\n @include scroll-and-spacing(\"div.content\", \"div.content > pre\");\n}\n\n// {% highlight LANG %}...{% endhighlight %},\n// {% highlight LANG linenos %}...{% endhighlight %}:\n\n// setting the spacing and scrollbar on the second level for the thirt case\n// the css rule are apply only to the last code enviroment\n// setting the scroolbar\nfigure.highlight {\n pre,\n :not(pre) > code {\n overflow-x: auto;\n padding: $sp-3;\n margin: 0;\n border: 1px solid $body-text-color;\n border-radius: $border-radius;\n }\n}\n\n// ```[LANG]...```, kramdown line_numbers = true,\n// {% highlight LANG linenos %}...{% endhighlight %}:\n\n// setting the spacing and scrollbar on the thirt level for the second case\n.highlight .table-wrapper {\n padding: $sp-3 0;\n margin: 0;\n border: 0;\n box-shadow: none;\n\n td,\n pre {\n min-width: 0;\n padding: 0;\n background-color: $code-background-color;\n border: 0;\n\n @include fs-2;\n }\n\n td.gl {\n width: 1em;\n padding-right: $sp-3;\n padding-left: $sp-3;\n }\n\n pre {\n margin: 0;\n line-height: 2;\n }\n}\n\n// Code examples: html render of a code\n.code-example,\n.listingblock > .title {\n padding: $sp-3;\n margin-bottom: $sp-3;\n overflow: auto;\n border: 1px solid $border-color;\n border-radius: $border-radius;\n\n + .highlighter-rouge,\n + .sectionbody .listingblock,\n + .content,\n + figure.highlight {\n position: relative;\n margin-top: -$sp-4;\n border-right: 1px solid $border-color;\n border-bottom: 1px solid $border-color;\n border-left: 1px solid $border-color;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n }\n}\n\n// Mermaid diagram code blocks should be left unstyled.\ncode.language-mermaid {\n padding: 0;\n background-color: inherit;\n border: 0;\n}\n\n// Override OneDarkJekyll Colors for Code Blocks\n.highlight,\npre.highlight {\n background: $code-background-color; // Code Background\n // For Backwards Compatibility Before $code-linenumber-color was added\n @if variable-exists(code-linenumber-color) {\n color: $code-linenumber-color; // Code Line Numbers\n } @else {\n color: $body-text-color; // Code Line Numbers\n }\n}\n\n// Override OneDarkJekyll Colors for Code Blocks\n.highlight pre {\n background: $code-background-color; // Code Background\n}\n\n// {% endraw %}\n","// Utility classes for colors\n\n// Text colors\n\n.text-grey-dk-000 {\n color: $grey-dk-000 !important;\n}\n\n.text-grey-dk-100 {\n color: $grey-dk-100 !important;\n}\n\n.text-grey-dk-200 {\n color: $grey-dk-200 !important;\n}\n\n.text-grey-dk-250 {\n color: $grey-dk-250 !important;\n}\n\n.text-grey-dk-300 {\n color: $grey-dk-300 !important;\n}\n\n.text-grey-lt-000 {\n color: $grey-lt-000 !important;\n}\n\n.text-grey-lt-100 {\n color: $grey-lt-100 !important;\n}\n\n.text-grey-lt-200 {\n color: $grey-lt-200 !important;\n}\n\n.text-grey-lt-300 {\n color: $grey-lt-300 !important;\n}\n\n.text-blue-000 {\n color: $blue-000 !important;\n}\n\n.text-blue-100 {\n color: $blue-100 !important;\n}\n\n.text-blue-200 {\n color: $blue-200 !important;\n}\n\n.text-blue-300 {\n color: $blue-300 !important;\n}\n\n.text-green-000 {\n color: $green-000 !important;\n}\n\n.text-green-100 {\n color: $green-100 !important;\n}\n\n.text-green-200 {\n color: $green-200 !important;\n}\n\n.text-green-300 {\n color: $green-300 !important;\n}\n\n.text-purple-000 {\n color: $purple-000 !important;\n}\n\n.text-purple-100 {\n color: $purple-100 !important;\n}\n\n.text-purple-200 {\n color: $purple-200 !important;\n}\n\n.text-purple-300 {\n color: $purple-300 !important;\n}\n\n.text-yellow-000 {\n color: $yellow-000 !important;\n}\n\n.text-yellow-100 {\n color: $yellow-100 !important;\n}\n\n.text-yellow-200 {\n color: $yellow-200 !important;\n}\n\n.text-yellow-300 {\n color: $yellow-300 !important;\n}\n\n.text-red-000 {\n color: $red-000 !important;\n}\n\n.text-red-100 {\n color: $red-100 !important;\n}\n\n.text-red-200 {\n color: $red-200 !important;\n}\n\n.text-red-300 {\n color: $red-300 !important;\n}\n\n// Background colors\n\n.bg-grey-dk-000 {\n background-color: $grey-dk-000 !important;\n}\n\n.bg-grey-dk-100 {\n background-color: $grey-dk-100 !important;\n}\n\n.bg-grey-dk-200 {\n background-color: $grey-dk-200 !important;\n}\n\n.bg-grey-dk-250 {\n background-color: $grey-dk-250 !important;\n}\n\n.bg-grey-dk-300 {\n background-color: $grey-dk-300 !important;\n}\n\n.bg-grey-lt-000 {\n background-color: $grey-lt-000 !important;\n}\n\n.bg-grey-lt-100 {\n background-color: $grey-lt-100 !important;\n}\n\n.bg-grey-lt-200 {\n background-color: $grey-lt-200 !important;\n}\n\n.bg-grey-lt-300 {\n background-color: $grey-lt-300 !important;\n}\n\n.bg-blue-000 {\n background-color: $blue-000 !important;\n}\n\n.bg-blue-100 {\n background-color: $blue-100 !important;\n}\n\n.bg-blue-200 {\n background-color: $blue-200 !important;\n}\n\n.bg-blue-300 {\n background-color: $blue-300 !important;\n}\n\n.bg-green-000 {\n background-color: $green-000 !important;\n}\n\n.bg-green-100 {\n background-color: $green-100 !important;\n}\n\n.bg-green-200 {\n background-color: $green-200 !important;\n}\n\n.bg-green-300 {\n background-color: $green-300 !important;\n}\n\n.bg-purple-000 {\n background-color: $purple-000 !important;\n}\n\n.bg-purple-100 {\n background-color: $purple-100 !important;\n}\n\n.bg-purple-200 {\n background-color: $purple-200 !important;\n}\n\n.bg-purple-300 {\n background-color: $purple-300 !important;\n}\n\n.bg-yellow-000 {\n background-color: $yellow-000 !important;\n}\n\n.bg-yellow-100 {\n background-color: $yellow-100 !important;\n}\n\n.bg-yellow-200 {\n background-color: $yellow-200 !important;\n}\n\n.bg-yellow-300 {\n background-color: $yellow-300 !important;\n}\n\n.bg-red-000 {\n background-color: $red-000 !important;\n}\n\n.bg-red-100 {\n background-color: $red-100 !important;\n}\n\n.bg-red-200 {\n background-color: $red-200 !important;\n}\n\n.bg-red-300 {\n background-color: $red-300 !important;\n}\n","// Utility classes for layout\n\n// Display\n\n.d-block {\n display: block !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-none {\n display: none !important;\n}\n\n// Screenreader-only\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border-width: 0;\n}\n\n@each $media-query in map-keys($media-queries) {\n @for $i from 1 through length($spacers) {\n @include mq($media-query) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .d-sm-block, .d-md-none, .d-lg-inline\n .d-#{$media-query}-block {\n display: block !important;\n }\n .d-#{$media-query}-flex {\n display: flex !important;\n }\n .d-#{$media-query}-inline {\n display: inline !important;\n }\n .d-#{$media-query}-inline-block {\n display: inline-block !important;\n }\n .d-#{$media-query}-none {\n display: none !important;\n }\n }\n }\n}\n\n// Horizontal alignment\n\n.float-left {\n float: left !important;\n}\n\n.float-right {\n float: right !important;\n}\n\n.flex-justify-start {\n justify-content: flex-start !important;\n}\n\n.flex-justify-end {\n justify-content: flex-end !important;\n}\n\n.flex-justify-between {\n justify-content: space-between !important;\n}\n\n.flex-justify-around {\n justify-content: space-around !important;\n}\n\n// Vertical alignment\n\n.v-align-baseline {\n vertical-align: baseline !important;\n}\n\n.v-align-bottom {\n vertical-align: bottom !important;\n}\n\n.v-align-middle {\n vertical-align: middle !important;\n}\n\n.v-align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.v-align-text-top {\n vertical-align: text-top !important;\n}\n\n.v-align-top {\n vertical-align: top !important;\n}\n","// Utility classes for typography\n\n.fs-1 {\n @include fs-1;\n}\n\n.fs-2 {\n @include fs-2;\n}\n\n.fs-3 {\n @include fs-3;\n}\n\n.fs-4 {\n @include fs-4;\n}\n\n.fs-5 {\n @include fs-5;\n}\n\n.fs-6 {\n @include fs-6;\n}\n\n.fs-7 {\n @include fs-7;\n}\n\n.fs-8 {\n @include fs-8;\n}\n\n.fs-9 {\n @include fs-9;\n}\n\n.fs-10 {\n @include fs-10;\n}\n\n.fw-300 {\n font-weight: 300 !important;\n}\n\n.fw-400 {\n font-weight: 400 !important;\n}\n\n.fw-500 {\n font-weight: 500 !important;\n}\n\n.fw-700 {\n font-weight: 700 !important;\n}\n\n.lh-0 {\n line-height: 0 !important;\n}\n\n.lh-default {\n line-height: $body-line-height;\n}\n\n.lh-tight {\n line-height: $body-heading-line-height;\n}\n\n.ls-5 {\n letter-spacing: 0.05em !important;\n}\n\n.ls-10 {\n letter-spacing: 0.1em !important;\n}\n\n.ls-0 {\n letter-spacing: 0 !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n","// Utility classes for lists\n\n// stylelint-disable selector-max-type\n\n.list-style-none {\n padding: 0 !important;\n margin: 0 !important;\n list-style: none !important;\n\n li {\n &::before {\n display: none !important;\n }\n }\n}\n","// Utility classes for margins and padding\n\n// stylelint-disable block-opening-brace-space-after, block-opening-brace-space-before\n\n// Margin spacer utilities\n\n.mx-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n}\n\n@for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .m-0, .m-1, .m-2...\n .m-#{$scale} {\n margin: #{$size} !important;\n }\n .mt-#{$scale} {\n margin-top: #{$size} !important;\n }\n .mr-#{$scale} {\n margin-right: #{$size} !important;\n }\n .mb-#{$scale} {\n margin-bottom: #{$size} !important;\n }\n .ml-#{$scale} {\n margin-left: #{$size} !important;\n }\n\n .mx-#{$scale} {\n margin-right: #{$size} !important;\n margin-left: #{$size} !important;\n }\n\n .my-#{$scale} {\n margin-top: #{$size} !important;\n margin-bottom: #{$size} !important;\n }\n\n .mxn-#{$scale} {\n margin-right: -#{$size} !important;\n margin-left: -#{$size} !important;\n }\n .mx-#{$scale}-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n}\n\n@each $media-query in map-keys($media-queries) {\n @for $i from 1 through length($spacers) {\n @include mq($media-query) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .m-sm-0, .m-md-1, .m-lg-2...\n .m-#{$media-query}-#{$scale} {\n margin: #{$size} !important;\n }\n .mt-#{$media-query}-#{$scale} {\n margin-top: #{$size} !important;\n }\n .mr-#{$media-query}-#{$scale} {\n margin-right: #{$size} !important;\n }\n .mb-#{$media-query}-#{$scale} {\n margin-bottom: #{$size} !important;\n }\n .ml-#{$media-query}-#{$scale} {\n margin-left: #{$size} !important;\n }\n\n .mx-#{$media-query}-#{$scale} {\n margin-right: #{$size} !important;\n margin-left: #{$size} !important;\n }\n\n .my-#{$media-query}-#{$scale} {\n margin-top: #{$size} !important;\n margin-bottom: #{$size} !important;\n }\n\n .mxn-#{$media-query}-#{$scale} {\n margin-right: -#{$size} !important;\n margin-left: -#{$size} !important;\n }\n }\n }\n}\n\n// Padding spacer utilities\n\n@for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .p-0, .p-1, .p-2...\n .p-#{$scale} {\n padding: #{$size} !important;\n }\n .pt-#{$scale} {\n padding-top: #{$size} !important;\n }\n .pr-#{$scale} {\n padding-right: #{$size} !important;\n }\n .pb-#{$scale} {\n padding-bottom: #{$size} !important;\n }\n .pl-#{$scale} {\n padding-left: #{$size} !important;\n }\n\n .px-#{$scale} {\n padding-right: #{$size} !important;\n padding-left: #{$size} !important;\n }\n\n .py-#{$scale} {\n padding-top: #{$size} !important;\n padding-bottom: #{$size} !important;\n }\n}\n\n@each $media-query in map-keys($media-queries) {\n @include mq($media-query) {\n @for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .p-sm-0, .p-md-1, .p-lg-2...\n .p-#{$media-query}-#{$scale} {\n padding: #{$size} !important;\n }\n .pt-#{$media-query}-#{$scale} {\n padding-top: #{$size} !important;\n }\n .pr-#{$media-query}-#{$scale} {\n padding-right: #{$size} !important;\n }\n .pb-#{$media-query}-#{$scale} {\n padding-bottom: #{$size} !important;\n }\n .pl-#{$media-query}-#{$scale} {\n padding-left: #{$size} !important;\n }\n\n .px-#{$media-query}-#{$scale} {\n padding-right: #{$size} !important;\n padding-left: #{$size} !important;\n }\n\n .py-#{$media-query}-#{$scale} {\n padding-top: #{$size} !important;\n padding-bottom: #{$size} !important;\n }\n }\n }\n}\n","// stylelint-disable selector-max-specificity, selector-max-id, selector-max-type, selector-no-qualifying-type\n\n@media print {\n .site-footer,\n .site-button,\n #edit-this-page,\n #back-to-top,\n .site-nav,\n .main-header {\n display: none !important;\n }\n\n hr {\n margin-top: 1rem;\n margin-bottom: 1rem;\n }\n\n .side-bar {\n width: 100%;\n height: auto;\n border-right: 0 !important;\n }\n\n .site-header {\n border-bottom: 1px solid $border-color;\n }\n\n .site-title {\n font-size: 1rem !important;\n font-weight: 700 !important;\n }\n\n .text-small {\n font-size: 8pt !important;\n }\n\n pre.highlight {\n border: 1px solid $border-color;\n }\n\n .main {\n max-width: none;\n margin-left: 0;\n }\n}\n","// Skipnav\n// Skip to main content\n\na.skip-to-main {\n left: -999px;\n position: absolute;\n top: auto;\n width: 1px;\n height: 1px;\n overflow: hidden;\n z-index: -999;\n}\n\na.skip-to-main:focus,\na.skip-to-main:active {\n color: $link-color;\n background-color: $body-background-color;\n left: auto;\n top: auto;\n width: 30%;\n height: auto;\n overflow: auto;\n margin: 10px 35%;\n padding: 5px;\n border-radius: 15px;\n border: 4px solid $btn-primary-color;\n text-align: center;\n font-size: 1.2em;\n z-index: 999;\n}\n","\n\n@import \"./support/support\";\n@import \"./custom/setup\";\n@import \"./color_schemes/light\";\n\n@import \"./color_schemes/meshtastic\";\n\n@import \"./modules\";\ndiv.opaque {\n background-color: $body-background-color;\n}\n\np.tip, blockquote.tip {\n border: 1px $green-000 solid;\n border-left: $border-radius solid $green-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $green-300;\n content: \"Tip\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .tip-title {\n color: $green-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.tip-title, blockquote.tip-title {\n border: 1px $green-000 solid;\n border-left: $border-radius solid $green-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $green-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.tip {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.tip-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n\np.note, blockquote.note {\n border: 1px $blue-000 solid;\n border-left: $border-radius solid $blue-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $blue-300;\n content: \"Note\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .note-title {\n color: $blue-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.note-title, blockquote.note-title {\n border: 1px $blue-000 solid;\n border-left: $border-radius solid $blue-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $blue-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.note {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.note-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n\np.warning, blockquote.warning {\n border: 1px $yellow-000 solid;\n border-left: $border-radius solid $yellow-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $yellow-300;\n content: \"Warning\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .warning-title {\n color: $yellow-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.warning-title, blockquote.warning-title {\n border: 1px $yellow-000 solid;\n border-left: $border-radius solid $yellow-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $yellow-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.warning {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.warning-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n@import \"./custom/custom\";\n\n\n"],"file":"just-the-docs-default.css"} \ No newline at end of file +{"version":3,"sourceRoot":"","sources":["../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/vendor/accessible-pygments/github-light.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/vendor/normalize.scss/normalize.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/base.scss","../../_sass/color_schemes/meshtastic.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/support/mixins/_typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/support/mixins/_layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/support/_variables.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/content.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/navigation.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/labels.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/buttons.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/color_schemes/light.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/support/mixins/_buttons.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/search.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/tables.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/code.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/utilities/_colors.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/utilities/_layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/utilities/_typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/utilities/_lists.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/utilities/_spacing.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/print.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/skiptomain.scss","just-the-docs-default.scss"],"names":[],"mappings":";AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA;EAAkB;;;AAClB;EAAgB;EAAiB;AACjC;EAAkB;EAAiB;AACnC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAkB;EAAiB;AACnC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAqB;AACtC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAoB;AACrC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAgB;EAAiB;AACjC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AChFlC;AAEA;AAAA;AAGA;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAAA;AAKA;EACE;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;EAEE;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;AAAA;EAGE;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;EAEE;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAAA;AAKA;AAAA;AAAA;AAAA;AAAA;EAKE;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;AAEE;EACA;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;AAEE;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;EAIE;;;AAGF;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;EAIE;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;EAIE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;EAEE;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;EAEE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AC1VF;EACE,cCGa;;;ADAf;EACE;;;AAGF;EACE;;AEmBA;EACE;;AClBA;EHHJ;IEyBI;;;;AFnBJ;EACE,aIfiB;EJgBjB;EACA,aIbiB;EJcjB,OCTgB;EDUhB,kBCZsB;EDatB;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAYE;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;EACA;EACA;EACA,aI1CyB;EJ2CzB,OCvCmB;;;AD0CrB;EACE;EACA;;;AAGF;EACE,OC7CW;ED8CX;;;AAGF;EACE;EACA,uBCvCa;EDwCb;;AAEA;EACE;;;AAIJ;EACE,aIvEiB;EJwEjB;EACA,aIvEiB;;;AJ0EnB;AAAA;EAEE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA,kBCvEa;EDwEb;;;AAIF;EACE;EAGA;EACA;EACA;EACA;;;AK7GF;EACE;EACA;EACA;EACA,kBJKc;;AEGZ;EEZJ;IAOI;IACA;IACA,ODwFW;ICvFX;IACA;IACA;;;AFAA;EEZJ;IAgBI;IACA,WD+EQ;;;ADpFR;EEQF;IAEI,aD2ES;;;ADrFX;EEQF;IAQI;;;AAOF;EACE;EACA,kBJ5BU;;AEGZ;EEuBA;IAKI;IACA,kBJjCgB;;;AIoClB;EACE;;AFjCJ;EEgCE;IAII;;;;AAOV;EACE;;AF5CE;EE2CJ;IAII;IACA,WDyCY;;;;ACrChB;EACE,aDaK;ECZL,gBDYK;EDvDL,eCuDK;EDtDL,cCsDK;;ADlEH;EEoDJ;IFrCI,eCqDG;IDpDH,cCoDG;;;ADpEH;EEoDJ;IAOI,aDSG;ICRH,gBDQG;;;;ACJP;EACE;EACA;;AFlEE;EEgEJ;IAKI;IACA;IACA,QDmBY;;;;ACfhB;AAAA;AAAA;EAGE;;AF9EE;EE2EJ;AAAA;AAAA;IAMI,ODGQ;;;;ACCZ;EACE;;AAEA;EACE;;AFzFA;EEqFJ;IAQI;IACA,aDxBG;ICyBH,gBD7BG;IC8BH;IACA;;;;AAIJ;EACE;EACA,YDbc;ECcd;;AFxGE;EEqGJ;IAMI,QDjBY;ICkBZ,YDlBY;ICmBZ;;;;AAIJ;EACE;EACA;EACA;EACA;EACA,aDrDK;ECsDL,gBDtDK;ECuDL,OJzHmB;EEYnB,eCuDK;EDtDL,cCsDK;;ADlEH;EEiHJ;IFlGI,eCqDG;IDpDH,cCoDG;;;AF/BL;EACE;;ACtCA;EEiHJ;IHvEI;IACA,aEhDuB;;;ADKvB;EEiHJ;IAcI,aD/DG;ICgEH,gBDhEG;;;;AC+EP;EACE;EACA;EACA,SDhFK;ECiFL;;;AFnJE;EEuJF;IACE;;;AAIJ;EACE;;;AAQF;EACE;;;AAOF;EACE;EACA;EACA;EACA,aD/GK;ECgHL,gBDhHK;EDvDL,eCuDK;EDtDL,cCsDK;;ADlEH;EE6KJ;IF9JI,eCqDG;IDpDH,cCoDG;;;AFvEL;EACE;;ACEA;EE6KJ;IH3KI;;;ACFA;EE6KJ;IAYI;IACA;;;;AAIJ;EACE,OD5HK;EC6HL,QD7HK;EC8HL,OJ/LW;;;AKXb;EACE,aFEoB;;AEApB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;;AAGF;EACE;EACA;;AAGF;AAAA;EAEE;;AAIA;EACE,YF+CC;;AE3CL;EACE;EACA;;AAEA;EACE;;AAEA;EACE;EACA;EACA;EACA,OFfM;EEgBN;EACA;;AJ1BN;EACE;;ACRA;EG2BE;IJfF;;;ACZA;EG2BE;IAUI;;;AAIJ;EACE;;AAGE;EACE;EACA;;AAOV;EACE;;AAGE;EACE;EACA;EACA,OF7CM;EE8CN;;AAMJ;EACE;;AAIJ;EACE;EACA;;AAKF;EACE;;AAGF;EACE;;AAGF;EACE;EACA;;AAGF;AAAA;EAEE;;AAGF;EACE;EACA;EACA;;AAEA;EACE;;AAIJ;EACE;EACA;EACA;;AAmBE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;;AASF;AAAA;AAAA;AAAA;AAAA;AAAA;EAEE;;AAKN;EACE;EACA;EACA,OFnFG;EEoFH;EACA,eFzFG;EE0FH,cF1FG;EE2FH;;AH1JA;EGmJF;IAUI;IACA;;;AAGF;EACE;EACA;EACA;EACA,OLnKO;EKoKP;;AAYF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;;AAIJ;EACE;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;EACA;EACA;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAKE;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;;AAIJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAWE,YF9JG;;;AG3EP;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;ALoBF;EACE;;AClBA;EILF;IL2BE;;;ACtBA;EDOF;IACE;;;ACRA;EILF;ILiBE;;;AKPA;EACE;EACA,YH+DC;EG9DD,aHuDC;EGtDD,gBHsDC;EGrDD;EAEE,eH0DD;EGzDC,cHqDD;;ADlEH;EIKA;IAeI,YHgDD;IG/CC;IAEE,eH6CH;IG5CG,cH4CH;;;AGrCD;EACE,OHkCD;EGjCC,QHiCD;EGhCC;;AAGF;EACE;EACA;;AAGF;EAEE;EACA;;AASJ;EACE;EAEE;EAGF,OHUC;EGTD,QHSC;EGRD;EACA,ON7DO;;AEFT;EIsDA;IAYI,OHED;IGDC,QHCD;IGAC;;;AAGF;EACE;;AAQA;EACE;;AAKN;EACE;EACA,cHvBC;EGwBD;;AAEA;EACE;;AAEA;EACE,ONzFa;;AM4Ff;EACE,ON7Fa;;AMmGjB;EAEI;;AAMJ;EACE;;;AAMR;EACE;EACA;EACA;EACA;EACA;;ALhIA;EACE;;ACEA;EIwHJ;ILtHI;;;ACFA;EIwHJ;IASI;IACA,YHhEG;IGiEH;;EAEA;IACE;;;;AAMJ;EACE;;AAEA;EACE;;AAGE;EACE,ONlJG;;AMqJL;EACE,ONtJG;;;AM+Jb;EACE;EACA;;ALtKA;EACE;;ACEA;EIiKJ;IL/JI;;;AKoKF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AJlLA;EIiKJ;IAqBI,eHpHG;;;;ADlEH;EI4LJ;IAEI;;;;AAIJ;EACE;EACA,eHnIK;EGoIL;;;AAGF;EACE;;AL5MA;EACE;;ACEA;EIwMJ;ILtMI;;;AK0MF;EACE;;AAGF;EACE;EACA,cHlJG;EGmJH,aHnJG;EGoJH,OHpMU;EGqMV;;AAIA;EACE;;;ACrON;AAAA;EAEE;;ANoEA;AAAA;EACE;EACA,aElEuB;;ADKvB;EKXJ;AAAA;IN4EI;;;;AA5BF;AAAA;AAAA;EACE;;ACtCA;EKJJ;AAAA;AAAA;IN8CI;IACA,aEhDuB;;;;AFgCzB;AAAA;EACE;;AC5BA;EKEJ;AAAA;IN8BI;;;;AMzBJ;AAAA;EAEE;EACA;EACA;;ANdA;AAAA;EACE;;ACEA;EKOJ;AAAA;INLI;;;;AMcJ;EACE;;;ANVA;AAAA;EACE;;ACRA;EKoBJ;AAAA;INRI;;;;AAfF;AAAA;EACE;;ACEA;EKyBJ;AAAA;INvBI;;;;AALF;EACE;;ACEA;EK8BJ;IN5BI;;;;AMgCJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;ACvDF;AAAA;EAEE;EACA;EACA,cLoEK;EKnEL,aLmEK;EKlEL,OLiBM;EKhBN;EACA;EACA,kBL6BS;EK5BT;;APLA;AAAA;EACE;;ACEA;EMRJ;AAAA;IPUI;;;;AOKJ;EACE,kBL4BU;;;AKzBZ;EACE,kBLcW;;;AKXb;EACE,kBL4BQ;;;AKzBV;EACE,OLFY;EKGZ,kBLkBW;;;AMlDb;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,OTIW;ESHX;EACA;EACA;EACA,kBCTkB;EDUlB;EACA,eNyEc;EMxEd,YACE;EAEF;;AAEA;EACE;EACA;EACA;;AAGF;EAEE;;AAGF;EAEE;;AAGF;EAIE;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;AAKA;EAEE;EACA;EACA;EACA;EACA;;;AAKN;EACE,OT1DW;ES2DX;EACA;;AAEA;EAIE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA,YACE;;AAIJ;EAEE;;;AAIJ;EEnGE,OR0BM;EQzBN;EACA;EACA,YACE;;AAGF;EAEE,ORiBI;EQhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;AFgFJ;EEvGE,OR0BM;EQzBN;EACA;EACA,YACE;;AAGF;EAEE,ORiBI;EQhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;AFoFJ;EE3GE,OR0BM;EQzBN;EACA;EACA,YACE;;AAGF;EAEE,ORiBI;EQhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;AFwFJ;EE/GE,OR0BM;EQzBN;EACA;EACA,YACE;;AAGF;EAEE,ORiBI;EQhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;AF4FJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AG3HF;EACE;EACA;EACA;EACA,QTgFM;ES/EN,STuEK;EStEL;;AVME;EUZJ;IASI;IACA;IACA;IACA;IACA;;;;AAIJ;EACE;EACA;EACA,QT8DK;ES7DL;EACA,eTmEc;ESlEd,YACE;EAEF;;AVdE;EUKJ;IAYI;IACA;IACA,WTwEmB;ISvEnB;IACA;IACA;IACA;;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA,OZnCgB;EYoChB,kBZVwB;EYWxB;EACA;EACA;EACA;EACA;;AVvCE;EU2BJ;IAeI;IACA;IACA,kBZhDoB;IYiDpB;;;AAGF;EACE;EACA;;AAEA;EACE,OZnDO;;;AYwDb;EACE;EACA;EACA;EACA,cTIK;;ADlEH;EU0DJ;IAOI,cTGG;ISFH;;;AAGF;EACE;EACA;EACA;EACA,OTzDU;;;AS6Dd;EACE;EACA;EACA;EACA;EACA;EACA;EACA,kBZ5DwB;EY6DxB,4BTRc;ESSd,2BTTc;ESUd,YACE;;AVxFA;EU6EJ;IAeI;IACA,OTFmB;ISGnB;;;;AAIJ;EACE;EACA,eTrCK;ESsCL;;AXpFA;EACE;;AClBA;EUkGJ;IX5EI;;;ACtBA;EDOF;IACE;;;ACRA;EUkGJ;IXtFI;;;;AWiGJ;EACE;EACA;;;AAGF;EACE;EACA;;AAEA;EAEE,kBZnGa;;;AYuGjB;EACE;EACA,aT9DK;ES+DL,gBT/DK;;ADhEH;EU4HJ;IAMI;IACA;IACA,eTpEG;ISqEH;;;;AAIJ;EACE;EACA;EACA;;AAEA;EACE;;AXxIF;EACE;;ACRA;EU8IF;IXlIE;;;ACZA;EDHF;IACE;;;ACEA;EU8IF;IX5IE;;;AWqJF;EACE,OTtFG;ESuFH,QTvFG;ESwFH,cT1FG;ES2FH,OZzJS;EY0JT;;AAGF;EACE;;;AAIJ;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA,OZtK4B;EYuK5B;EACA;;AX5LA;EACE;;ACYA;EUyKJ;IXjLI;;;;AW2LJ;EACE;EACA,aTrHK;ESsHL,gBTtHK;ESuHL,cTrHK;ESsHL,aTxHK;ESyHL,OZlL4B;EYmL5B;EACA,aT/GO;ESgHP,mBZ9Ka;;ACjBb;EACE;;ACEA;EUmLJ;IXjLI;;;ACFA;EUmLJ;IAaI;IACA;IACA,cTlIG;ISmIH;IACA;;;;AAIJ;EACE,YT1IK;;;AS6IP;EACE;;;AAGF;EACE;;AX1MA;EACE;;ACRA;EUgNJ;IXpMI;;;;AWyMJ;EACE;EACA,OTrJK;ESsJL,QTtJK;ESuJL;EACA,OTnJK;ESoJL,QTpJK;ESqJL,kBZpMwB;EYqMxB;EACA;EACA,YACE;EAEF;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YACE;;;AAMF;EACE;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE,QTxLI;ESyLJ;;AVjQA;EU+PF;IAKI,OTzKiB;IS0KjB,YACE;;;AAKN;EACE,kBZpPsB;;AExBtB;EU2QF;IAII;;;AV/QF;EUmRF;IAEI;;;AAIJ;EACE;;AAGF;EACE;EACA;EACA;EACA,YACE;;AVlSF;EUwSA;IACE;IACA;IACA;;;AAIJ;EACE,aTxOI;;ADxEJ;EU+SF;IAII;;;;AC9TN;EACE;EACA;EACA;EACA,eV0EK;EUzEL;EACA,eVkFc;EUjFd,YACE;;;AAIJ;EACE;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA,kBbIuB;EaHvB;EACA;;AZNA;AAAA;EACE;;ACRA;EWOJ;AAAA;IZKI;;;AYKF;AAAA;EACE;;;AAOE;AAAA;EAEE;;AAGF;EACE,gBVkCD;;;AU3BL;EACE;;;AC9CF;EACE;EACA;EACA,kBdcoB;EcbpB;EACA,eX+EY;;;AW1EhB;EACE,cdUa;;;AcyCf;AAAA;AAAA;EAGE;EACA,eXMK;EWLL,kBdlDsB;EcmDtB,eXgBc;EWfd;EACA;EACA;EACA;;AAIA;AAAA;AAAA;EACE,OXLG;EWMH;EACA;EACA;EACA;EACA,SXVG;EWWH;EACA;EACA,OdhFc;EciFd;;AAEA;AAAA;AAAA;EACE,MdpFY;;AcuFd;AAAA;AAAA;EACE;EACA;EACA;;AAGF;AAAA;AAAA;EACE;EACA;;AAMF;AAAA;AAAA;EACE;EACA;;;AASJ;EACE;EACA,SX/CG;EWgDH;EACA;EACA,eXtCY;;AWyCd;AAAA;EAEE;EACA;EACA;;;AAUJ;EACE;EACA,eXrEK;;AW6CL;EACE;EACA,SX/CG;EWgDH;EACA;EACA,eXtCY;;AWyCd;AAAA;EAEE;EACA;EACA;;;AAwBF;AAAA;EAEE;EACA,SXpFG;EWqFH;EACA;EACA,eX3EY;;;AWmFhB;EACE;EACA;EACA;EACA;;AAEA;AAAA;EAEE;EACA;EACA,kBdhKoB;EciKpB;;Ab9KF;AAAA;EACE;;ACEA;EYsKF;AAAA;IbpKE;;;Aa8KF;EACE;EACA,eXjHG;EWkHH,cXlHG;;AWqHL;EACE;EACA;;;AAKJ;AAAA;EAEE,SX9HK;EW+HL,eX/HK;EWgIL;EACA;EACA,eXtHc;;AWwHd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAIE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAKJ;EACE;EACA;EACA;;;AAIF;AAAA;EAEE,YdnNsB;EcsNpB,OdrNoB;;;Ac4NxB;EACE,Yd9NsB;;;AepBxB;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;ACvOF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AdrBE;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;AAQR;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AfhHA;EACE;;ACYA;EeZJ;IhBII;;;;AAKF;EACE;;ACEA;EeRJ;IhBUI;;;;AAKF;EACE;;ACRA;EeJJ;IhBgBI;;;;AAKF;EACE;;AClBA;EeAJ;IhBsBI;;;;AAKF;EACE;;AC5BA;EeIJ;IhB4BI;;;;AAKF;EACE;;ACtCA;EeQJ;IhBkCI;IACA,aEhDuB;;;;AFqDzB;EACE;EACA,aEvDuB;;ADKvB;EeYJ;IhB0CI;;;;AAKF;EACE;EACA,aElEuB;;ADKvB;EegBJ;IhBiDI;;;;AAKF;EACE;EACA,aE7EuB;;ADKvB;EeoBJ;IhBwDI;;;;AAKF;EACE;EACA,aExFuB;;ADKvB;EewBJ;IhB+DI;;;;AgB3DJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE,adxDiB;;;Ac2DnB;EACE,ad1DyB;;;Ac6D3B;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AC/EF;EACE;EACA;EACA;;AAGE;EACE;;;ACLN;EACE;EACA;;;AAQA;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AjBlCA;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAaN;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AjB7GA;EiBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjB/IJ;EiBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjB/IJ;EiBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjB/IJ;EiBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjB/IJ;EiBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AC3JR;EACE;AAAA;AAAA;AAAA;AAAA;AAAA;IAME;;EAGF;IACE;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;IACA;;;ACvCJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE,OrBCW;EqBAX,kBrBNsB;EqBOtB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ACnBF;EACE;;;AAGF;EACI;EACA;EACA,enB2EY;EmB1EZ;EACA;;AAEA;EACI,OnB6BI;EmB5BJ;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OnBmBM;EmBlBN;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,enBgDY;EmB/CZ;EACA;;AACA;EACE;EACA;EACA,OnBCM;EmBAN;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAMJ;EACI;EACA;EACA,enBEY;EmBDZ;EACA;;AAEA;EACI,OnBhDG;EmBiDH;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OnB1DK;EmB2DL;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,enBzBY;EmB0BZ;EACA;;AACA;EACE;EACA;EACA,OnB5EK;EmB6EL;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAMJ;EACI;EACA;EACA,enBvEY;EmBwEZ;EACA;;AAEA;EACI,OnBjHK;EmBkHL;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OnB3HO;EmB4HP;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,enBlGY;EmBmGZ;EACA;;AACA;EACE;EACA;EACA,OnB7IO;EmB8IP;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE","sourcesContent":["/*\ngenerated by accessible-pygments \nCopyright (c) 2022, Quansight Labs\nLicensed under the BSD license, see LICENSE for details.\n--\ngenerated by Pygments \nCopyright 2006-2025 by the Pygments team.\nLicensed under the BSD license, see LICENSE for details.\n*/\n\n.highlight .hll { background-color: #0969da4a }\n.highlight .c { color: #6E7781 } /* Comment */\n.highlight .err { color: #CF222E } /* Error */\n.highlight .k { color: #CF222E } /* Keyword */\n.highlight .l { color: #953800 } /* Literal */\n.highlight .n { color: #8250DF } /* Name */\n.highlight .o { color: #116329 } /* Operator */\n.highlight .p { color: #24292F } /* Punctuation */\n.highlight .ch { color: #6E7781 } /* Comment.Hashbang */\n.highlight .cm { color: #6E7781 } /* Comment.Multiline */\n.highlight .cp { color: #6E7781 } /* Comment.Preproc */\n.highlight .cpf { color: #6E7781 } /* Comment.PreprocFile */\n.highlight .c1 { color: #6E7781 } /* Comment.Single */\n.highlight .cs { color: #6E7781 } /* Comment.Special */\n.highlight .gd { color: #0550AE } /* Generic.Deleted */\n.highlight .ge { font-style: italic } /* Generic.Emph */\n.highlight .gr { color: #CF222E } /* Generic.Error */\n.highlight .gh { color: #0550AE } /* Generic.Heading */\n.highlight .gs { font-weight: bold } /* Generic.Strong */\n.highlight .gu { color: #0550AE } /* Generic.Subheading */\n.highlight .kc { color: #0550AE } /* Keyword.Constant */\n.highlight .kd { color: #CF222E } /* Keyword.Declaration */\n.highlight .kn { color: #CF222E } /* Keyword.Namespace */\n.highlight .kp { color: #CF222E } /* Keyword.Pseudo */\n.highlight .kr { color: #CF222E } /* Keyword.Reserved */\n.highlight .kt { color: #CF222E } /* Keyword.Type */\n.highlight .ld { color: #953800 } /* Literal.Date */\n.highlight .m { color: #953800 } /* Literal.Number */\n.highlight .s { color: #0550AE } /* Literal.String */\n.highlight .na { color: #953800 } /* Name.Attribute */\n.highlight .nb { color: #953800 } /* Name.Builtin */\n.highlight .nc { color: #0550AE } /* Name.Class */\n.highlight .no { color: #0550AE } /* Name.Constant */\n.highlight .nd { color: #953800 } /* Name.Decorator */\n.highlight .ni { color: #116329 } /* Name.Entity */\n.highlight .ne { color: #8250DF } /* Name.Exception */\n.highlight .nf { color: #0550AE } /* Name.Function */\n.highlight .nl { color: #953800 } /* Name.Label */\n.highlight .nn { color: #24292F } /* Name.Namespace */\n.highlight .nx { color: #8250DF } /* Name.Other */\n.highlight .py { color: #0550AE } /* Name.Property */\n.highlight .nt { color: #116329 } /* Name.Tag */\n.highlight .nv { color: #953800 } /* Name.Variable */\n.highlight .ow { color: #8250DF } /* Operator.Word */\n.highlight .pm { color: #24292F } /* Punctuation.Marker */\n.highlight .w { color: #24292F } /* Text.Whitespace */\n.highlight .mb { color: #953800 } /* Literal.Number.Bin */\n.highlight .mf { color: #953800 } /* Literal.Number.Float */\n.highlight .mh { color: #953800 } /* Literal.Number.Hex */\n.highlight .mi { color: #953800 } /* Literal.Number.Integer */\n.highlight .mo { color: #953800 } /* Literal.Number.Oct */\n.highlight .sa { color: #0550AE } /* Literal.String.Affix */\n.highlight .sb { color: #0550AE } /* Literal.String.Backtick */\n.highlight .sc { color: #0550AE } /* Literal.String.Char */\n.highlight .dl { color: #0550AE } /* Literal.String.Delimiter */\n.highlight .sd { color: #0550AE } /* Literal.String.Doc */\n.highlight .s2 { color: #0550AE } /* Literal.String.Double */\n.highlight .se { color: #0550AE } /* Literal.String.Escape */\n.highlight .sh { color: #0550AE } /* Literal.String.Heredoc */\n.highlight .si { color: #0550AE } /* Literal.String.Interpol */\n.highlight .sx { color: #0550AE } /* Literal.String.Other */\n.highlight .sr { color: #0550AE } /* Literal.String.Regex */\n.highlight .s1 { color: #0550AE } /* Literal.String.Single */\n.highlight .ss { color: #0550AE } /* Literal.String.Symbol */\n.highlight .bp { color: #953800 } /* Name.Builtin.Pseudo */\n.highlight .fm { color: #0550AE } /* Name.Function.Magic */\n.highlight .vc { color: #953800 } /* Name.Variable.Class */\n.highlight .vg { color: #953800 } /* Name.Variable.Global */\n.highlight .vi { color: #953800 } /* Name.Variable.Instance */\n.highlight .vm { color: #953800 } /* Name.Variable.Magic */\n.highlight .il { color: #953800 } /* Literal.Number.Integer.Long */\n","/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */\n\n/* Document\n ========================================================================== */\n\n/**\n * 1. Correct the line height in all browsers.\n * 2. Prevent adjustments of font size after orientation changes in iOS.\n */\n\nhtml {\n line-height: 1.15; /* 1 */\n text-size-adjust: 100%; /* 2 */\n}\n\n/* Sections\n ========================================================================== */\n\n/**\n * Remove the margin in all browsers.\n */\n\nbody {\n margin: 0;\n}\n\n/**\n * Render the `main` element consistently in IE.\n */\n\nmain {\n display: block;\n}\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n/* Grouping content\n ========================================================================== */\n\n/**\n * 1. Add the correct box sizing in Firefox.\n * 2. Show the overflow in Edge and IE.\n */\n\nhr {\n box-sizing: content-box; /* 1 */\n height: 0; /* 1 */\n overflow: visible; /* 2 */\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\npre {\n font-family: monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/* Text-level semantics\n ========================================================================== */\n\n/**\n * Remove the gray background on active links in IE 10.\n */\n\na {\n background-color: transparent;\n}\n\n/**\n * 1. Remove the bottom border in Chrome 57-\n * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n */\n\nabbr[title] {\n border-bottom: none; /* 1 */\n text-decoration: underline; /* 2 */\n text-decoration: underline dotted; /* 2 */\n}\n\n/**\n * Add the correct font weight in Chrome, Edge, and Safari.\n */\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\ncode,\nkbd,\nsamp {\n font-family: monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/**\n * Add the correct font size in all browsers.\n */\n\nsmall {\n font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` elements from affecting the line height in\n * all browsers.\n */\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/* Embedded content\n ========================================================================== */\n\n/**\n * Remove the border on images inside links in IE 10.\n */\n\nimg {\n border-style: none;\n}\n\n/* Forms\n ========================================================================== */\n\n/**\n * 1. Change the font styles in all browsers.\n * 2. Remove the margin in Firefox and Safari.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-size: 100%; /* 1 */\n line-height: 1.15; /* 1 */\n margin: 0; /* 2 */\n}\n\n/**\n * Show the overflow in IE.\n * 1. Show the overflow in Edge.\n */\n\nbutton,\ninput {\n /* 1 */\n overflow: visible;\n}\n\n/**\n * Remove the inheritance of text transform in Edge, Firefox, and IE.\n * 1. Remove the inheritance of text transform in Firefox.\n */\n\nbutton,\nselect {\n /* 1 */\n text-transform: none;\n}\n\n/**\n * Correct the inability to style clickable types in iOS and Safari.\n */\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n appearance: button;\n}\n\n/**\n * Remove the inner border and padding in Firefox.\n */\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n border-style: none;\n padding: 0;\n}\n\n/**\n * Restore the focus styles unset by the previous rule.\n */\n\nbutton:-moz-focusring,\n[type=\"button\"]:-moz-focusring,\n[type=\"reset\"]:-moz-focusring,\n[type=\"submit\"]:-moz-focusring {\n outline: 1px dotted ButtonText;\n}\n\n/**\n * Correct the padding in Firefox.\n */\n\nfieldset {\n padding: 0.35em 0.75em 0.625em;\n}\n\n/**\n * 1. Correct the text wrapping in Edge and IE.\n * 2. Correct the color inheritance from `fieldset` elements in IE.\n * 3. Remove the padding so developers are not caught out when they zero out\n * `fieldset` elements in all browsers.\n */\n\nlegend {\n box-sizing: border-box; /* 1 */\n color: inherit; /* 2 */\n display: table; /* 1 */\n max-width: 100%; /* 1 */\n padding: 0; /* 3 */\n white-space: normal; /* 1 */\n}\n\n/**\n * Add the correct vertical alignment in Chrome, Firefox, and Opera.\n */\n\nprogress {\n vertical-align: baseline;\n}\n\n/**\n * Remove the default vertical scrollbar in IE 10+.\n */\n\ntextarea {\n overflow: auto;\n}\n\n/**\n * 1. Add the correct box sizing in IE 10.\n * 2. Remove the padding in IE 10.\n */\n\n[type=\"checkbox\"],\n[type=\"radio\"] {\n box-sizing: border-box; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Correct the cursor style of increment and decrement buttons in Chrome.\n */\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n/**\n * 1. Correct the odd appearance in Chrome and Safari.\n * 2. Correct the outline style in Safari.\n */\n\n[type=\"search\"] {\n appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/**\n * Remove the inner padding in Chrome and Safari on macOS.\n */\n\n[type=\"search\"]::-webkit-search-decoration {\n appearance: none;\n}\n\n/**\n * 1. Correct the inability to style clickable types in iOS and Safari.\n * 2. Change font properties to `inherit` in Safari.\n */\n\n::-webkit-file-upload-button {\n appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/* Interactive\n ========================================================================== */\n\n/*\n * Add the correct display in Edge, IE 10+, and Firefox.\n */\n\ndetails {\n display: block;\n}\n\n/*\n * Add the correct display in all browsers.\n */\n\nsummary {\n display: list-item;\n}\n\n/* Misc\n ========================================================================== */\n\n/**\n * Add the correct display in IE 10+.\n */\n\ntemplate {\n display: none;\n}\n\n/**\n * Add the correct display in IE 10.\n */\n\n[hidden] {\n display: none;\n}\n","// Base element style overrides\n// stylelint-disable selector-no-type, selector-max-type, selector-max-specificity, selector-max-id\n\n:root {\n color-scheme: $color-scheme;\n}\n\n* {\n box-sizing: border-box;\n}\n\nhtml {\n scroll-behavior: smooth;\n\n @include fs-4;\n}\n\nbody {\n font-family: $body-font-family;\n font-size: inherit;\n line-height: $body-line-height;\n color: $body-text-color;\n background-color: $body-background-color;\n overflow-wrap: break-word;\n}\n\nol,\nul,\ndl,\npre,\naddress,\nblockquote,\ntable,\ndiv,\nhr,\nform,\nfieldset,\nnoscript .table-wrapper {\n margin-top: 0;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n#toctitle {\n margin-top: 0;\n margin-bottom: 1em;\n font-weight: 500;\n line-height: $body-heading-line-height;\n color: $body-heading-color;\n}\n\np {\n margin-top: 1em;\n margin-bottom: 1em;\n}\n\na {\n color: $link-color;\n text-decoration: none;\n}\n\na:not([class]) {\n text-decoration: underline;\n text-decoration-color: $border-color;\n text-underline-offset: 2px;\n\n &:hover {\n text-decoration-color: rgba($link-color, 0.45);\n }\n}\n\ncode {\n font-family: $mono-font-family;\n font-size: 0.75em;\n line-height: $body-line-height;\n}\n\nfigure,\npre {\n margin: 0;\n}\n\nli {\n margin: 0.25em 0;\n}\n\nimg {\n max-width: 100%;\n height: auto;\n}\n\nhr {\n height: 1px;\n padding: 0;\n margin: $sp-6 0;\n background-color: $border-color;\n border: 0;\n}\n\n// adds a GitHub-style sidebar to blockquotes\nblockquote {\n margin: 10px 0;\n\n // resets user-agent stylesheets for blockquotes\n margin-block-start: 0;\n margin-inline-start: 0;\n padding-left: 1rem;\n border-left: 3px solid $border-color;\n}\n","// Meshtastic Material 3 — Light color scheme for just-the-docs\n// Source: core/ui/.../Color.kt §8.2 (Light Scheme)\n//\n// Brand colors:\n// Primary (Light): #2D8F52 (Green 700)\n// Surface (Light): #F5F6FA (Neutral 50)\n\n$color-scheme: light;\n\n// Body / page background\n$body-background-color: #F5F6FA; // Neutral 50 — surfaceLight\n$sidebar-color: #ECEDF3; // Neutral 100 — surfaceContainerLight\n$body-text-color: #2C2D3C; // Neutral 800 — onSurfaceLight\n$body-heading-color: #2C2D3C; // Neutral 800\n\n// Links\n$link-color: #2D8F52; // Green 700 — primaryLight\n$nav-link-color: #2D8F52; // Green 700\n\n// Navigation\n$nav-child-link-color: #555668; // Neutral 600 — secondaryLight\n$search-result-preview-color: #555668;\n\n// Code\n$code-background-color: #ECEDF3; // Neutral 100\n$code-linenumber-color: #9496A6; // Neutral 400\n\n// Borders\n$border-color: #D5D6E0; // Neutral 200 — outlineVariantLight\n$table-background-color: #F5F6FA; // Neutral 50\n\n// Buttons\n$btn-primary-color: #2D8F52; // Green 700\n\n// Feedback / callouts\n$feedback-color: #E0E1EB; // surfaceContainerHighLight\n\n// Search\n$search-background-color: #FFFFFF; // surfaceContainerLowestLight\n","@mixin fs-1 {\n & {\n font-size: $font-size-1 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-1-sm !important;\n }\n}\n\n@mixin fs-2 {\n & {\n font-size: $font-size-2 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-3 !important;\n }\n}\n\n@mixin fs-3 {\n & {\n font-size: $font-size-3 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-4 !important;\n }\n}\n\n@mixin fs-4 {\n & {\n font-size: $font-size-4 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-5 !important;\n }\n}\n\n@mixin fs-5 {\n & {\n font-size: $font-size-5 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-6 !important;\n }\n}\n\n@mixin fs-6 {\n & {\n font-size: $font-size-6 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-7 !important;\n line-height: $body-heading-line-height;\n }\n}\n\n@mixin fs-7 {\n & {\n font-size: $font-size-7 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-8 !important;\n }\n}\n\n@mixin fs-8 {\n & {\n font-size: $font-size-8 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-9 !important;\n }\n}\n\n@mixin fs-9 {\n & {\n font-size: $font-size-9 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-10 !important;\n }\n}\n\n@mixin fs-10 {\n & {\n font-size: $font-size-10 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-10-sm !important;\n }\n}\n","// Media query\n\n// Media query mixin\n// Usage:\n// @include mq(md) {\n// ..medium and up styles\n// }\n@mixin mq($name) {\n // Retrieves the value from the key\n $value: map-get($media-queries, $name);\n\n // If the key exists in the map\n @if $value {\n // Prints a media query based on the value\n @media (min-width: $value) {\n @content;\n }\n } @else {\n @warn \"No value could be retrieved from `#{$media-query}`. Please make sure it is defined in `$media-queries` map.\";\n }\n}\n\n// Responsive container\n\n@mixin container {\n padding-right: $gutter-spacing-sm;\n padding-left: $gutter-spacing-sm;\n\n @include mq(md) {\n padding-right: $gutter-spacing;\n padding-left: $gutter-spacing;\n }\n}\n","// Typography\n\n// prettier-ignore\n$body-font-family: system-ui, -apple-system, blinkmacsystemfont, \"Segoe UI\",\n roboto, \"Helvetica Neue\", arial, sans-serif, \"Segoe UI Emoji\" !default;\n$mono-font-family: \"SFMono-Regular\", menlo, consolas, monospace !default;\n$root-font-size: 16px !default; // DEPRECATED: previously base font-size for rems\n$body-line-height: 1.4 !default;\n$content-line-height: 1.6 !default;\n$body-heading-line-height: 1.25 !default;\n\n// Font size\n// `-sm` suffix is the size at the small (and above) media query\n\n$font-size-1: 0.5625rem !default;\n$font-size-1-sm: 0.625rem !default;\n$font-size-2: 0.6875rem !default; // h4 - uppercased!, h6 not uppercased, text-small\n$font-size-3: 0.75rem !default; // h5\n$font-size-4: 0.875rem !default;\n$font-size-5: 1rem !default; // h3\n$font-size-6: 1.125rem !default; // h2\n$font-size-7: 1.5rem !default;\n$font-size-8: 2rem !default; // h1\n$font-size-9: 2.25rem !default;\n$font-size-10: 2.625rem !default;\n$font-size-10-sm: 3rem !default;\n\n// Colors\n\n$white: #fff !default;\n$grey-dk-000: #959396 !default;\n$grey-dk-100: #5c5962 !default;\n$grey-dk-200: #44434d !default;\n$grey-dk-250: #302d36 !default;\n$grey-dk-300: #27262b !default;\n$grey-lt-000: #f5f6fa !default;\n$grey-lt-100: #eeebee !default;\n$grey-lt-200: #ecebed !default;\n$grey-lt-300: #e6e1e8 !default;\n$purple-000: #7253ed !default;\n$purple-100: #5e41d0 !default;\n$purple-200: #4e26af !default;\n$purple-300: #381885 !default;\n$blue-000: #2c84fa !default;\n$blue-100: #2869e6 !default;\n$blue-200: #264caf !default;\n$blue-300: #183385 !default;\n$green-000: #41d693 !default;\n$green-100: #11b584 !default;\n$green-200: #009c7b !default;\n$green-300: #026e57 !default;\n$yellow-000: #ffeb82 !default;\n$yellow-100: #fadf50 !default;\n$yellow-200: #f7d12e !default;\n$yellow-300: #e7af06 !default;\n$red-000: #f77e7e !default;\n$red-100: #f96e65 !default;\n$red-200: #e94c4c !default;\n$red-300: #dd2e2e !default;\n\n// Spacing\n\n$spacing-unit: 1rem; // 1rem == 16px\n\n$spacers: (\n sp-0: 0,\n sp-1: $spacing-unit * 0.25,\n sp-2: $spacing-unit * 0.5,\n sp-3: $spacing-unit * 0.75,\n sp-4: $spacing-unit,\n sp-5: $spacing-unit * 1.5,\n sp-6: $spacing-unit * 2,\n sp-7: $spacing-unit * 2.5,\n sp-8: $spacing-unit * 3,\n sp-9: $spacing-unit * 3.5,\n sp-10: $spacing-unit * 4,\n) !default;\n$sp-1: map-get($spacers, sp-1) !default; // 0.25 rem == 4px\n$sp-2: map-get($spacers, sp-2) !default; // 0.5 rem == 8px\n$sp-3: map-get($spacers, sp-3) !default; // 0.75 rem == 12px\n$sp-4: map-get($spacers, sp-4) !default; // 1 rem == 16px\n$sp-5: map-get($spacers, sp-5) !default; // 1.5 rem == 24px\n$sp-6: map-get($spacers, sp-6) !default; // 2 rem == 32px\n$sp-7: map-get($spacers, sp-7) !default; // 2.5 rem == 40px\n$sp-8: map-get($spacers, sp-8) !default; // 3 rem == 48px\n$sp-9: map-get($spacers, sp-9) !default; // 3.5 rem == 56px\n$sp-10: map-get($spacers, sp-10) !default; // 4 rem == 64px\n\n// Borders\n\n$border: 1px solid !default;\n$border-radius: 4px !default;\n$border-color: $grey-lt-100 !default;\n\n// Grid system\n\n$gutter-spacing: $sp-6 !default;\n$gutter-spacing-sm: $sp-4 !default;\n$nav-width: 16.5rem !default;\n$nav-width-md: 15.5rem !default;\n$nav-list-item-height: $sp-6 !default;\n$nav-list-item-height-sm: $sp-8 !default;\n$nav-list-expander-right: true;\n$content-width: 50rem !default;\n$header-height: 3.75rem !default;\n$search-results-width: $content-width - $nav-width !default;\n$transition-duration: 400ms;\n\n// Media queries in pixels\n\n$media-queries: (\n xs: 20rem,\n sm: 31.25rem,\n md: $content-width,\n lg: $content-width + $nav-width,\n xl: 87.5rem,\n) !default;\n","// The basic two column layout\n\n.side-bar {\n z-index: 0;\n display: flex;\n flex-wrap: wrap;\n background-color: $sidebar-color;\n\n @include mq(md) {\n flex-flow: column nowrap;\n position: fixed;\n width: $nav-width-md;\n height: 100%;\n border-right: $border $border-color;\n align-items: flex-end;\n }\n\n @include mq(lg) {\n width: calc((100% - #{$nav-width + $content-width}) / 2 + #{$nav-width});\n min-width: $nav-width;\n }\n\n & + .main {\n @include mq(md) {\n margin-left: $nav-width-md;\n }\n\n @include mq(lg) {\n // stylelint-disable function-name-case\n // disable for Max(), we want to use the CSS max() function\n margin-left: Max(\n #{$nav-width},\n calc((100% - #{$nav-width + $content-width}) / 2 + #{$nav-width})\n );\n // stylelint-enable function-name-case\n }\n\n .main-header {\n display: none;\n background-color: $sidebar-color;\n\n @include mq(md) {\n display: flex;\n background-color: $body-background-color;\n }\n\n &.nav-open {\n display: block;\n\n @include mq(md) {\n display: flex;\n }\n }\n }\n }\n}\n\n.main {\n margin: auto;\n\n @include mq(md) {\n position: relative;\n max-width: $content-width;\n }\n}\n\n.main-content-wrap {\n padding-top: $gutter-spacing-sm;\n padding-bottom: $gutter-spacing-sm;\n\n @include container;\n\n @include mq(md) {\n padding-top: $gutter-spacing;\n padding-bottom: $gutter-spacing;\n }\n}\n\n.main-header {\n z-index: 0;\n border-bottom: $border $border-color;\n\n @include mq(md) {\n display: flex;\n justify-content: space-between;\n height: $header-height;\n }\n}\n\n.site-nav,\n.site-header,\n.site-footer {\n width: 100%;\n\n @include mq(lg) {\n width: $nav-width;\n }\n}\n\n.site-nav {\n display: none;\n\n &.nav-open {\n display: block;\n }\n\n @include mq(md) {\n display: block;\n padding-top: $sp-8;\n padding-bottom: $gutter-spacing-sm;\n overflow-y: auto;\n flex: 1 1 auto;\n }\n}\n\n.site-header {\n display: flex;\n min-height: $header-height;\n align-items: center;\n\n @include mq(md) {\n height: $header-height;\n max-height: $header-height;\n border-bottom: $border $border-color;\n }\n}\n\n.site-title {\n flex-grow: 1;\n display: flex;\n height: 100%;\n align-items: center;\n padding-top: $sp-3;\n padding-bottom: $sp-3;\n color: $body-heading-color;\n\n @include container;\n\n @include fs-6;\n\n @include mq(md) {\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n }\n}\n\n@if variable-exists(logo) {\n .site-logo {\n width: 100%;\n height: 100%;\n background-image: url($logo);\n background-repeat: no-repeat;\n background-position: left center;\n background-size: contain;\n }\n}\n\n.site-button {\n display: flex;\n height: 100%;\n padding: $gutter-spacing-sm;\n align-items: center;\n}\n\n@include mq(md) {\n .site-header .site-button {\n display: none;\n }\n}\n\n.site-title:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 80%,\n rgba($feedback-color, 0) 100%\n );\n}\n\n.site-button:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 100%\n );\n}\n\n.site-footer {\n position: absolute;\n bottom: 0;\n left: 0;\n padding-top: $sp-4;\n padding-bottom: $sp-4;\n\n @include container;\n\n @include fs-2;\n\n @include mq(md) {\n position: static;\n justify-self: end;\n }\n}\n\n.icon {\n width: $sp-5;\n height: $sp-5;\n color: $link-color;\n}\n","@charset \"UTF-8\";\n\n// Styles for rendered markdown in the .main-content container\n// stylelint-disable selector-no-type, max-nesting-depth, selector-max-compound-selectors, selector-max-type, selector-max-specificity, selector-max-id\n\n.main-content {\n line-height: $content-line-height;\n\n ol,\n ul,\n dl,\n pre,\n address,\n blockquote,\n .table-wrapper {\n margin-top: 0.5em;\n }\n\n a {\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n ul,\n ol {\n padding-left: 1.5em;\n }\n\n li {\n .highlight {\n margin-top: $sp-1;\n }\n }\n\n ol {\n list-style-type: none;\n counter-reset: step-counter;\n\n > li {\n position: relative;\n\n &::before {\n position: absolute;\n top: 0.2em;\n left: -1.6em;\n color: $grey-dk-000;\n content: counter(step-counter);\n counter-increment: step-counter;\n @include fs-3;\n\n @include mq(sm) {\n top: 0.11em;\n }\n }\n\n ol {\n counter-reset: sub-counter;\n\n > li {\n &::before {\n content: counter(sub-counter, lower-alpha);\n counter-increment: sub-counter;\n }\n }\n }\n }\n }\n\n ul {\n list-style: none;\n\n > li {\n &::before {\n position: absolute;\n margin-left: -1.4em;\n color: $grey-dk-000;\n content: \"•\";\n }\n }\n }\n\n .task-list-item {\n &::before {\n content: \"\";\n }\n }\n\n .task-list-item-checkbox {\n margin-right: 0.6em;\n margin-left: -1.4em;\n\n // The same margin-left is used above for ul > li::before\n }\n\n hr + * {\n margin-top: 0;\n }\n\n h1:first-of-type {\n margin-top: 0.5em;\n }\n\n dl {\n display: grid;\n grid-template: auto / 10em 1fr;\n }\n\n dt,\n dd {\n margin: 0.25em 0;\n }\n\n dt {\n grid-column: 1;\n font-weight: 500;\n text-align: right;\n\n &::after {\n content: \":\";\n }\n }\n\n dd {\n grid-column: 2;\n margin-bottom: 0;\n margin-left: 1em;\n\n blockquote,\n div,\n dl,\n dt,\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n li,\n ol,\n p,\n pre,\n table,\n ul,\n .table-wrapper {\n &:first-child {\n margin-top: 0;\n }\n }\n }\n\n dd,\n ol,\n ul {\n dl:first-child {\n dt:first-child,\n dd:nth-child(2) {\n margin-top: 0;\n }\n }\n }\n\n .anchor-heading {\n position: absolute;\n right: -$sp-4;\n width: $sp-5;\n height: 100%;\n padding-right: $sp-1;\n padding-left: $sp-1;\n overflow: visible;\n\n @include mq(md) {\n right: auto;\n left: -$sp-5;\n }\n\n svg {\n display: inline-block;\n width: 100%;\n height: 100%;\n color: $link-color;\n visibility: hidden;\n }\n }\n\n .anchor-heading:hover,\n .anchor-heading:focus,\n h1:hover > .anchor-heading,\n h2:hover > .anchor-heading,\n h3:hover > .anchor-heading,\n h4:hover > .anchor-heading,\n h5:hover > .anchor-heading,\n h6:hover > .anchor-heading {\n svg {\n visibility: visible;\n }\n }\n\n summary {\n cursor: pointer;\n }\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n #toctitle {\n position: relative;\n margin-top: 1.5em;\n margin-bottom: 0.25em;\n\n + table,\n + .table-wrapper,\n + .code-example,\n + .highlighter-rouge,\n + .sectionbody .listingblock {\n margin-top: 1em;\n }\n\n + p:not(.label) {\n margin-top: 0;\n }\n }\n\n > h1:first-child,\n > h2:first-child,\n > h3:first-child,\n > h4:first-child,\n > h5:first-child,\n > h6:first-child,\n > .sect1:first-child > h2,\n > .sect2:first-child > h3,\n > .sect3:first-child > h4,\n > .sect4:first-child > h5,\n > .sect5:first-child > h6 {\n margin-top: $sp-2;\n }\n}\n","// Main nav, breadcrumb, etc...\n// stylelint-disable selector-no-type, max-nesting-depth, selector-max-compound-selectors, selector-max-type, selector-max-specificity\n\n.nav-list {\n padding: 0;\n margin-top: 0;\n margin-bottom: 0;\n list-style: none;\n\n .nav-list-item {\n position: relative;\n margin: 0;\n\n @include fs-4;\n\n @include mq(md) {\n @include fs-3;\n }\n\n .nav-list-link {\n display: block;\n min-height: $nav-list-item-height-sm;\n padding-top: $sp-1;\n padding-bottom: $sp-1;\n line-height: #{$nav-list-item-height-sm - 2 * $sp-1};\n @if $nav-list-expander-right {\n padding-right: $nav-list-item-height-sm;\n padding-left: $gutter-spacing-sm;\n } @else {\n padding-right: $gutter-spacing-sm;\n padding-left: $nav-list-item-height-sm;\n }\n\n @include mq(md) {\n min-height: $nav-list-item-height;\n line-height: #{$nav-list-item-height - 2 * $sp-1};\n @if $nav-list-expander-right {\n padding-right: $nav-list-item-height;\n padding-left: $gutter-spacing;\n } @else {\n padding-right: $gutter-spacing;\n padding-left: $nav-list-item-height;\n }\n }\n\n &.external > svg {\n width: $sp-4;\n height: $sp-4;\n vertical-align: text-bottom;\n }\n\n &.active {\n font-weight: 600;\n text-decoration: none;\n }\n\n &:hover,\n &.active {\n color: darken($link-color, 5%);\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 80%,\n rgba($feedback-color, 0) 100%\n );\n }\n }\n\n .nav-list-expander {\n position: absolute;\n @if $nav-list-expander-right {\n right: 0;\n }\n\n width: $nav-list-item-height-sm;\n height: $nav-list-item-height-sm;\n padding: #{$nav-list-item-height-sm * 0.25};\n color: $link-color;\n\n @include mq(md) {\n width: $nav-list-item-height;\n height: $nav-list-item-height;\n padding: #{$nav-list-item-height * 0.25};\n }\n\n &:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 100%\n );\n }\n\n @if $nav-list-expander-right {\n svg {\n transform: rotate(90deg);\n }\n }\n }\n\n > .nav-list {\n display: none;\n padding-left: $sp-3;\n list-style: none;\n\n .nav-list-item {\n position: relative;\n\n .nav-list-link {\n color: $nav-child-link-color;\n }\n\n .nav-list-expander {\n color: $nav-child-link-color;\n }\n }\n }\n\n &.active {\n > .nav-list-expander svg {\n @if $nav-list-expander-right {\n transform: rotate(-90deg);\n } @else {\n transform: rotate(90deg);\n }\n }\n\n > .nav-list {\n display: block;\n }\n }\n }\n}\n\n.nav-category {\n padding: $sp-2 $gutter-spacing-sm;\n font-weight: 600;\n text-align: start;\n text-transform: uppercase;\n border-bottom: $border $border-color;\n @include fs-2;\n\n @include mq(md) {\n padding: $sp-2 $gutter-spacing;\n margin-top: $gutter-spacing-sm;\n text-align: start;\n\n &:first-child {\n margin-top: 0;\n }\n }\n}\n\n.nav-list.nav-category-list {\n > .nav-list-item {\n margin: 0;\n\n > .nav-list {\n padding: 0;\n\n > .nav-list-item {\n > .nav-list-link {\n color: $link-color;\n }\n\n > .nav-list-expander {\n color: $link-color;\n }\n }\n }\n }\n}\n\n// Aux nav\n\n.aux-nav {\n height: 100%;\n overflow-x: auto;\n @include fs-2;\n\n .aux-nav-list {\n display: flex;\n height: 100%;\n padding: 0;\n margin: 0;\n list-style: none;\n }\n\n .aux-nav-list-item {\n display: inline-block;\n height: 100%;\n padding: 0;\n margin: 0;\n }\n\n @include mq(md) {\n padding-right: $gutter-spacing-sm;\n }\n}\n\n// Breadcrumb nav\n\n.breadcrumb-nav {\n @include mq(md) {\n margin-top: -$sp-4;\n }\n}\n\n.breadcrumb-nav-list {\n padding-left: 0;\n margin-bottom: $sp-3;\n list-style: none;\n}\n\n.breadcrumb-nav-list-item {\n display: table-cell;\n @include fs-2;\n\n &::before {\n display: none;\n }\n\n &::after {\n display: inline-block;\n margin-right: $sp-2;\n margin-left: $sp-2;\n color: $grey-dk-000;\n content: \"/\";\n }\n\n &:last-child {\n &::after {\n content: \"\";\n }\n }\n}\n","// Typography\n// stylelint-disable selector-no-type, selector-max-type, selector-max-specificity, selector-max-id\n\nh1,\n.text-alpha {\n font-weight: 300;\n\n @include fs-8;\n}\n\nh2,\n.text-beta,\n#toctitle {\n @include fs-6;\n}\n\nh3,\n.text-gamma {\n @include fs-5;\n}\n\nh4,\n.text-delta {\n font-weight: 400;\n text-transform: uppercase;\n letter-spacing: 0.1em;\n\n @include fs-2;\n}\n\nh4 code {\n text-transform: none;\n}\n\nh5,\n.text-epsilon {\n @include fs-3;\n}\n\nh6,\n.text-zeta {\n @include fs-2;\n}\n\n.text-small {\n @include fs-2;\n}\n\n.text-mono {\n font-family: $mono-font-family !important;\n}\n\n.text-left {\n text-align: left !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n.text-right {\n text-align: right !important;\n}\n","// Labels (not the form kind)\n\n// this :not() prevents a style clash with Mermaid.js's\n// diagram labels, which also use .label\n// for more, see https://github.com/just-the-docs/just-the-docs/issues/1272\n// and the accompanying PR\n.label:not(g),\n.label-blue:not(g) {\n display: inline-block;\n padding: 0.16em 0.56em;\n margin-right: $sp-2;\n margin-left: $sp-2;\n color: $white;\n text-transform: uppercase;\n vertical-align: middle;\n background-color: $blue-100;\n border-radius: 12px;\n\n @include fs-2;\n}\n\n.label-green:not(g) {\n background-color: $green-300;\n}\n\n.label-purple:not(g) {\n background-color: $purple-100;\n}\n\n.label-red:not(g) {\n background-color: $red-300;\n}\n\n.label-yellow:not(g) {\n color: $grey-dk-200;\n background-color: $yellow-200;\n}\n","// Buttons and things that look like buttons\n// stylelint-disable color-named\n\n.btn {\n display: inline-block;\n box-sizing: border-box;\n padding: 0.3em 1em;\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n font-weight: 500;\n line-height: 1.5;\n color: $link-color;\n text-decoration: none;\n vertical-align: baseline;\n cursor: pointer;\n background-color: $base-button-color;\n border-width: 0;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n appearance: none;\n\n &:focus {\n text-decoration: none;\n outline: none;\n box-shadow: 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:focus:hover,\n &.selected:focus {\n box-shadow: 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:hover,\n &.zeroclipboard-is-hover {\n color: darken($link-color, 2%);\n }\n\n &:hover,\n &:active,\n &.zeroclipboard-is-hover,\n &.zeroclipboard-is-active {\n text-decoration: none;\n background-color: darken($base-button-color, 1%);\n }\n\n &:active,\n &.selected,\n &.zeroclipboard-is-active {\n background-color: darken($base-button-color, 3%);\n background-image: none;\n box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15);\n }\n\n &.selected:hover {\n background-color: darken(#dcdcdc, 5%);\n }\n\n &:disabled,\n &.disabled {\n &,\n &:hover {\n color: rgba(102, 102, 102, 0.5);\n cursor: default;\n background-color: rgba(229, 229, 229, 0.5);\n background-image: none;\n box-shadow: none;\n }\n }\n}\n\n.btn-outline {\n color: $link-color;\n background: transparent;\n box-shadow: inset 0 0 0 2px $grey-lt-300;\n\n &:hover,\n &:active,\n &.zeroclipboard-is-hover,\n &.zeroclipboard-is-active {\n color: darken($link-color, 4%);\n text-decoration: none;\n background-color: transparent;\n box-shadow: inset 0 0 0 3px $grey-lt-300;\n }\n\n &:focus {\n text-decoration: none;\n outline: none;\n box-shadow:\n inset 0 0 0 2px $grey-dk-100,\n 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:focus:hover,\n &.selected:focus {\n box-shadow: inset 0 0 0 2px $grey-dk-100;\n }\n}\n\n.btn-primary {\n @include btn-color($white, $btn-primary-color);\n}\n\n.btn-purple {\n @include btn-color($white, $purple-100);\n}\n\n.btn-blue {\n @include btn-color($white, $blue-200);\n}\n\n.btn-green {\n @include btn-color($white, $green-300);\n}\n\n.btn-reset {\n background: none;\n border: none;\n margin: 0;\n text-align: inherit;\n font: inherit;\n border-radius: 0;\n appearance: none;\n}\n","$color-scheme: light !default;\n$body-background-color: $white !default;\n$body-heading-color: $grey-dk-300 !default;\n$body-text-color: $grey-dk-100 !default;\n$link-color: $purple-000 !default;\n$nav-child-link-color: $grey-dk-100 !default;\n$sidebar-color: $grey-lt-000 !default;\n$base-button-color: #f7f7f7 !default;\n$btn-primary-color: $purple-100 !default;\n$code-background-color: $white !default;\n$feedback-color: darken($sidebar-color, 3%) !default;\n$table-background-color: $white !default;\n$search-background-color: $white !default;\n$search-result-preview-color: $grey-dk-100 !default;\n\n@import \"./vendor/accessible-pygments/github-light\";\n","// Colored button\n\n@mixin btn-color($fg, $bg) {\n color: $fg;\n background-color: darken($bg, 2%);\n background-image: linear-gradient(lighten($bg, 5%), darken($bg, 2%));\n box-shadow:\n 0 1px 3px rgba(0, 0, 0, 0.25),\n 0 4px 10px rgba(0, 0, 0, 0.12);\n\n &:hover,\n &.zeroclipboard-is-hover {\n color: $fg;\n background-color: darken($bg, 4%);\n background-image: linear-gradient((lighten($bg, 2%), darken($bg, 4%)));\n }\n\n &:active,\n &.selected,\n &.zeroclipboard-is-active {\n background-color: darken($bg, 5%);\n background-image: none;\n box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15);\n }\n\n &.selected:hover {\n background-color: darken($bg, 10%);\n }\n}\n","// Search input and autocomplete\n\n.search {\n position: relative;\n z-index: 2;\n flex-grow: 1;\n height: $sp-10;\n padding: $sp-2;\n transition: padding linear #{$transition-duration * 0.5};\n\n @include mq(md) {\n position: relative !important;\n width: auto !important;\n height: 100% !important;\n padding: 0;\n transition: none;\n }\n}\n\n.search-input-wrap {\n position: relative;\n z-index: 1;\n height: $sp-8;\n overflow: hidden;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n transition: height linear #{$transition-duration * 0.5};\n\n @include mq(md) {\n position: absolute;\n width: 100%;\n max-width: $search-results-width;\n height: 100% !important;\n border-radius: 0;\n box-shadow: none;\n transition: width ease $transition-duration;\n }\n}\n\n.search-input {\n position: absolute;\n width: 100%;\n height: 100%;\n padding: $sp-2 $gutter-spacing-sm $sp-2 #{$gutter-spacing-sm + $sp-5};\n font-size: 1rem;\n color: $body-text-color;\n background-color: $search-background-color;\n border-top: 0;\n border-right: 0;\n border-bottom: 0;\n border-left: 0;\n border-radius: 0;\n\n @include mq(md) {\n padding: $sp-2 $gutter-spacing-sm $sp-2 #{$gutter-spacing + $sp-5};\n font-size: 0.875rem;\n background-color: $body-background-color;\n transition: padding-left linear #{$transition-duration * 0.5};\n }\n\n &:focus {\n outline: 2px solid $link-color;\n outline-offset: -2px;\n\n + .search-label .search-icon {\n color: $link-color;\n }\n }\n}\n\n.search-label {\n position: absolute;\n display: flex;\n height: 100%;\n padding-left: $gutter-spacing-sm;\n\n @include mq(md) {\n padding-left: $gutter-spacing;\n transition: padding-left linear #{$transition-duration * 0.5};\n }\n\n .search-icon {\n width: #{$sp-4 * 1.2};\n height: #{$sp-4 * 1.2};\n align-self: center;\n color: $grey-dk-000;\n }\n}\n\n.search-results {\n position: absolute;\n left: 0;\n display: none;\n width: 100%;\n max-height: calc(100% - #{$sp-10});\n overflow-y: auto;\n background-color: $search-background-color;\n border-bottom-right-radius: $border-radius;\n border-bottom-left-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n\n @include mq(md) {\n top: 100%;\n width: $search-results-width;\n max-height: calc(100vh - 200%) !important;\n }\n}\n\n.search-results-list {\n padding-left: 0;\n margin-bottom: $sp-1;\n list-style: none;\n @include fs-4;\n\n @include mq(md) {\n @include fs-3;\n }\n}\n\n.search-results-list-item {\n padding: 0;\n margin: 0;\n}\n\n.search-result {\n display: block;\n padding: $sp-1 $sp-3;\n\n &:hover,\n &.active {\n background-color: $feedback-color;\n }\n}\n\n.search-result-title {\n display: block;\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n\n @include mq(sm) {\n display: inline-block;\n width: 40%;\n padding-right: $sp-2;\n vertical-align: top;\n }\n}\n\n.search-result-doc {\n display: flex;\n align-items: center;\n word-wrap: break-word;\n\n &.search-result-doc-parent {\n opacity: 0.5;\n @include fs-3;\n\n @include mq(md) {\n @include fs-2;\n }\n }\n\n .search-result-icon {\n width: $sp-4;\n height: $sp-4;\n margin-right: $sp-2;\n color: $link-color;\n flex-shrink: 0;\n }\n\n .search-result-doc-title {\n overflow: auto;\n }\n}\n\n.search-result-section {\n margin-left: #{$sp-4 + $sp-2};\n word-wrap: break-word;\n}\n\n.search-result-rel-url {\n display: block;\n margin-left: #{$sp-4 + $sp-2};\n overflow: hidden;\n color: $search-result-preview-color;\n text-overflow: ellipsis;\n white-space: nowrap;\n @include fs-1;\n}\n\n.search-result-previews {\n display: block;\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n padding-left: $sp-4;\n margin-left: $sp-2;\n color: $search-result-preview-color;\n word-wrap: break-word;\n border-left: $border;\n border-left-color: $border-color;\n @include fs-2;\n\n @include mq(sm) {\n display: inline-block;\n width: 60%;\n padding-left: $sp-2;\n margin-left: 0;\n vertical-align: top;\n }\n}\n\n.search-result-preview + .search-result-preview {\n margin-top: $sp-1;\n}\n\n.search-result-highlight {\n font-weight: bold;\n}\n\n.search-no-result {\n padding: $sp-2 $sp-3;\n @include fs-3;\n}\n\n.search-button {\n position: fixed;\n right: $sp-4;\n bottom: $sp-4;\n display: flex;\n width: $sp-9;\n height: $sp-9;\n background-color: $search-background-color;\n border: 1px solid rgba($link-color, 0.3);\n border-radius: #{$sp-9 * 0.5};\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n align-items: center;\n justify-content: center;\n}\n\n.search-overlay {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1;\n width: 0;\n height: 0;\n background-color: rgba(0, 0, 0, 0.3);\n opacity: 0;\n transition:\n opacity ease $transition-duration,\n width 0s $transition-duration,\n height 0s $transition-duration;\n}\n\n.search-active {\n .search {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n padding: 0;\n }\n\n .search-input-wrap {\n height: $sp-10;\n border-radius: 0;\n\n @include mq(md) {\n width: $search-results-width;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n }\n }\n\n .search-input {\n background-color: $search-background-color;\n\n @include mq(md) {\n padding-left: 2.3rem;\n }\n }\n\n .search-label {\n @include mq(md) {\n padding-left: 0.6rem;\n }\n }\n\n .search-results {\n display: block;\n }\n\n .search-overlay {\n width: 100%;\n height: 100%;\n opacity: 1;\n transition:\n opacity ease $transition-duration,\n width 0s,\n height 0s;\n }\n\n @include mq(md) {\n .main {\n position: fixed;\n right: 0;\n left: 0;\n }\n }\n\n .main-header {\n padding-top: $sp-10;\n\n @include mq(md) {\n padding-top: 0;\n }\n }\n}\n","// Tables\n// stylelint-disable max-nesting-depth, selector-no-type, selector-max-type\n\n.table-wrapper {\n display: block;\n width: 100%;\n max-width: 100%;\n margin-bottom: $sp-5;\n overflow-x: auto;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n}\n\ntable {\n display: table;\n min-width: 100%;\n border-collapse: separate;\n}\n\nth,\ntd {\n min-width: 7.5rem;\n padding: $sp-2 $sp-3;\n background-color: $table-background-color;\n border-bottom: $border rgba($border-color, 0.5);\n border-left: $border $border-color;\n\n @include fs-3;\n\n &:first-of-type {\n border-left: 0;\n }\n}\n\ntbody {\n tr {\n &:last-of-type {\n th,\n td {\n border-bottom: 0;\n }\n\n td {\n padding-bottom: $sp-3;\n }\n }\n }\n}\n\nthead {\n th {\n border-bottom: $border $border-color;\n }\n}\n","// Code and syntax highlighting\n// stylelint-disable selector-no-qualifying-type, declaration-block-semicolon-newline-after,declaration-block-single-line-max-declarations, selector-no-type, selector-max-type, scss/comment-no-empty\n\n// {% raw %}\n\n// This instruction applies to all queues not within 'pre' or 'figure', avoiding 'code' generated by the highlight.\n:not(pre, figure) {\n & > code {\n padding: 0.2em 0.15em;\n font-weight: 400;\n background-color: $code-background-color;\n border: $border $border-color;\n border-radius: $border-radius;\n }\n}\n\n// Avoid appearance of dark border around visited code links in Safari\na:visited code {\n border-color: $border-color;\n}\n\n// Content structure for highlighted code blocks using fences or Liquid\n//\n// ```[LANG]...```, no kramdown line_numbers:\n// div.[language-LANG.]highlighter-rouge > div.highlight > pre.highlight > code\n//\n// ```[LANG]...```, kramdown line_numbers = true:\n// div.[language-LANG.]highlighter-rouge > div.highlight > pre.highlight > code\n// > div.table-wrapper > table.rouge-table > tbody > tr\n// > td.rouge-gutter.gl > pre.lineno\n// | td.rouge-code > pre\n//\n// {% highlight LANG %}...{% endhighlight %}:\n// figure.highlight > pre > code.language-LANG\n//\n// {% highlight LANG linenos %}...{% endhighlight %}:\n// figure.highlight > pre > code.language-LANG\n// > div.table-wrapper > table.rouge-table > tbody > tr\n// > td.gutter.gl > pre.lineno\n// | td.code > pre\n//\n// ----...---- (AsciiDoc)\n// div.listingblock > div.content > pre.rouge.highlight\n//\n// fix_linenos removes the outermost pre when it encloses table.rouge-table\n//\n// See docs/index-test.md for some tests.\n//\n// No kramdown line_numbers: fences and Liquid highlighting look the same.\n// Kramdown line_numbers = true: fences have a wider gutter than with Liquid?\n\n// ```[LANG]...```\n// or in AsciiDoc:\n//\n// ----\n// ...\n// ----\n\n// the code may appear with 3 different types:\n// container \\ case: default case, code with line number, code with html rendering\n// top level: div.highlighter-rouge, figure.highlight, figure.highlight\n// second level: div.highlight, div.table-wrapper, pre.highlight\n// third level: pre.highlight, td.code, absent\n// last level: code, pre, code (optionality)\n// highlighter level: span, span, span\n// the spacing are only in the second level for case 1, 3 and in the third level for case 2\n// in AsciiDoc, there is a parent container that contains optionally a title and the content.\n\n// select top level container\ndiv.highlighter-rouge,\ndiv.listingblock > div.content,\nfigure.highlight {\n margin-top: 0;\n margin-bottom: $sp-3;\n background-color: $code-background-color;\n border-radius: $border-radius;\n box-shadow: none;\n -webkit-overflow-scrolling: touch;\n position: relative;\n padding: 0;\n\n // copy button (or other button)\n // the button appear only when there is a hover on the code or focus on button\n > button {\n width: $sp-3;\n opacity: 0;\n position: absolute;\n top: 0;\n right: 0;\n padding: $sp-3;\n border: none;\n background: none;\n color: $body-text-color;\n box-sizing: content-box;\n\n svg {\n fill: $body-text-color;\n }\n\n &:active {\n text-decoration: none;\n outline: none;\n opacity: 1;\n }\n\n &:focus {\n opacity: 1;\n outline: 2px solid $link-color;\n }\n }\n\n // the button can be seen by doing a simple hover in the code, there is no need to go over the location of the button\n &:hover {\n > button {\n cursor: copy;\n opacity: 1;\n }\n }\n}\n\n// setting the spacing and scrollbar on the second level for the first case\n// remove all space on the second and third level\n// this is a mixin to accommodate for the slightly different structures generated via Markdown vs AsciiDoc\n@mixin scroll-and-spacing($code-div, $pre-select) {\n #{$code-div} {\n overflow-x: auto;\n padding: $sp-3;\n margin: 0;\n border: 1px solid $body-text-color;\n border-radius: $border-radius;\n }\n\n #{$pre-select},\n code {\n padding: 0;\n margin: 0;\n border: 0;\n }\n}\n\n// for Markdown\ndiv.highlighter-rouge {\n @include scroll-and-spacing(\"div.highlight\", \"pre.highlight\");\n}\n\n// for AsciiDoc. we also need to fix the margins for its parent container.\ndiv.listingblock {\n margin-top: 0;\n margin-bottom: $sp-3;\n\n @include scroll-and-spacing(\"div.content\", \"div.content > pre\");\n}\n\n// {% highlight LANG %}...{% endhighlight %},\n// {% highlight LANG linenos %}...{% endhighlight %}:\n\n// setting the spacing and scrollbar on the second level for the thirt case\n// the css rule are apply only to the last code enviroment\n// setting the scroolbar\nfigure.highlight {\n pre,\n :not(pre) > code {\n overflow-x: auto;\n padding: $sp-3;\n margin: 0;\n border: 1px solid $body-text-color;\n border-radius: $border-radius;\n }\n}\n\n// ```[LANG]...```, kramdown line_numbers = true,\n// {% highlight LANG linenos %}...{% endhighlight %}:\n\n// setting the spacing and scrollbar on the thirt level for the second case\n.highlight .table-wrapper {\n padding: $sp-3 0;\n margin: 0;\n border: 0;\n box-shadow: none;\n\n td,\n pre {\n min-width: 0;\n padding: 0;\n background-color: $code-background-color;\n border: 0;\n\n @include fs-2;\n }\n\n td.gl {\n width: 1em;\n padding-right: $sp-3;\n padding-left: $sp-3;\n }\n\n pre {\n margin: 0;\n line-height: 2;\n }\n}\n\n// Code examples: html render of a code\n.code-example,\n.listingblock > .title {\n padding: $sp-3;\n margin-bottom: $sp-3;\n overflow: auto;\n border: 1px solid $border-color;\n border-radius: $border-radius;\n\n + .highlighter-rouge,\n + .sectionbody .listingblock,\n + .content,\n + figure.highlight {\n position: relative;\n margin-top: -$sp-4;\n border-right: 1px solid $border-color;\n border-bottom: 1px solid $border-color;\n border-left: 1px solid $border-color;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n }\n}\n\n// Mermaid diagram code blocks should be left unstyled.\ncode.language-mermaid {\n padding: 0;\n background-color: inherit;\n border: 0;\n}\n\n// Override OneDarkJekyll Colors for Code Blocks\n.highlight,\npre.highlight {\n background: $code-background-color; // Code Background\n // For Backwards Compatibility Before $code-linenumber-color was added\n @if variable-exists(code-linenumber-color) {\n color: $code-linenumber-color; // Code Line Numbers\n } @else {\n color: $body-text-color; // Code Line Numbers\n }\n}\n\n// Override OneDarkJekyll Colors for Code Blocks\n.highlight pre {\n background: $code-background-color; // Code Background\n}\n\n// {% endraw %}\n","// Utility classes for colors\n\n// Text colors\n\n.text-grey-dk-000 {\n color: $grey-dk-000 !important;\n}\n\n.text-grey-dk-100 {\n color: $grey-dk-100 !important;\n}\n\n.text-grey-dk-200 {\n color: $grey-dk-200 !important;\n}\n\n.text-grey-dk-250 {\n color: $grey-dk-250 !important;\n}\n\n.text-grey-dk-300 {\n color: $grey-dk-300 !important;\n}\n\n.text-grey-lt-000 {\n color: $grey-lt-000 !important;\n}\n\n.text-grey-lt-100 {\n color: $grey-lt-100 !important;\n}\n\n.text-grey-lt-200 {\n color: $grey-lt-200 !important;\n}\n\n.text-grey-lt-300 {\n color: $grey-lt-300 !important;\n}\n\n.text-blue-000 {\n color: $blue-000 !important;\n}\n\n.text-blue-100 {\n color: $blue-100 !important;\n}\n\n.text-blue-200 {\n color: $blue-200 !important;\n}\n\n.text-blue-300 {\n color: $blue-300 !important;\n}\n\n.text-green-000 {\n color: $green-000 !important;\n}\n\n.text-green-100 {\n color: $green-100 !important;\n}\n\n.text-green-200 {\n color: $green-200 !important;\n}\n\n.text-green-300 {\n color: $green-300 !important;\n}\n\n.text-purple-000 {\n color: $purple-000 !important;\n}\n\n.text-purple-100 {\n color: $purple-100 !important;\n}\n\n.text-purple-200 {\n color: $purple-200 !important;\n}\n\n.text-purple-300 {\n color: $purple-300 !important;\n}\n\n.text-yellow-000 {\n color: $yellow-000 !important;\n}\n\n.text-yellow-100 {\n color: $yellow-100 !important;\n}\n\n.text-yellow-200 {\n color: $yellow-200 !important;\n}\n\n.text-yellow-300 {\n color: $yellow-300 !important;\n}\n\n.text-red-000 {\n color: $red-000 !important;\n}\n\n.text-red-100 {\n color: $red-100 !important;\n}\n\n.text-red-200 {\n color: $red-200 !important;\n}\n\n.text-red-300 {\n color: $red-300 !important;\n}\n\n// Background colors\n\n.bg-grey-dk-000 {\n background-color: $grey-dk-000 !important;\n}\n\n.bg-grey-dk-100 {\n background-color: $grey-dk-100 !important;\n}\n\n.bg-grey-dk-200 {\n background-color: $grey-dk-200 !important;\n}\n\n.bg-grey-dk-250 {\n background-color: $grey-dk-250 !important;\n}\n\n.bg-grey-dk-300 {\n background-color: $grey-dk-300 !important;\n}\n\n.bg-grey-lt-000 {\n background-color: $grey-lt-000 !important;\n}\n\n.bg-grey-lt-100 {\n background-color: $grey-lt-100 !important;\n}\n\n.bg-grey-lt-200 {\n background-color: $grey-lt-200 !important;\n}\n\n.bg-grey-lt-300 {\n background-color: $grey-lt-300 !important;\n}\n\n.bg-blue-000 {\n background-color: $blue-000 !important;\n}\n\n.bg-blue-100 {\n background-color: $blue-100 !important;\n}\n\n.bg-blue-200 {\n background-color: $blue-200 !important;\n}\n\n.bg-blue-300 {\n background-color: $blue-300 !important;\n}\n\n.bg-green-000 {\n background-color: $green-000 !important;\n}\n\n.bg-green-100 {\n background-color: $green-100 !important;\n}\n\n.bg-green-200 {\n background-color: $green-200 !important;\n}\n\n.bg-green-300 {\n background-color: $green-300 !important;\n}\n\n.bg-purple-000 {\n background-color: $purple-000 !important;\n}\n\n.bg-purple-100 {\n background-color: $purple-100 !important;\n}\n\n.bg-purple-200 {\n background-color: $purple-200 !important;\n}\n\n.bg-purple-300 {\n background-color: $purple-300 !important;\n}\n\n.bg-yellow-000 {\n background-color: $yellow-000 !important;\n}\n\n.bg-yellow-100 {\n background-color: $yellow-100 !important;\n}\n\n.bg-yellow-200 {\n background-color: $yellow-200 !important;\n}\n\n.bg-yellow-300 {\n background-color: $yellow-300 !important;\n}\n\n.bg-red-000 {\n background-color: $red-000 !important;\n}\n\n.bg-red-100 {\n background-color: $red-100 !important;\n}\n\n.bg-red-200 {\n background-color: $red-200 !important;\n}\n\n.bg-red-300 {\n background-color: $red-300 !important;\n}\n","// Utility classes for layout\n\n// Display\n\n.d-block {\n display: block !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-none {\n display: none !important;\n}\n\n// Screenreader-only\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border-width: 0;\n}\n\n@each $media-query in map-keys($media-queries) {\n @for $i from 1 through length($spacers) {\n @include mq($media-query) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .d-sm-block, .d-md-none, .d-lg-inline\n .d-#{$media-query}-block {\n display: block !important;\n }\n .d-#{$media-query}-flex {\n display: flex !important;\n }\n .d-#{$media-query}-inline {\n display: inline !important;\n }\n .d-#{$media-query}-inline-block {\n display: inline-block !important;\n }\n .d-#{$media-query}-none {\n display: none !important;\n }\n }\n }\n}\n\n// Horizontal alignment\n\n.float-left {\n float: left !important;\n}\n\n.float-right {\n float: right !important;\n}\n\n.flex-justify-start {\n justify-content: flex-start !important;\n}\n\n.flex-justify-end {\n justify-content: flex-end !important;\n}\n\n.flex-justify-between {\n justify-content: space-between !important;\n}\n\n.flex-justify-around {\n justify-content: space-around !important;\n}\n\n// Vertical alignment\n\n.v-align-baseline {\n vertical-align: baseline !important;\n}\n\n.v-align-bottom {\n vertical-align: bottom !important;\n}\n\n.v-align-middle {\n vertical-align: middle !important;\n}\n\n.v-align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.v-align-text-top {\n vertical-align: text-top !important;\n}\n\n.v-align-top {\n vertical-align: top !important;\n}\n","// Utility classes for typography\n\n.fs-1 {\n @include fs-1;\n}\n\n.fs-2 {\n @include fs-2;\n}\n\n.fs-3 {\n @include fs-3;\n}\n\n.fs-4 {\n @include fs-4;\n}\n\n.fs-5 {\n @include fs-5;\n}\n\n.fs-6 {\n @include fs-6;\n}\n\n.fs-7 {\n @include fs-7;\n}\n\n.fs-8 {\n @include fs-8;\n}\n\n.fs-9 {\n @include fs-9;\n}\n\n.fs-10 {\n @include fs-10;\n}\n\n.fw-300 {\n font-weight: 300 !important;\n}\n\n.fw-400 {\n font-weight: 400 !important;\n}\n\n.fw-500 {\n font-weight: 500 !important;\n}\n\n.fw-700 {\n font-weight: 700 !important;\n}\n\n.lh-0 {\n line-height: 0 !important;\n}\n\n.lh-default {\n line-height: $body-line-height;\n}\n\n.lh-tight {\n line-height: $body-heading-line-height;\n}\n\n.ls-5 {\n letter-spacing: 0.05em !important;\n}\n\n.ls-10 {\n letter-spacing: 0.1em !important;\n}\n\n.ls-0 {\n letter-spacing: 0 !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n","// Utility classes for lists\n\n// stylelint-disable selector-max-type\n\n.list-style-none {\n padding: 0 !important;\n margin: 0 !important;\n list-style: none !important;\n\n li {\n &::before {\n display: none !important;\n }\n }\n}\n","// Utility classes for margins and padding\n\n// stylelint-disable block-opening-brace-space-after, block-opening-brace-space-before\n\n// Margin spacer utilities\n\n.mx-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n}\n\n@for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .m-0, .m-1, .m-2...\n .m-#{$scale} {\n margin: #{$size} !important;\n }\n .mt-#{$scale} {\n margin-top: #{$size} !important;\n }\n .mr-#{$scale} {\n margin-right: #{$size} !important;\n }\n .mb-#{$scale} {\n margin-bottom: #{$size} !important;\n }\n .ml-#{$scale} {\n margin-left: #{$size} !important;\n }\n\n .mx-#{$scale} {\n margin-right: #{$size} !important;\n margin-left: #{$size} !important;\n }\n\n .my-#{$scale} {\n margin-top: #{$size} !important;\n margin-bottom: #{$size} !important;\n }\n\n .mxn-#{$scale} {\n margin-right: -#{$size} !important;\n margin-left: -#{$size} !important;\n }\n .mx-#{$scale}-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n}\n\n@each $media-query in map-keys($media-queries) {\n @for $i from 1 through length($spacers) {\n @include mq($media-query) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .m-sm-0, .m-md-1, .m-lg-2...\n .m-#{$media-query}-#{$scale} {\n margin: #{$size} !important;\n }\n .mt-#{$media-query}-#{$scale} {\n margin-top: #{$size} !important;\n }\n .mr-#{$media-query}-#{$scale} {\n margin-right: #{$size} !important;\n }\n .mb-#{$media-query}-#{$scale} {\n margin-bottom: #{$size} !important;\n }\n .ml-#{$media-query}-#{$scale} {\n margin-left: #{$size} !important;\n }\n\n .mx-#{$media-query}-#{$scale} {\n margin-right: #{$size} !important;\n margin-left: #{$size} !important;\n }\n\n .my-#{$media-query}-#{$scale} {\n margin-top: #{$size} !important;\n margin-bottom: #{$size} !important;\n }\n\n .mxn-#{$media-query}-#{$scale} {\n margin-right: -#{$size} !important;\n margin-left: -#{$size} !important;\n }\n }\n }\n}\n\n// Padding spacer utilities\n\n@for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .p-0, .p-1, .p-2...\n .p-#{$scale} {\n padding: #{$size} !important;\n }\n .pt-#{$scale} {\n padding-top: #{$size} !important;\n }\n .pr-#{$scale} {\n padding-right: #{$size} !important;\n }\n .pb-#{$scale} {\n padding-bottom: #{$size} !important;\n }\n .pl-#{$scale} {\n padding-left: #{$size} !important;\n }\n\n .px-#{$scale} {\n padding-right: #{$size} !important;\n padding-left: #{$size} !important;\n }\n\n .py-#{$scale} {\n padding-top: #{$size} !important;\n padding-bottom: #{$size} !important;\n }\n}\n\n@each $media-query in map-keys($media-queries) {\n @include mq($media-query) {\n @for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .p-sm-0, .p-md-1, .p-lg-2...\n .p-#{$media-query}-#{$scale} {\n padding: #{$size} !important;\n }\n .pt-#{$media-query}-#{$scale} {\n padding-top: #{$size} !important;\n }\n .pr-#{$media-query}-#{$scale} {\n padding-right: #{$size} !important;\n }\n .pb-#{$media-query}-#{$scale} {\n padding-bottom: #{$size} !important;\n }\n .pl-#{$media-query}-#{$scale} {\n padding-left: #{$size} !important;\n }\n\n .px-#{$media-query}-#{$scale} {\n padding-right: #{$size} !important;\n padding-left: #{$size} !important;\n }\n\n .py-#{$media-query}-#{$scale} {\n padding-top: #{$size} !important;\n padding-bottom: #{$size} !important;\n }\n }\n }\n}\n","// stylelint-disable selector-max-specificity, selector-max-id, selector-max-type, selector-no-qualifying-type\n\n@media print {\n .site-footer,\n .site-button,\n #edit-this-page,\n #back-to-top,\n .site-nav,\n .main-header {\n display: none !important;\n }\n\n hr {\n margin-top: 1rem;\n margin-bottom: 1rem;\n }\n\n .side-bar {\n width: 100%;\n height: auto;\n border-right: 0 !important;\n }\n\n .site-header {\n border-bottom: 1px solid $border-color;\n }\n\n .site-title {\n font-size: 1rem !important;\n font-weight: 700 !important;\n }\n\n .text-small {\n font-size: 8pt !important;\n }\n\n pre.highlight {\n border: 1px solid $border-color;\n }\n\n .main {\n max-width: none;\n margin-left: 0;\n }\n}\n","// Skipnav\n// Skip to main content\n\na.skip-to-main {\n left: -999px;\n position: absolute;\n top: auto;\n width: 1px;\n height: 1px;\n overflow: hidden;\n z-index: -999;\n}\n\na.skip-to-main:focus,\na.skip-to-main:active {\n color: $link-color;\n background-color: $body-background-color;\n left: auto;\n top: auto;\n width: 30%;\n height: auto;\n overflow: auto;\n margin: 10px 35%;\n padding: 5px;\n border-radius: 15px;\n border: 4px solid $btn-primary-color;\n text-align: center;\n font-size: 1.2em;\n z-index: 999;\n}\n","\n\n@import \"./support/support\";\n@import \"./custom/setup\";\n@import \"./color_schemes/light\";\n\n@import \"./color_schemes/meshtastic\";\n\n@import \"./modules\";\ndiv.opaque {\n background-color: $body-background-color;\n}\n\np.tip, blockquote.tip {\n border: 1px $green-000 solid;\n border-left: $border-radius solid $green-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $green-300;\n content: \"Tip\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .tip-title {\n color: $green-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.tip-title, blockquote.tip-title {\n border: 1px $green-000 solid;\n border-left: $border-radius solid $green-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $green-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.tip {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.tip-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n\np.note, blockquote.note {\n border: 1px $blue-000 solid;\n border-left: $border-radius solid $blue-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $blue-300;\n content: \"Note\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .note-title {\n color: $blue-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.note-title, blockquote.note-title {\n border: 1px $blue-000 solid;\n border-left: $border-radius solid $blue-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $blue-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.note {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.note-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n\np.warning, blockquote.warning {\n border: 1px $yellow-000 solid;\n border-left: $border-radius solid $yellow-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $yellow-300;\n content: \"Warning\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .warning-title {\n color: $yellow-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.warning-title, blockquote.warning-title {\n border: 1px $yellow-000 solid;\n border-left: $border-radius solid $yellow-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $yellow-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.warning {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.warning-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n@import \"./custom/custom\";\n\n\n"],"file":"just-the-docs-default.css"} \ No newline at end of file diff --git a/main/assets/css/just-the-docs-light.css.map b/main/assets/css/just-the-docs-light.css.map index f8b5bb103e..5c19f17394 100644 --- a/main/assets/css/just-the-docs-light.css.map +++ b/main/assets/css/just-the-docs-light.css.map @@ -1 +1 @@ -{"version":3,"sourceRoot":"","sources":["../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/vendor/accessible-pygments/github-light.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/vendor/normalize.scss/normalize.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/base.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/color_schemes/light.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/support/mixins/_typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/support/mixins/_layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/support/_variables.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/content.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/navigation.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/labels.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/buttons.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/support/mixins/_buttons.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/search.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/tables.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/code.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/utilities/_colors.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/utilities/_layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/utilities/_typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/utilities/_lists.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/utilities/_spacing.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/print.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/skiptomain.scss","just-the-docs-light.scss"],"names":[],"mappings":";AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA;EAAkB;;;AAClB;EAAgB;EAAiB;AACjC;EAAkB;EAAiB;AACnC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAkB;EAAiB;AACnC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAqB;AACtC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAoB;AACrC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAgB;EAAiB;AACjC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AChFlC;AAEA;AAAA;AAGA;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAAA;AAKA;EACE;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;EAEE;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;AAAA;EAGE;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;EAEE;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAAA;AAKA;AAAA;AAAA;AAAA;AAAA;EAKE;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;AAEE;EACA;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;AAEE;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;EAIE;;;AAGF;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;EAIE;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;EAIE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;EAEE;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;EAEE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AC1VF;EACE,cCJa;;;ADOf;EACE;;;AAGF;EACE;;AEmBA;EACE;;AClBA;EHHJ;IEyBI;;;;AFnBJ;EACE,aIfiB;EJgBjB;EACA,aIbiB;EJcjB,OIUY;EJTZ,kBIOM;EJNN;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAYE;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;EACA;EACA;EACA,aI1CyB;EJ2CzB,OIlBY;;;AJqBd;EACE;EACA;;;AAGF;EACE,OItBW;EJuBX;;;AAGF;EACE;EACA,uBI/BY;EJgCZ;;AAEA;EACE;;;AAIJ;EACE,aIvEiB;EJwEjB;EACA,aIvEiB;;;AJ0EnB;AAAA;EAEE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA,kBI/DY;EJgEZ;;;AAIF;EACE;EAGA;EACA;EACA;EACA;;;AK7GF;EACE;EACA;EACA;EACA,kBD6BY;;ADrBV;EEZJ;IAOI;IACA;IACA,ODwFW;ICvFX;IACA;IACA;;;AFAA;EEZJ;IAgBI;IACA,WD+EQ;;;ADpFR;EEQF;IAEI,aD2ES;;;ADrFX;EEQF;IAQI;;;AAOF;EACE;EACA,kBDJQ;;ADrBV;EEuBA;IAKI;IACA,kBDdA;;;ACiBF;EACE;;AFjCJ;EEgCE;IAII;;;;AAOV;EACE;;AF5CE;EE2CJ;IAII;IACA,WDyCY;;;;ACrChB;EACE,aDaK;ECZL,gBDYK;EDvDL,eCuDK;EDtDL,cCsDK;;ADlEH;EEoDJ;IFrCI,eCqDG;IDpDH,cCoDG;;;ADpEH;EEoDJ;IAOI,aDSG;ICRH,gBDQG;;;;ACJP;EACE;EACA;;AFlEE;EEgEJ;IAKI;IACA;IACA,QDmBY;;;;ACfhB;AAAA;AAAA;EAGE;;AF9EE;EE2EJ;AAAA;AAAA;IAMI,ODGQ;;;;ACCZ;EACE;;AAEA;EACE;;AFzFA;EEqFJ;IAQI;IACA,aDxBG;ICyBH,gBD7BG;IC8BH;IACA;;;;AAIJ;EACE;EACA,YDbc;ECcd;;AFxGE;EEqGJ;IAMI,QDjBY;ICkBZ,YDlBY;ICmBZ;;;;AAIJ;EACE;EACA;EACA;EACA;EACA,aDrDK;ECsDL,gBDtDK;ECuDL,ODpGY;EDTZ,eCuDK;EDtDL,cCsDK;;ADlEH;EEiHJ;IFlGI,eCqDG;IDpDH,cCoDG;;;AF/BL;EACE;;ACtCA;EEiHJ;IHvEI;IACA,aEhDuB;;;ADKvB;EEiHJ;IAcI,aD/DG;ICgEH,gBDhEG;;;;AC+EP;EACE;EACA;EACA,SDhFK;ECiFL;;;AFnJE;EEuJF;IACE;;;AAIJ;EACE;;;AAQF;EACE;;;AAOF;EACE;EACA;EACA;EACA,aD/GK;ECgHL,gBDhHK;EDvDL,eCuDK;EDtDL,cCsDK;;ADlEH;EE6KJ;IF9JI,eCqDG;IDpDH,cCoDG;;;AFvEL;EACE;;ACEA;EE6KJ;IH3KI;;;ACFA;EE6KJ;IAYI;IACA;;;;AAIJ;EACE,OD5HK;EC6HL,QD7HK;EC8HL,ODxKW;;;AElCb;EACE,aFEoB;;AEApB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;;AAGF;EACE;EACA;;AAGF;AAAA;EAEE;;AAIA;EACE,YF+CC;;AE3CL;EACE;EACA;;AAEA;EACE;;AAEA;EACE;EACA;EACA;EACA,OFfM;EEgBN;EACA;;AJ1BN;EACE;;ACRA;EG2BE;IJfF;;;ACZA;EG2BE;IAUI;;;AAIJ;EACE;;AAGE;EACE;EACA;;AAOV;EACE;;AAGE;EACE;EACA;EACA,OF7CM;EE8CN;;AAMJ;EACE;;AAIJ;EACE;EACA;;AAKF;EACE;;AAGF;EACE;;AAGF;EACE;EACA;;AAGF;AAAA;EAEE;;AAGF;EACE;EACA;EACA;;AAEA;EACE;;AAIJ;EACE;EACA;EACA;;AAmBE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;;AASF;AAAA;AAAA;AAAA;AAAA;AAAA;EAEE;;AAKN;EACE;EACA;EACA,OFnFG;EEoFH;EACA,eFzFG;EE0FH,cF1FG;EE2FH;;AH1JA;EGmJF;IAUI;IACA;;;AAGF;EACE;EACA;EACA;EACA,OF5IO;EE6IP;;AAYF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;;AAIJ;EACE;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;EACA;EACA;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAKE;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;;AAIJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAWE,YF9JG;;;AG3EP;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;ALoBF;EACE;;AClBA;EILF;IL2BE;;;ACtBA;EDOF;IACE;;;ACRA;EILF;ILiBE;;;AKPA;EACE;EACA,YH+DC;EG9DD,aHuDC;EGtDD,gBHsDC;EGrDD;EAEE,eH0DD;EGzDC,cHqDD;;ADlEH;EIKA;IAeI,YHgDD;IG/CC;IAEE,eH6CH;IG5CG,cH4CH;;;AGrCD;EACE,OHkCD;EGjCC,QHiCD;EGhCC;;AAGF;EACE;EACA;;AAGF;EAEE;EACA;;AASJ;EACE;EAEE;EAGF,OHUC;EGTD,QHSC;EGRD;EACA,OHtCO;;ADzBT;EIsDA;IAYI,OHED;IGDC,QHCD;IGAC;;;AAGF;EACE;;AAQA;EACE;;AAKN;EACE;EACA,cHvBC;EGwBD;;AAEA;EACE;;AAEA;EACE,OH9EI;;AGiFN;EACE,OHlFI;;AGwFR;EAEI;;AAMJ;EACE;;;AAMR;EACE;EACA;EACA;EACA;EACA;;ALhIA;EACE;;ACEA;EIwHJ;ILtHI;;;ACFA;EIwHJ;IASI;IACA,YHhEG;IGiEH;;EAEA;IACE;;;;AAMJ;EACE;;AAEA;EACE;;AAGE;EACE,OH3HG;;AG8HL;EACE,OH/HG;;;AGwIb;EACE;EACA;;ALtKA;EACE;;ACEA;EIiKJ;IL/JI;;;AKoKF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AJlLA;EIiKJ;IAqBI,eHpHG;;;;ADlEH;EI4LJ;IAEI;;;;AAIJ;EACE;EACA,eHnIK;EGoIL;;;AAGF;EACE;;AL5MA;EACE;;ACEA;EIwMJ;ILtMI;;;AK0MF;EACE;;AAGF;EACE;EACA,cHlJG;EGmJH,aHnJG;EGoJH,OHpMU;EGqMV;;AAIA;EACE;;;ACrON;AAAA;EAEE;;ANoEA;AAAA;EACE;EACA,aElEuB;;ADKvB;EKXJ;AAAA;IN4EI;;;;AA5BF;AAAA;AAAA;EACE;;ACtCA;EKJJ;AAAA;AAAA;IN8CI;IACA,aEhDuB;;;;AFgCzB;AAAA;EACE;;AC5BA;EKEJ;AAAA;IN8BI;;;;AMzBJ;AAAA;EAEE;EACA;EACA;;ANdA;AAAA;EACE;;ACEA;EKOJ;AAAA;INLI;;;;AMcJ;EACE;;;ANVA;AAAA;EACE;;ACRA;EKoBJ;AAAA;INRI;;;;AAfF;AAAA;EACE;;ACEA;EKyBJ;AAAA;INvBI;;;;AALF;EACE;;ACEA;EK8BJ;IN5BI;;;;AMgCJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;ACvDF;AAAA;EAEE;EACA;EACA,cLoEK;EKnEL,aLmEK;EKlEL,OLiBM;EKhBN;EACA;EACA,kBL6BS;EK5BT;;APLA;AAAA;EACE;;ACEA;EMRJ;AAAA;IPUI;;;;AOKJ;EACE,kBL4BU;;;AKzBZ;EACE,kBLcW;;;AKXb;EACE,kBL4BQ;;;AKzBV;EACE,OLFY;EKGZ,kBLkBW;;;AMlDb;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,ON2BW;EM1BX;EACA;EACA;EACA,kBTTkB;ESUlB;EACA,eNyEc;EMxEd,YACE;EAEF;;AAEA;EACE;EACA;EACA;;AAGF;EAEE;;AAGF;EAEE;;AAGF;EAIE;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;AAKA;EAEE;EACA;EACA;EACA;EACA;;;AAKN;EACE,ONnCW;EMoCX;EACA;;AAEA;EAIE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA,YACE;;AAIJ;EAEE;;;AAIJ;ECnGE,OP0BM;EOzBN;EACA;EACA,YACE;;AAGF;EAEE,OPiBI;EOhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;ADgFJ;ECvGE,OP0BM;EOzBN;EACA;EACA,YACE;;AAGF;EAEE,OPiBI;EOhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;ADoFJ;EC3GE,OP0BM;EOzBN;EACA;EACA,YACE;;AAGF;EAEE,OPiBI;EOhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;ADwFJ;EC/GE,OP0BM;EOzBN;EACA;EACA,YACE;;AAGF;EAEE,OPiBI;EOhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;AD4FJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AE3HF;EACE;EACA;EACA;EACA,QRgFM;EQ/EN,SRuEK;EQtEL;;ATME;ESZJ;IASI;IACA;IACA;IACA;IACA;;;;AAIJ;EACE;EACA;EACA,QR8DK;EQ7DL;EACA,eRmEc;EQlEd,YACE;EAEF;;ATdE;ESKJ;IAYI;IACA;IACA,WRwEmB;IQvEnB;IACA;IACA;IACA;;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA,ORhBY;EQiBZ,kBRnBM;EQoBN;EACA;EACA;EACA;EACA;;ATvCE;ES2BJ;IAeI;IACA;IACA,kBR7BI;IQ8BJ;;;AAGF;EACE;EACA;;AAEA;EACE,OR5BO;;;AQiCb;EACE;EACA;EACA;EACA,cRIK;;ADlEH;ES0DJ;IAOI,cRGG;IQFH;;;AAGF;EACE;EACA;EACA;EACA,ORzDU;;;AQ6Dd;EACE;EACA;EACA;EACA;EACA;EACA;EACA,kBRrEM;EQsEN,4BRRc;EQSd,2BRTc;EQUd,YACE;;ATxFA;ES6EJ;IAeI;IACA,ORFmB;IQGnB;;;;AAIJ;EACE;EACA,eRrCK;EQsCL;;AVpFA;EACE;;AClBA;ESkGJ;IV5EI;;;ACtBA;EDOF;IACE;;;ACRA;ESkGJ;IVtFI;;;;AUiGJ;EACE;EACA;;;AAGF;EACE;EACA;;AAEA;EAEE,kBX5Ha;;;AWgIjB;EACE;EACA,aR9DK;EQ+DL,gBR/DK;;ADhEH;ES4HJ;IAMI;IACA;IACA,eRpEG;IQqEH;;;;AAIJ;EACE;EACA;EACA;;AAEA;EACE;;AVxIF;EACE;;ACRA;ES8IF;IVlIE;;;ACZA;EDHF;IACE;;;ACEA;ES8IF;IV5IE;;;AUqJF;EACE,ORtFG;EQuFH,QRvFG;EQwFH,cR1FG;EQ2FH,ORlIS;EQmIT;;AAGF;EACE;;;AAIJ;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA,OR5JY;EQ6JZ;EACA;;AV5LA;EACE;;ACYA;ESyKJ;IVjLI;;;;AU2LJ;EACE;EACA,aRrHK;EQsHL,gBRtHK;EQuHL,cRrHK;EQsHL,aRxHK;EQyHL,ORxKY;EQyKZ;EACA,aR/GO;EQgHP,mBRtKY;;AFzBZ;EACE;;ACEA;ESmLJ;IVjLI;;;ACFA;ESmLJ;IAaI;IACA;IACA,cRlIG;IQmIH;IACA;;;;AAIJ;EACE,YR1IK;;;AQ6IP;EACE;;;AAGF;EACE;;AV1MA;EACE;;ACRA;ESgNJ;IVpMI;;;;AUyMJ;EACE;EACA,ORrJK;EQsJL,QRtJK;EQuJL;EACA,ORnJK;EQoJL,QRpJK;EQqJL,kBR7MM;EQ8MN;EACA;EACA,YACE;EAEF;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YACE;;;AAMF;EACE;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE,QRxLI;EQyLJ;;ATjQA;ES+PF;IAKI,ORzKiB;IQ0KjB,YACE;;;AAKN;EACE,kBR7PI;;ADfJ;ES2QF;IAII;;;AT/QF;ESmRF;IAEI;;;AAIJ;EACE;;AAGF;EACE;EACA;EACA;EACA,YACE;;ATlSF;ESwSA;IACE;IACA;IACA;;;AAIJ;EACE,aRxOI;;ADxEJ;ES+SF;IAII;;;;AC9TN;EACE;EACA;EACA;EACA,eT0EK;ESzEL;EACA,eTkFc;ESjFd,YACE;;;AAIJ;EACE;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA,kBTIM;ESHN;EACA;;AXNA;AAAA;EACE;;ACRA;EUOJ;AAAA;IXKI;;;AWKF;AAAA;EACE;;;AAOE;AAAA;EAEE;;AAGF;EACE,gBTkCD;;;AS3BL;EACE;;;AC9CF;EACE;EACA;EACA,kBVmBI;EUlBJ;EACA,eV+EY;;;AU1EhB;EACE,cVkBY;;;AUiCd;AAAA;AAAA;EAGE;EACA,eVMK;EULL,kBV7CM;EU8CN,eVgBc;EUfd;EACA;EACA;EACA;;AAIA;AAAA;AAAA;EACE,OVLG;EUMH;EACA;EACA;EACA;EACA,SVVG;EUWH;EACA;EACA,OV7DU;EU8DV;;AAEA;AAAA;AAAA;EACE,MVjEQ;;AUoEV;AAAA;AAAA;EACE;EACA;EACA;;AAGF;AAAA;AAAA;EACE;EACA;;AAMF;AAAA;AAAA;EACE;EACA;;;AASJ;EACE;EACA,SV/CG;EUgDH;EACA;EACA,eVtCY;;AUyCd;AAAA;EAEE;EACA;EACA;;;AAUJ;EACE;EACA,eVrEK;;AU6CL;EACE;EACA,SV/CG;EUgDH;EACA;EACA,eVtCY;;AUyCd;AAAA;EAEE;EACA;EACA;;;AAwBF;AAAA;EAEE;EACA,SVpFG;EUqFH;EACA;EACA,eV3EY;;;AUmFhB;EACE;EACA;EACA;EACA;;AAEA;AAAA;EAEE;EACA;EACA,kBV3JI;EU4JJ;;AZ9KF;AAAA;EACE;;ACEA;EWsKF;AAAA;IZpKE;;;AY8KF;EACE;EACA,eVjHG;EUkHH,cVlHG;;AUqHL;EACE;EACA;;;AAKJ;AAAA;EAEE,SV9HK;EU+HL,eV/HK;EUgIL;EACA;EACA,eVtHc;;AUwHd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAIE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAKJ;EACE;EACA;EACA;;;AAIF;AAAA;EAEE,YV9MM;EUmNJ,OVjNU;;;AUsNd;EACE,YVzNM;;;AWzBR;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;ACvOF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AbrBE;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;AAQR;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AdhHA;EACE;;ACYA;EcZJ;IfII;;;;AAKF;EACE;;ACEA;EcRJ;IfUI;;;;AAKF;EACE;;ACRA;EcJJ;IfgBI;;;;AAKF;EACE;;AClBA;EcAJ;IfsBI;;;;AAKF;EACE;;AC5BA;EcIJ;If4BI;;;;AAKF;EACE;;ACtCA;EcQJ;IfkCI;IACA,aEhDuB;;;;AFqDzB;EACE;EACA,aEvDuB;;ADKvB;EcYJ;If0CI;;;;AAKF;EACE;EACA,aElEuB;;ADKvB;EcgBJ;IfiDI;;;;AAKF;EACE;EACA,aE7EuB;;ADKvB;EcoBJ;IfwDI;;;;AAKF;EACE;EACA,aExFuB;;ADKvB;EcwBJ;If+DI;;;;Ae3DJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE,abxDiB;;;Aa2DnB;EACE,ab1DyB;;;Aa6D3B;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AC/EF;EACE;EACA;EACA;;AAGE;EACE;;;ACLN;EACE;EACA;;;AAQA;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AhBlCA;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAaN;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AhB7GA;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AC3JR;EACE;AAAA;AAAA;AAAA;AAAA;AAAA;IAME;;EAGF;IACE;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;IACA;;;ACvCJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE,OjBwBW;EiBvBX,kBjBaM;EiBZN;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ACtBF;EACE,kBlBsBM;;;AkBnBR;EACI;EACA;EACA,elB8EY;EkB7EZ;EACA;;AAEA;EACI,OlBgCI;EkB/BJ;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OlBsBM;EkBrBN;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,elBmDY;EkBlDZ;EACA;;AACA;EACE;EACA;EACA,OlBIM;EkBHN;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAMJ;EACI;EACA;EACA,elBKY;EkBJZ;EACA;;AAEA;EACI,OlB7CG;EkB8CH;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OlBvDK;EkBwDL;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,elBtBY;EkBuBZ;EACA;;AACA;EACE;EACA;EACA,OlBzEK;EkB0EL;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAMJ;EACI;EACA;EACA,elBpEY;EkBqEZ;EACA;;AAEA;EACI,OlB9GK;EkB+GL;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OlBxHO;EkByHP;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,elB/FY;EkBgGZ;EACA;;AACA;EACE;EACA;EACA,OlB1IO;EkB2IP;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE","sourcesContent":["/*\ngenerated by accessible-pygments \nCopyright (c) 2022, Quansight Labs\nLicensed under the BSD license, see LICENSE for details.\n--\ngenerated by Pygments \nCopyright 2006-2025 by the Pygments team.\nLicensed under the BSD license, see LICENSE for details.\n*/\n\n.highlight .hll { background-color: #0969da4a }\n.highlight .c { color: #6E7781 } /* Comment */\n.highlight .err { color: #CF222E } /* Error */\n.highlight .k { color: #CF222E } /* Keyword */\n.highlight .l { color: #953800 } /* Literal */\n.highlight .n { color: #8250DF } /* Name */\n.highlight .o { color: #116329 } /* Operator */\n.highlight .p { color: #24292F } /* Punctuation */\n.highlight .ch { color: #6E7781 } /* Comment.Hashbang */\n.highlight .cm { color: #6E7781 } /* Comment.Multiline */\n.highlight .cp { color: #6E7781 } /* Comment.Preproc */\n.highlight .cpf { color: #6E7781 } /* Comment.PreprocFile */\n.highlight .c1 { color: #6E7781 } /* Comment.Single */\n.highlight .cs { color: #6E7781 } /* Comment.Special */\n.highlight .gd { color: #0550AE } /* Generic.Deleted */\n.highlight .ge { font-style: italic } /* Generic.Emph */\n.highlight .gr { color: #CF222E } /* Generic.Error */\n.highlight .gh { color: #0550AE } /* Generic.Heading */\n.highlight .gs { font-weight: bold } /* Generic.Strong */\n.highlight .gu { color: #0550AE } /* Generic.Subheading */\n.highlight .kc { color: #0550AE } /* Keyword.Constant */\n.highlight .kd { color: #CF222E } /* Keyword.Declaration */\n.highlight .kn { color: #CF222E } /* Keyword.Namespace */\n.highlight .kp { color: #CF222E } /* Keyword.Pseudo */\n.highlight .kr { color: #CF222E } /* Keyword.Reserved */\n.highlight .kt { color: #CF222E } /* Keyword.Type */\n.highlight .ld { color: #953800 } /* Literal.Date */\n.highlight .m { color: #953800 } /* Literal.Number */\n.highlight .s { color: #0550AE } /* Literal.String */\n.highlight .na { color: #953800 } /* Name.Attribute */\n.highlight .nb { color: #953800 } /* Name.Builtin */\n.highlight .nc { color: #0550AE } /* Name.Class */\n.highlight .no { color: #0550AE } /* Name.Constant */\n.highlight .nd { color: #953800 } /* Name.Decorator */\n.highlight .ni { color: #116329 } /* Name.Entity */\n.highlight .ne { color: #8250DF } /* Name.Exception */\n.highlight .nf { color: #0550AE } /* Name.Function */\n.highlight .nl { color: #953800 } /* Name.Label */\n.highlight .nn { color: #24292F } /* Name.Namespace */\n.highlight .nx { color: #8250DF } /* Name.Other */\n.highlight .py { color: #0550AE } /* Name.Property */\n.highlight .nt { color: #116329 } /* Name.Tag */\n.highlight .nv { color: #953800 } /* Name.Variable */\n.highlight .ow { color: #8250DF } /* Operator.Word */\n.highlight .pm { color: #24292F } /* Punctuation.Marker */\n.highlight .w { color: #24292F } /* Text.Whitespace */\n.highlight .mb { color: #953800 } /* Literal.Number.Bin */\n.highlight .mf { color: #953800 } /* Literal.Number.Float */\n.highlight .mh { color: #953800 } /* Literal.Number.Hex */\n.highlight .mi { color: #953800 } /* Literal.Number.Integer */\n.highlight .mo { color: #953800 } /* Literal.Number.Oct */\n.highlight .sa { color: #0550AE } /* Literal.String.Affix */\n.highlight .sb { color: #0550AE } /* Literal.String.Backtick */\n.highlight .sc { color: #0550AE } /* Literal.String.Char */\n.highlight .dl { color: #0550AE } /* Literal.String.Delimiter */\n.highlight .sd { color: #0550AE } /* Literal.String.Doc */\n.highlight .s2 { color: #0550AE } /* Literal.String.Double */\n.highlight .se { color: #0550AE } /* Literal.String.Escape */\n.highlight .sh { color: #0550AE } /* Literal.String.Heredoc */\n.highlight .si { color: #0550AE } /* Literal.String.Interpol */\n.highlight .sx { color: #0550AE } /* Literal.String.Other */\n.highlight .sr { color: #0550AE } /* Literal.String.Regex */\n.highlight .s1 { color: #0550AE } /* Literal.String.Single */\n.highlight .ss { color: #0550AE } /* Literal.String.Symbol */\n.highlight .bp { color: #953800 } /* Name.Builtin.Pseudo */\n.highlight .fm { color: #0550AE } /* Name.Function.Magic */\n.highlight .vc { color: #953800 } /* Name.Variable.Class */\n.highlight .vg { color: #953800 } /* Name.Variable.Global */\n.highlight .vi { color: #953800 } /* Name.Variable.Instance */\n.highlight .vm { color: #953800 } /* Name.Variable.Magic */\n.highlight .il { color: #953800 } /* Literal.Number.Integer.Long */\n","/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */\n\n/* Document\n ========================================================================== */\n\n/**\n * 1. Correct the line height in all browsers.\n * 2. Prevent adjustments of font size after orientation changes in iOS.\n */\n\nhtml {\n line-height: 1.15; /* 1 */\n text-size-adjust: 100%; /* 2 */\n}\n\n/* Sections\n ========================================================================== */\n\n/**\n * Remove the margin in all browsers.\n */\n\nbody {\n margin: 0;\n}\n\n/**\n * Render the `main` element consistently in IE.\n */\n\nmain {\n display: block;\n}\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n/* Grouping content\n ========================================================================== */\n\n/**\n * 1. Add the correct box sizing in Firefox.\n * 2. Show the overflow in Edge and IE.\n */\n\nhr {\n box-sizing: content-box; /* 1 */\n height: 0; /* 1 */\n overflow: visible; /* 2 */\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\npre {\n font-family: monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/* Text-level semantics\n ========================================================================== */\n\n/**\n * Remove the gray background on active links in IE 10.\n */\n\na {\n background-color: transparent;\n}\n\n/**\n * 1. Remove the bottom border in Chrome 57-\n * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n */\n\nabbr[title] {\n border-bottom: none; /* 1 */\n text-decoration: underline; /* 2 */\n text-decoration: underline dotted; /* 2 */\n}\n\n/**\n * Add the correct font weight in Chrome, Edge, and Safari.\n */\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\ncode,\nkbd,\nsamp {\n font-family: monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/**\n * Add the correct font size in all browsers.\n */\n\nsmall {\n font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` elements from affecting the line height in\n * all browsers.\n */\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/* Embedded content\n ========================================================================== */\n\n/**\n * Remove the border on images inside links in IE 10.\n */\n\nimg {\n border-style: none;\n}\n\n/* Forms\n ========================================================================== */\n\n/**\n * 1. Change the font styles in all browsers.\n * 2. Remove the margin in Firefox and Safari.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-size: 100%; /* 1 */\n line-height: 1.15; /* 1 */\n margin: 0; /* 2 */\n}\n\n/**\n * Show the overflow in IE.\n * 1. Show the overflow in Edge.\n */\n\nbutton,\ninput {\n /* 1 */\n overflow: visible;\n}\n\n/**\n * Remove the inheritance of text transform in Edge, Firefox, and IE.\n * 1. Remove the inheritance of text transform in Firefox.\n */\n\nbutton,\nselect {\n /* 1 */\n text-transform: none;\n}\n\n/**\n * Correct the inability to style clickable types in iOS and Safari.\n */\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n appearance: button;\n}\n\n/**\n * Remove the inner border and padding in Firefox.\n */\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n border-style: none;\n padding: 0;\n}\n\n/**\n * Restore the focus styles unset by the previous rule.\n */\n\nbutton:-moz-focusring,\n[type=\"button\"]:-moz-focusring,\n[type=\"reset\"]:-moz-focusring,\n[type=\"submit\"]:-moz-focusring {\n outline: 1px dotted ButtonText;\n}\n\n/**\n * Correct the padding in Firefox.\n */\n\nfieldset {\n padding: 0.35em 0.75em 0.625em;\n}\n\n/**\n * 1. Correct the text wrapping in Edge and IE.\n * 2. Correct the color inheritance from `fieldset` elements in IE.\n * 3. Remove the padding so developers are not caught out when they zero out\n * `fieldset` elements in all browsers.\n */\n\nlegend {\n box-sizing: border-box; /* 1 */\n color: inherit; /* 2 */\n display: table; /* 1 */\n max-width: 100%; /* 1 */\n padding: 0; /* 3 */\n white-space: normal; /* 1 */\n}\n\n/**\n * Add the correct vertical alignment in Chrome, Firefox, and Opera.\n */\n\nprogress {\n vertical-align: baseline;\n}\n\n/**\n * Remove the default vertical scrollbar in IE 10+.\n */\n\ntextarea {\n overflow: auto;\n}\n\n/**\n * 1. Add the correct box sizing in IE 10.\n * 2. Remove the padding in IE 10.\n */\n\n[type=\"checkbox\"],\n[type=\"radio\"] {\n box-sizing: border-box; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Correct the cursor style of increment and decrement buttons in Chrome.\n */\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n/**\n * 1. Correct the odd appearance in Chrome and Safari.\n * 2. Correct the outline style in Safari.\n */\n\n[type=\"search\"] {\n appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/**\n * Remove the inner padding in Chrome and Safari on macOS.\n */\n\n[type=\"search\"]::-webkit-search-decoration {\n appearance: none;\n}\n\n/**\n * 1. Correct the inability to style clickable types in iOS and Safari.\n * 2. Change font properties to `inherit` in Safari.\n */\n\n::-webkit-file-upload-button {\n appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/* Interactive\n ========================================================================== */\n\n/*\n * Add the correct display in Edge, IE 10+, and Firefox.\n */\n\ndetails {\n display: block;\n}\n\n/*\n * Add the correct display in all browsers.\n */\n\nsummary {\n display: list-item;\n}\n\n/* Misc\n ========================================================================== */\n\n/**\n * Add the correct display in IE 10+.\n */\n\ntemplate {\n display: none;\n}\n\n/**\n * Add the correct display in IE 10.\n */\n\n[hidden] {\n display: none;\n}\n","// Base element style overrides\n// stylelint-disable selector-no-type, selector-max-type, selector-max-specificity, selector-max-id\n\n:root {\n color-scheme: $color-scheme;\n}\n\n* {\n box-sizing: border-box;\n}\n\nhtml {\n scroll-behavior: smooth;\n\n @include fs-4;\n}\n\nbody {\n font-family: $body-font-family;\n font-size: inherit;\n line-height: $body-line-height;\n color: $body-text-color;\n background-color: $body-background-color;\n overflow-wrap: break-word;\n}\n\nol,\nul,\ndl,\npre,\naddress,\nblockquote,\ntable,\ndiv,\nhr,\nform,\nfieldset,\nnoscript .table-wrapper {\n margin-top: 0;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n#toctitle {\n margin-top: 0;\n margin-bottom: 1em;\n font-weight: 500;\n line-height: $body-heading-line-height;\n color: $body-heading-color;\n}\n\np {\n margin-top: 1em;\n margin-bottom: 1em;\n}\n\na {\n color: $link-color;\n text-decoration: none;\n}\n\na:not([class]) {\n text-decoration: underline;\n text-decoration-color: $border-color;\n text-underline-offset: 2px;\n\n &:hover {\n text-decoration-color: rgba($link-color, 0.45);\n }\n}\n\ncode {\n font-family: $mono-font-family;\n font-size: 0.75em;\n line-height: $body-line-height;\n}\n\nfigure,\npre {\n margin: 0;\n}\n\nli {\n margin: 0.25em 0;\n}\n\nimg {\n max-width: 100%;\n height: auto;\n}\n\nhr {\n height: 1px;\n padding: 0;\n margin: $sp-6 0;\n background-color: $border-color;\n border: 0;\n}\n\n// adds a GitHub-style sidebar to blockquotes\nblockquote {\n margin: 10px 0;\n\n // resets user-agent stylesheets for blockquotes\n margin-block-start: 0;\n margin-inline-start: 0;\n padding-left: 1rem;\n border-left: 3px solid $border-color;\n}\n","$color-scheme: light !default;\n$body-background-color: $white !default;\n$body-heading-color: $grey-dk-300 !default;\n$body-text-color: $grey-dk-100 !default;\n$link-color: $purple-000 !default;\n$nav-child-link-color: $grey-dk-100 !default;\n$sidebar-color: $grey-lt-000 !default;\n$base-button-color: #f7f7f7 !default;\n$btn-primary-color: $purple-100 !default;\n$code-background-color: $white !default;\n$feedback-color: darken($sidebar-color, 3%) !default;\n$table-background-color: $white !default;\n$search-background-color: $white !default;\n$search-result-preview-color: $grey-dk-100 !default;\n\n@import \"./vendor/accessible-pygments/github-light\";\n","@mixin fs-1 {\n & {\n font-size: $font-size-1 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-1-sm !important;\n }\n}\n\n@mixin fs-2 {\n & {\n font-size: $font-size-2 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-3 !important;\n }\n}\n\n@mixin fs-3 {\n & {\n font-size: $font-size-3 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-4 !important;\n }\n}\n\n@mixin fs-4 {\n & {\n font-size: $font-size-4 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-5 !important;\n }\n}\n\n@mixin fs-5 {\n & {\n font-size: $font-size-5 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-6 !important;\n }\n}\n\n@mixin fs-6 {\n & {\n font-size: $font-size-6 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-7 !important;\n line-height: $body-heading-line-height;\n }\n}\n\n@mixin fs-7 {\n & {\n font-size: $font-size-7 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-8 !important;\n }\n}\n\n@mixin fs-8 {\n & {\n font-size: $font-size-8 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-9 !important;\n }\n}\n\n@mixin fs-9 {\n & {\n font-size: $font-size-9 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-10 !important;\n }\n}\n\n@mixin fs-10 {\n & {\n font-size: $font-size-10 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-10-sm !important;\n }\n}\n","// Media query\n\n// Media query mixin\n// Usage:\n// @include mq(md) {\n// ..medium and up styles\n// }\n@mixin mq($name) {\n // Retrieves the value from the key\n $value: map-get($media-queries, $name);\n\n // If the key exists in the map\n @if $value {\n // Prints a media query based on the value\n @media (min-width: $value) {\n @content;\n }\n } @else {\n @warn \"No value could be retrieved from `#{$media-query}`. Please make sure it is defined in `$media-queries` map.\";\n }\n}\n\n// Responsive container\n\n@mixin container {\n padding-right: $gutter-spacing-sm;\n padding-left: $gutter-spacing-sm;\n\n @include mq(md) {\n padding-right: $gutter-spacing;\n padding-left: $gutter-spacing;\n }\n}\n","// Typography\n\n// prettier-ignore\n$body-font-family: system-ui, -apple-system, blinkmacsystemfont, \"Segoe UI\",\n roboto, \"Helvetica Neue\", arial, sans-serif, \"Segoe UI Emoji\" !default;\n$mono-font-family: \"SFMono-Regular\", menlo, consolas, monospace !default;\n$root-font-size: 16px !default; // DEPRECATED: previously base font-size for rems\n$body-line-height: 1.4 !default;\n$content-line-height: 1.6 !default;\n$body-heading-line-height: 1.25 !default;\n\n// Font size\n// `-sm` suffix is the size at the small (and above) media query\n\n$font-size-1: 0.5625rem !default;\n$font-size-1-sm: 0.625rem !default;\n$font-size-2: 0.6875rem !default; // h4 - uppercased!, h6 not uppercased, text-small\n$font-size-3: 0.75rem !default; // h5\n$font-size-4: 0.875rem !default;\n$font-size-5: 1rem !default; // h3\n$font-size-6: 1.125rem !default; // h2\n$font-size-7: 1.5rem !default;\n$font-size-8: 2rem !default; // h1\n$font-size-9: 2.25rem !default;\n$font-size-10: 2.625rem !default;\n$font-size-10-sm: 3rem !default;\n\n// Colors\n\n$white: #fff !default;\n$grey-dk-000: #959396 !default;\n$grey-dk-100: #5c5962 !default;\n$grey-dk-200: #44434d !default;\n$grey-dk-250: #302d36 !default;\n$grey-dk-300: #27262b !default;\n$grey-lt-000: #f5f6fa !default;\n$grey-lt-100: #eeebee !default;\n$grey-lt-200: #ecebed !default;\n$grey-lt-300: #e6e1e8 !default;\n$purple-000: #7253ed !default;\n$purple-100: #5e41d0 !default;\n$purple-200: #4e26af !default;\n$purple-300: #381885 !default;\n$blue-000: #2c84fa !default;\n$blue-100: #2869e6 !default;\n$blue-200: #264caf !default;\n$blue-300: #183385 !default;\n$green-000: #41d693 !default;\n$green-100: #11b584 !default;\n$green-200: #009c7b !default;\n$green-300: #026e57 !default;\n$yellow-000: #ffeb82 !default;\n$yellow-100: #fadf50 !default;\n$yellow-200: #f7d12e !default;\n$yellow-300: #e7af06 !default;\n$red-000: #f77e7e !default;\n$red-100: #f96e65 !default;\n$red-200: #e94c4c !default;\n$red-300: #dd2e2e !default;\n\n// Spacing\n\n$spacing-unit: 1rem; // 1rem == 16px\n\n$spacers: (\n sp-0: 0,\n sp-1: $spacing-unit * 0.25,\n sp-2: $spacing-unit * 0.5,\n sp-3: $spacing-unit * 0.75,\n sp-4: $spacing-unit,\n sp-5: $spacing-unit * 1.5,\n sp-6: $spacing-unit * 2,\n sp-7: $spacing-unit * 2.5,\n sp-8: $spacing-unit * 3,\n sp-9: $spacing-unit * 3.5,\n sp-10: $spacing-unit * 4,\n) !default;\n$sp-1: map-get($spacers, sp-1) !default; // 0.25 rem == 4px\n$sp-2: map-get($spacers, sp-2) !default; // 0.5 rem == 8px\n$sp-3: map-get($spacers, sp-3) !default; // 0.75 rem == 12px\n$sp-4: map-get($spacers, sp-4) !default; // 1 rem == 16px\n$sp-5: map-get($spacers, sp-5) !default; // 1.5 rem == 24px\n$sp-6: map-get($spacers, sp-6) !default; // 2 rem == 32px\n$sp-7: map-get($spacers, sp-7) !default; // 2.5 rem == 40px\n$sp-8: map-get($spacers, sp-8) !default; // 3 rem == 48px\n$sp-9: map-get($spacers, sp-9) !default; // 3.5 rem == 56px\n$sp-10: map-get($spacers, sp-10) !default; // 4 rem == 64px\n\n// Borders\n\n$border: 1px solid !default;\n$border-radius: 4px !default;\n$border-color: $grey-lt-100 !default;\n\n// Grid system\n\n$gutter-spacing: $sp-6 !default;\n$gutter-spacing-sm: $sp-4 !default;\n$nav-width: 16.5rem !default;\n$nav-width-md: 15.5rem !default;\n$nav-list-item-height: $sp-6 !default;\n$nav-list-item-height-sm: $sp-8 !default;\n$nav-list-expander-right: true;\n$content-width: 50rem !default;\n$header-height: 3.75rem !default;\n$search-results-width: $content-width - $nav-width !default;\n$transition-duration: 400ms;\n\n// Media queries in pixels\n\n$media-queries: (\n xs: 20rem,\n sm: 31.25rem,\n md: $content-width,\n lg: $content-width + $nav-width,\n xl: 87.5rem,\n) !default;\n","// The basic two column layout\n\n.side-bar {\n z-index: 0;\n display: flex;\n flex-wrap: wrap;\n background-color: $sidebar-color;\n\n @include mq(md) {\n flex-flow: column nowrap;\n position: fixed;\n width: $nav-width-md;\n height: 100%;\n border-right: $border $border-color;\n align-items: flex-end;\n }\n\n @include mq(lg) {\n width: calc((100% - #{$nav-width + $content-width}) / 2 + #{$nav-width});\n min-width: $nav-width;\n }\n\n & + .main {\n @include mq(md) {\n margin-left: $nav-width-md;\n }\n\n @include mq(lg) {\n // stylelint-disable function-name-case\n // disable for Max(), we want to use the CSS max() function\n margin-left: Max(\n #{$nav-width},\n calc((100% - #{$nav-width + $content-width}) / 2 + #{$nav-width})\n );\n // stylelint-enable function-name-case\n }\n\n .main-header {\n display: none;\n background-color: $sidebar-color;\n\n @include mq(md) {\n display: flex;\n background-color: $body-background-color;\n }\n\n &.nav-open {\n display: block;\n\n @include mq(md) {\n display: flex;\n }\n }\n }\n }\n}\n\n.main {\n margin: auto;\n\n @include mq(md) {\n position: relative;\n max-width: $content-width;\n }\n}\n\n.main-content-wrap {\n padding-top: $gutter-spacing-sm;\n padding-bottom: $gutter-spacing-sm;\n\n @include container;\n\n @include mq(md) {\n padding-top: $gutter-spacing;\n padding-bottom: $gutter-spacing;\n }\n}\n\n.main-header {\n z-index: 0;\n border-bottom: $border $border-color;\n\n @include mq(md) {\n display: flex;\n justify-content: space-between;\n height: $header-height;\n }\n}\n\n.site-nav,\n.site-header,\n.site-footer {\n width: 100%;\n\n @include mq(lg) {\n width: $nav-width;\n }\n}\n\n.site-nav {\n display: none;\n\n &.nav-open {\n display: block;\n }\n\n @include mq(md) {\n display: block;\n padding-top: $sp-8;\n padding-bottom: $gutter-spacing-sm;\n overflow-y: auto;\n flex: 1 1 auto;\n }\n}\n\n.site-header {\n display: flex;\n min-height: $header-height;\n align-items: center;\n\n @include mq(md) {\n height: $header-height;\n max-height: $header-height;\n border-bottom: $border $border-color;\n }\n}\n\n.site-title {\n flex-grow: 1;\n display: flex;\n height: 100%;\n align-items: center;\n padding-top: $sp-3;\n padding-bottom: $sp-3;\n color: $body-heading-color;\n\n @include container;\n\n @include fs-6;\n\n @include mq(md) {\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n }\n}\n\n@if variable-exists(logo) {\n .site-logo {\n width: 100%;\n height: 100%;\n background-image: url($logo);\n background-repeat: no-repeat;\n background-position: left center;\n background-size: contain;\n }\n}\n\n.site-button {\n display: flex;\n height: 100%;\n padding: $gutter-spacing-sm;\n align-items: center;\n}\n\n@include mq(md) {\n .site-header .site-button {\n display: none;\n }\n}\n\n.site-title:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 80%,\n rgba($feedback-color, 0) 100%\n );\n}\n\n.site-button:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 100%\n );\n}\n\n.site-footer {\n position: absolute;\n bottom: 0;\n left: 0;\n padding-top: $sp-4;\n padding-bottom: $sp-4;\n\n @include container;\n\n @include fs-2;\n\n @include mq(md) {\n position: static;\n justify-self: end;\n }\n}\n\n.icon {\n width: $sp-5;\n height: $sp-5;\n color: $link-color;\n}\n","@charset \"UTF-8\";\n\n// Styles for rendered markdown in the .main-content container\n// stylelint-disable selector-no-type, max-nesting-depth, selector-max-compound-selectors, selector-max-type, selector-max-specificity, selector-max-id\n\n.main-content {\n line-height: $content-line-height;\n\n ol,\n ul,\n dl,\n pre,\n address,\n blockquote,\n .table-wrapper {\n margin-top: 0.5em;\n }\n\n a {\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n ul,\n ol {\n padding-left: 1.5em;\n }\n\n li {\n .highlight {\n margin-top: $sp-1;\n }\n }\n\n ol {\n list-style-type: none;\n counter-reset: step-counter;\n\n > li {\n position: relative;\n\n &::before {\n position: absolute;\n top: 0.2em;\n left: -1.6em;\n color: $grey-dk-000;\n content: counter(step-counter);\n counter-increment: step-counter;\n @include fs-3;\n\n @include mq(sm) {\n top: 0.11em;\n }\n }\n\n ol {\n counter-reset: sub-counter;\n\n > li {\n &::before {\n content: counter(sub-counter, lower-alpha);\n counter-increment: sub-counter;\n }\n }\n }\n }\n }\n\n ul {\n list-style: none;\n\n > li {\n &::before {\n position: absolute;\n margin-left: -1.4em;\n color: $grey-dk-000;\n content: \"•\";\n }\n }\n }\n\n .task-list-item {\n &::before {\n content: \"\";\n }\n }\n\n .task-list-item-checkbox {\n margin-right: 0.6em;\n margin-left: -1.4em;\n\n // The same margin-left is used above for ul > li::before\n }\n\n hr + * {\n margin-top: 0;\n }\n\n h1:first-of-type {\n margin-top: 0.5em;\n }\n\n dl {\n display: grid;\n grid-template: auto / 10em 1fr;\n }\n\n dt,\n dd {\n margin: 0.25em 0;\n }\n\n dt {\n grid-column: 1;\n font-weight: 500;\n text-align: right;\n\n &::after {\n content: \":\";\n }\n }\n\n dd {\n grid-column: 2;\n margin-bottom: 0;\n margin-left: 1em;\n\n blockquote,\n div,\n dl,\n dt,\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n li,\n ol,\n p,\n pre,\n table,\n ul,\n .table-wrapper {\n &:first-child {\n margin-top: 0;\n }\n }\n }\n\n dd,\n ol,\n ul {\n dl:first-child {\n dt:first-child,\n dd:nth-child(2) {\n margin-top: 0;\n }\n }\n }\n\n .anchor-heading {\n position: absolute;\n right: -$sp-4;\n width: $sp-5;\n height: 100%;\n padding-right: $sp-1;\n padding-left: $sp-1;\n overflow: visible;\n\n @include mq(md) {\n right: auto;\n left: -$sp-5;\n }\n\n svg {\n display: inline-block;\n width: 100%;\n height: 100%;\n color: $link-color;\n visibility: hidden;\n }\n }\n\n .anchor-heading:hover,\n .anchor-heading:focus,\n h1:hover > .anchor-heading,\n h2:hover > .anchor-heading,\n h3:hover > .anchor-heading,\n h4:hover > .anchor-heading,\n h5:hover > .anchor-heading,\n h6:hover > .anchor-heading {\n svg {\n visibility: visible;\n }\n }\n\n summary {\n cursor: pointer;\n }\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n #toctitle {\n position: relative;\n margin-top: 1.5em;\n margin-bottom: 0.25em;\n\n + table,\n + .table-wrapper,\n + .code-example,\n + .highlighter-rouge,\n + .sectionbody .listingblock {\n margin-top: 1em;\n }\n\n + p:not(.label) {\n margin-top: 0;\n }\n }\n\n > h1:first-child,\n > h2:first-child,\n > h3:first-child,\n > h4:first-child,\n > h5:first-child,\n > h6:first-child,\n > .sect1:first-child > h2,\n > .sect2:first-child > h3,\n > .sect3:first-child > h4,\n > .sect4:first-child > h5,\n > .sect5:first-child > h6 {\n margin-top: $sp-2;\n }\n}\n","// Main nav, breadcrumb, etc...\n// stylelint-disable selector-no-type, max-nesting-depth, selector-max-compound-selectors, selector-max-type, selector-max-specificity\n\n.nav-list {\n padding: 0;\n margin-top: 0;\n margin-bottom: 0;\n list-style: none;\n\n .nav-list-item {\n position: relative;\n margin: 0;\n\n @include fs-4;\n\n @include mq(md) {\n @include fs-3;\n }\n\n .nav-list-link {\n display: block;\n min-height: $nav-list-item-height-sm;\n padding-top: $sp-1;\n padding-bottom: $sp-1;\n line-height: #{$nav-list-item-height-sm - 2 * $sp-1};\n @if $nav-list-expander-right {\n padding-right: $nav-list-item-height-sm;\n padding-left: $gutter-spacing-sm;\n } @else {\n padding-right: $gutter-spacing-sm;\n padding-left: $nav-list-item-height-sm;\n }\n\n @include mq(md) {\n min-height: $nav-list-item-height;\n line-height: #{$nav-list-item-height - 2 * $sp-1};\n @if $nav-list-expander-right {\n padding-right: $nav-list-item-height;\n padding-left: $gutter-spacing;\n } @else {\n padding-right: $gutter-spacing;\n padding-left: $nav-list-item-height;\n }\n }\n\n &.external > svg {\n width: $sp-4;\n height: $sp-4;\n vertical-align: text-bottom;\n }\n\n &.active {\n font-weight: 600;\n text-decoration: none;\n }\n\n &:hover,\n &.active {\n color: darken($link-color, 5%);\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 80%,\n rgba($feedback-color, 0) 100%\n );\n }\n }\n\n .nav-list-expander {\n position: absolute;\n @if $nav-list-expander-right {\n right: 0;\n }\n\n width: $nav-list-item-height-sm;\n height: $nav-list-item-height-sm;\n padding: #{$nav-list-item-height-sm * 0.25};\n color: $link-color;\n\n @include mq(md) {\n width: $nav-list-item-height;\n height: $nav-list-item-height;\n padding: #{$nav-list-item-height * 0.25};\n }\n\n &:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 100%\n );\n }\n\n @if $nav-list-expander-right {\n svg {\n transform: rotate(90deg);\n }\n }\n }\n\n > .nav-list {\n display: none;\n padding-left: $sp-3;\n list-style: none;\n\n .nav-list-item {\n position: relative;\n\n .nav-list-link {\n color: $nav-child-link-color;\n }\n\n .nav-list-expander {\n color: $nav-child-link-color;\n }\n }\n }\n\n &.active {\n > .nav-list-expander svg {\n @if $nav-list-expander-right {\n transform: rotate(-90deg);\n } @else {\n transform: rotate(90deg);\n }\n }\n\n > .nav-list {\n display: block;\n }\n }\n }\n}\n\n.nav-category {\n padding: $sp-2 $gutter-spacing-sm;\n font-weight: 600;\n text-align: start;\n text-transform: uppercase;\n border-bottom: $border $border-color;\n @include fs-2;\n\n @include mq(md) {\n padding: $sp-2 $gutter-spacing;\n margin-top: $gutter-spacing-sm;\n text-align: start;\n\n &:first-child {\n margin-top: 0;\n }\n }\n}\n\n.nav-list.nav-category-list {\n > .nav-list-item {\n margin: 0;\n\n > .nav-list {\n padding: 0;\n\n > .nav-list-item {\n > .nav-list-link {\n color: $link-color;\n }\n\n > .nav-list-expander {\n color: $link-color;\n }\n }\n }\n }\n}\n\n// Aux nav\n\n.aux-nav {\n height: 100%;\n overflow-x: auto;\n @include fs-2;\n\n .aux-nav-list {\n display: flex;\n height: 100%;\n padding: 0;\n margin: 0;\n list-style: none;\n }\n\n .aux-nav-list-item {\n display: inline-block;\n height: 100%;\n padding: 0;\n margin: 0;\n }\n\n @include mq(md) {\n padding-right: $gutter-spacing-sm;\n }\n}\n\n// Breadcrumb nav\n\n.breadcrumb-nav {\n @include mq(md) {\n margin-top: -$sp-4;\n }\n}\n\n.breadcrumb-nav-list {\n padding-left: 0;\n margin-bottom: $sp-3;\n list-style: none;\n}\n\n.breadcrumb-nav-list-item {\n display: table-cell;\n @include fs-2;\n\n &::before {\n display: none;\n }\n\n &::after {\n display: inline-block;\n margin-right: $sp-2;\n margin-left: $sp-2;\n color: $grey-dk-000;\n content: \"/\";\n }\n\n &:last-child {\n &::after {\n content: \"\";\n }\n }\n}\n","// Typography\n// stylelint-disable selector-no-type, selector-max-type, selector-max-specificity, selector-max-id\n\nh1,\n.text-alpha {\n font-weight: 300;\n\n @include fs-8;\n}\n\nh2,\n.text-beta,\n#toctitle {\n @include fs-6;\n}\n\nh3,\n.text-gamma {\n @include fs-5;\n}\n\nh4,\n.text-delta {\n font-weight: 400;\n text-transform: uppercase;\n letter-spacing: 0.1em;\n\n @include fs-2;\n}\n\nh4 code {\n text-transform: none;\n}\n\nh5,\n.text-epsilon {\n @include fs-3;\n}\n\nh6,\n.text-zeta {\n @include fs-2;\n}\n\n.text-small {\n @include fs-2;\n}\n\n.text-mono {\n font-family: $mono-font-family !important;\n}\n\n.text-left {\n text-align: left !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n.text-right {\n text-align: right !important;\n}\n","// Labels (not the form kind)\n\n// this :not() prevents a style clash with Mermaid.js's\n// diagram labels, which also use .label\n// for more, see https://github.com/just-the-docs/just-the-docs/issues/1272\n// and the accompanying PR\n.label:not(g),\n.label-blue:not(g) {\n display: inline-block;\n padding: 0.16em 0.56em;\n margin-right: $sp-2;\n margin-left: $sp-2;\n color: $white;\n text-transform: uppercase;\n vertical-align: middle;\n background-color: $blue-100;\n border-radius: 12px;\n\n @include fs-2;\n}\n\n.label-green:not(g) {\n background-color: $green-300;\n}\n\n.label-purple:not(g) {\n background-color: $purple-100;\n}\n\n.label-red:not(g) {\n background-color: $red-300;\n}\n\n.label-yellow:not(g) {\n color: $grey-dk-200;\n background-color: $yellow-200;\n}\n","// Buttons and things that look like buttons\n// stylelint-disable color-named\n\n.btn {\n display: inline-block;\n box-sizing: border-box;\n padding: 0.3em 1em;\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n font-weight: 500;\n line-height: 1.5;\n color: $link-color;\n text-decoration: none;\n vertical-align: baseline;\n cursor: pointer;\n background-color: $base-button-color;\n border-width: 0;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n appearance: none;\n\n &:focus {\n text-decoration: none;\n outline: none;\n box-shadow: 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:focus:hover,\n &.selected:focus {\n box-shadow: 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:hover,\n &.zeroclipboard-is-hover {\n color: darken($link-color, 2%);\n }\n\n &:hover,\n &:active,\n &.zeroclipboard-is-hover,\n &.zeroclipboard-is-active {\n text-decoration: none;\n background-color: darken($base-button-color, 1%);\n }\n\n &:active,\n &.selected,\n &.zeroclipboard-is-active {\n background-color: darken($base-button-color, 3%);\n background-image: none;\n box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15);\n }\n\n &.selected:hover {\n background-color: darken(#dcdcdc, 5%);\n }\n\n &:disabled,\n &.disabled {\n &,\n &:hover {\n color: rgba(102, 102, 102, 0.5);\n cursor: default;\n background-color: rgba(229, 229, 229, 0.5);\n background-image: none;\n box-shadow: none;\n }\n }\n}\n\n.btn-outline {\n color: $link-color;\n background: transparent;\n box-shadow: inset 0 0 0 2px $grey-lt-300;\n\n &:hover,\n &:active,\n &.zeroclipboard-is-hover,\n &.zeroclipboard-is-active {\n color: darken($link-color, 4%);\n text-decoration: none;\n background-color: transparent;\n box-shadow: inset 0 0 0 3px $grey-lt-300;\n }\n\n &:focus {\n text-decoration: none;\n outline: none;\n box-shadow:\n inset 0 0 0 2px $grey-dk-100,\n 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:focus:hover,\n &.selected:focus {\n box-shadow: inset 0 0 0 2px $grey-dk-100;\n }\n}\n\n.btn-primary {\n @include btn-color($white, $btn-primary-color);\n}\n\n.btn-purple {\n @include btn-color($white, $purple-100);\n}\n\n.btn-blue {\n @include btn-color($white, $blue-200);\n}\n\n.btn-green {\n @include btn-color($white, $green-300);\n}\n\n.btn-reset {\n background: none;\n border: none;\n margin: 0;\n text-align: inherit;\n font: inherit;\n border-radius: 0;\n appearance: none;\n}\n","// Colored button\n\n@mixin btn-color($fg, $bg) {\n color: $fg;\n background-color: darken($bg, 2%);\n background-image: linear-gradient(lighten($bg, 5%), darken($bg, 2%));\n box-shadow:\n 0 1px 3px rgba(0, 0, 0, 0.25),\n 0 4px 10px rgba(0, 0, 0, 0.12);\n\n &:hover,\n &.zeroclipboard-is-hover {\n color: $fg;\n background-color: darken($bg, 4%);\n background-image: linear-gradient((lighten($bg, 2%), darken($bg, 4%)));\n }\n\n &:active,\n &.selected,\n &.zeroclipboard-is-active {\n background-color: darken($bg, 5%);\n background-image: none;\n box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15);\n }\n\n &.selected:hover {\n background-color: darken($bg, 10%);\n }\n}\n","// Search input and autocomplete\n\n.search {\n position: relative;\n z-index: 2;\n flex-grow: 1;\n height: $sp-10;\n padding: $sp-2;\n transition: padding linear #{$transition-duration * 0.5};\n\n @include mq(md) {\n position: relative !important;\n width: auto !important;\n height: 100% !important;\n padding: 0;\n transition: none;\n }\n}\n\n.search-input-wrap {\n position: relative;\n z-index: 1;\n height: $sp-8;\n overflow: hidden;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n transition: height linear #{$transition-duration * 0.5};\n\n @include mq(md) {\n position: absolute;\n width: 100%;\n max-width: $search-results-width;\n height: 100% !important;\n border-radius: 0;\n box-shadow: none;\n transition: width ease $transition-duration;\n }\n}\n\n.search-input {\n position: absolute;\n width: 100%;\n height: 100%;\n padding: $sp-2 $gutter-spacing-sm $sp-2 #{$gutter-spacing-sm + $sp-5};\n font-size: 1rem;\n color: $body-text-color;\n background-color: $search-background-color;\n border-top: 0;\n border-right: 0;\n border-bottom: 0;\n border-left: 0;\n border-radius: 0;\n\n @include mq(md) {\n padding: $sp-2 $gutter-spacing-sm $sp-2 #{$gutter-spacing + $sp-5};\n font-size: 0.875rem;\n background-color: $body-background-color;\n transition: padding-left linear #{$transition-duration * 0.5};\n }\n\n &:focus {\n outline: 2px solid $link-color;\n outline-offset: -2px;\n\n + .search-label .search-icon {\n color: $link-color;\n }\n }\n}\n\n.search-label {\n position: absolute;\n display: flex;\n height: 100%;\n padding-left: $gutter-spacing-sm;\n\n @include mq(md) {\n padding-left: $gutter-spacing;\n transition: padding-left linear #{$transition-duration * 0.5};\n }\n\n .search-icon {\n width: #{$sp-4 * 1.2};\n height: #{$sp-4 * 1.2};\n align-self: center;\n color: $grey-dk-000;\n }\n}\n\n.search-results {\n position: absolute;\n left: 0;\n display: none;\n width: 100%;\n max-height: calc(100% - #{$sp-10});\n overflow-y: auto;\n background-color: $search-background-color;\n border-bottom-right-radius: $border-radius;\n border-bottom-left-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n\n @include mq(md) {\n top: 100%;\n width: $search-results-width;\n max-height: calc(100vh - 200%) !important;\n }\n}\n\n.search-results-list {\n padding-left: 0;\n margin-bottom: $sp-1;\n list-style: none;\n @include fs-4;\n\n @include mq(md) {\n @include fs-3;\n }\n}\n\n.search-results-list-item {\n padding: 0;\n margin: 0;\n}\n\n.search-result {\n display: block;\n padding: $sp-1 $sp-3;\n\n &:hover,\n &.active {\n background-color: $feedback-color;\n }\n}\n\n.search-result-title {\n display: block;\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n\n @include mq(sm) {\n display: inline-block;\n width: 40%;\n padding-right: $sp-2;\n vertical-align: top;\n }\n}\n\n.search-result-doc {\n display: flex;\n align-items: center;\n word-wrap: break-word;\n\n &.search-result-doc-parent {\n opacity: 0.5;\n @include fs-3;\n\n @include mq(md) {\n @include fs-2;\n }\n }\n\n .search-result-icon {\n width: $sp-4;\n height: $sp-4;\n margin-right: $sp-2;\n color: $link-color;\n flex-shrink: 0;\n }\n\n .search-result-doc-title {\n overflow: auto;\n }\n}\n\n.search-result-section {\n margin-left: #{$sp-4 + $sp-2};\n word-wrap: break-word;\n}\n\n.search-result-rel-url {\n display: block;\n margin-left: #{$sp-4 + $sp-2};\n overflow: hidden;\n color: $search-result-preview-color;\n text-overflow: ellipsis;\n white-space: nowrap;\n @include fs-1;\n}\n\n.search-result-previews {\n display: block;\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n padding-left: $sp-4;\n margin-left: $sp-2;\n color: $search-result-preview-color;\n word-wrap: break-word;\n border-left: $border;\n border-left-color: $border-color;\n @include fs-2;\n\n @include mq(sm) {\n display: inline-block;\n width: 60%;\n padding-left: $sp-2;\n margin-left: 0;\n vertical-align: top;\n }\n}\n\n.search-result-preview + .search-result-preview {\n margin-top: $sp-1;\n}\n\n.search-result-highlight {\n font-weight: bold;\n}\n\n.search-no-result {\n padding: $sp-2 $sp-3;\n @include fs-3;\n}\n\n.search-button {\n position: fixed;\n right: $sp-4;\n bottom: $sp-4;\n display: flex;\n width: $sp-9;\n height: $sp-9;\n background-color: $search-background-color;\n border: 1px solid rgba($link-color, 0.3);\n border-radius: #{$sp-9 * 0.5};\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n align-items: center;\n justify-content: center;\n}\n\n.search-overlay {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1;\n width: 0;\n height: 0;\n background-color: rgba(0, 0, 0, 0.3);\n opacity: 0;\n transition:\n opacity ease $transition-duration,\n width 0s $transition-duration,\n height 0s $transition-duration;\n}\n\n.search-active {\n .search {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n padding: 0;\n }\n\n .search-input-wrap {\n height: $sp-10;\n border-radius: 0;\n\n @include mq(md) {\n width: $search-results-width;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n }\n }\n\n .search-input {\n background-color: $search-background-color;\n\n @include mq(md) {\n padding-left: 2.3rem;\n }\n }\n\n .search-label {\n @include mq(md) {\n padding-left: 0.6rem;\n }\n }\n\n .search-results {\n display: block;\n }\n\n .search-overlay {\n width: 100%;\n height: 100%;\n opacity: 1;\n transition:\n opacity ease $transition-duration,\n width 0s,\n height 0s;\n }\n\n @include mq(md) {\n .main {\n position: fixed;\n right: 0;\n left: 0;\n }\n }\n\n .main-header {\n padding-top: $sp-10;\n\n @include mq(md) {\n padding-top: 0;\n }\n }\n}\n","// Tables\n// stylelint-disable max-nesting-depth, selector-no-type, selector-max-type\n\n.table-wrapper {\n display: block;\n width: 100%;\n max-width: 100%;\n margin-bottom: $sp-5;\n overflow-x: auto;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n}\n\ntable {\n display: table;\n min-width: 100%;\n border-collapse: separate;\n}\n\nth,\ntd {\n min-width: 7.5rem;\n padding: $sp-2 $sp-3;\n background-color: $table-background-color;\n border-bottom: $border rgba($border-color, 0.5);\n border-left: $border $border-color;\n\n @include fs-3;\n\n &:first-of-type {\n border-left: 0;\n }\n}\n\ntbody {\n tr {\n &:last-of-type {\n th,\n td {\n border-bottom: 0;\n }\n\n td {\n padding-bottom: $sp-3;\n }\n }\n }\n}\n\nthead {\n th {\n border-bottom: $border $border-color;\n }\n}\n","// Code and syntax highlighting\n// stylelint-disable selector-no-qualifying-type, declaration-block-semicolon-newline-after,declaration-block-single-line-max-declarations, selector-no-type, selector-max-type, scss/comment-no-empty\n\n// {% raw %}\n\n// This instruction applies to all queues not within 'pre' or 'figure', avoiding 'code' generated by the highlight.\n:not(pre, figure) {\n & > code {\n padding: 0.2em 0.15em;\n font-weight: 400;\n background-color: $code-background-color;\n border: $border $border-color;\n border-radius: $border-radius;\n }\n}\n\n// Avoid appearance of dark border around visited code links in Safari\na:visited code {\n border-color: $border-color;\n}\n\n// Content structure for highlighted code blocks using fences or Liquid\n//\n// ```[LANG]...```, no kramdown line_numbers:\n// div.[language-LANG.]highlighter-rouge > div.highlight > pre.highlight > code\n//\n// ```[LANG]...```, kramdown line_numbers = true:\n// div.[language-LANG.]highlighter-rouge > div.highlight > pre.highlight > code\n// > div.table-wrapper > table.rouge-table > tbody > tr\n// > td.rouge-gutter.gl > pre.lineno\n// | td.rouge-code > pre\n//\n// {% highlight LANG %}...{% endhighlight %}:\n// figure.highlight > pre > code.language-LANG\n//\n// {% highlight LANG linenos %}...{% endhighlight %}:\n// figure.highlight > pre > code.language-LANG\n// > div.table-wrapper > table.rouge-table > tbody > tr\n// > td.gutter.gl > pre.lineno\n// | td.code > pre\n//\n// ----...---- (AsciiDoc)\n// div.listingblock > div.content > pre.rouge.highlight\n//\n// fix_linenos removes the outermost pre when it encloses table.rouge-table\n//\n// See docs/index-test.md for some tests.\n//\n// No kramdown line_numbers: fences and Liquid highlighting look the same.\n// Kramdown line_numbers = true: fences have a wider gutter than with Liquid?\n\n// ```[LANG]...```\n// or in AsciiDoc:\n//\n// ----\n// ...\n// ----\n\n// the code may appear with 3 different types:\n// container \\ case: default case, code with line number, code with html rendering\n// top level: div.highlighter-rouge, figure.highlight, figure.highlight\n// second level: div.highlight, div.table-wrapper, pre.highlight\n// third level: pre.highlight, td.code, absent\n// last level: code, pre, code (optionality)\n// highlighter level: span, span, span\n// the spacing are only in the second level for case 1, 3 and in the third level for case 2\n// in AsciiDoc, there is a parent container that contains optionally a title and the content.\n\n// select top level container\ndiv.highlighter-rouge,\ndiv.listingblock > div.content,\nfigure.highlight {\n margin-top: 0;\n margin-bottom: $sp-3;\n background-color: $code-background-color;\n border-radius: $border-radius;\n box-shadow: none;\n -webkit-overflow-scrolling: touch;\n position: relative;\n padding: 0;\n\n // copy button (or other button)\n // the button appear only when there is a hover on the code or focus on button\n > button {\n width: $sp-3;\n opacity: 0;\n position: absolute;\n top: 0;\n right: 0;\n padding: $sp-3;\n border: none;\n background: none;\n color: $body-text-color;\n box-sizing: content-box;\n\n svg {\n fill: $body-text-color;\n }\n\n &:active {\n text-decoration: none;\n outline: none;\n opacity: 1;\n }\n\n &:focus {\n opacity: 1;\n outline: 2px solid $link-color;\n }\n }\n\n // the button can be seen by doing a simple hover in the code, there is no need to go over the location of the button\n &:hover {\n > button {\n cursor: copy;\n opacity: 1;\n }\n }\n}\n\n// setting the spacing and scrollbar on the second level for the first case\n// remove all space on the second and third level\n// this is a mixin to accommodate for the slightly different structures generated via Markdown vs AsciiDoc\n@mixin scroll-and-spacing($code-div, $pre-select) {\n #{$code-div} {\n overflow-x: auto;\n padding: $sp-3;\n margin: 0;\n border: 1px solid $body-text-color;\n border-radius: $border-radius;\n }\n\n #{$pre-select},\n code {\n padding: 0;\n margin: 0;\n border: 0;\n }\n}\n\n// for Markdown\ndiv.highlighter-rouge {\n @include scroll-and-spacing(\"div.highlight\", \"pre.highlight\");\n}\n\n// for AsciiDoc. we also need to fix the margins for its parent container.\ndiv.listingblock {\n margin-top: 0;\n margin-bottom: $sp-3;\n\n @include scroll-and-spacing(\"div.content\", \"div.content > pre\");\n}\n\n// {% highlight LANG %}...{% endhighlight %},\n// {% highlight LANG linenos %}...{% endhighlight %}:\n\n// setting the spacing and scrollbar on the second level for the thirt case\n// the css rule are apply only to the last code enviroment\n// setting the scroolbar\nfigure.highlight {\n pre,\n :not(pre) > code {\n overflow-x: auto;\n padding: $sp-3;\n margin: 0;\n border: 1px solid $body-text-color;\n border-radius: $border-radius;\n }\n}\n\n// ```[LANG]...```, kramdown line_numbers = true,\n// {% highlight LANG linenos %}...{% endhighlight %}:\n\n// setting the spacing and scrollbar on the thirt level for the second case\n.highlight .table-wrapper {\n padding: $sp-3 0;\n margin: 0;\n border: 0;\n box-shadow: none;\n\n td,\n pre {\n min-width: 0;\n padding: 0;\n background-color: $code-background-color;\n border: 0;\n\n @include fs-2;\n }\n\n td.gl {\n width: 1em;\n padding-right: $sp-3;\n padding-left: $sp-3;\n }\n\n pre {\n margin: 0;\n line-height: 2;\n }\n}\n\n// Code examples: html render of a code\n.code-example,\n.listingblock > .title {\n padding: $sp-3;\n margin-bottom: $sp-3;\n overflow: auto;\n border: 1px solid $border-color;\n border-radius: $border-radius;\n\n + .highlighter-rouge,\n + .sectionbody .listingblock,\n + .content,\n + figure.highlight {\n position: relative;\n margin-top: -$sp-4;\n border-right: 1px solid $border-color;\n border-bottom: 1px solid $border-color;\n border-left: 1px solid $border-color;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n }\n}\n\n// Mermaid diagram code blocks should be left unstyled.\ncode.language-mermaid {\n padding: 0;\n background-color: inherit;\n border: 0;\n}\n\n// Override OneDarkJekyll Colors for Code Blocks\n.highlight,\npre.highlight {\n background: $code-background-color; // Code Background\n // For Backwards Compatibility Before $code-linenumber-color was added\n @if variable-exists(code-linenumber-color) {\n color: $code-linenumber-color; // Code Line Numbers\n } @else {\n color: $body-text-color; // Code Line Numbers\n }\n}\n\n// Override OneDarkJekyll Colors for Code Blocks\n.highlight pre {\n background: $code-background-color; // Code Background\n}\n\n// {% endraw %}\n","// Utility classes for colors\n\n// Text colors\n\n.text-grey-dk-000 {\n color: $grey-dk-000 !important;\n}\n\n.text-grey-dk-100 {\n color: $grey-dk-100 !important;\n}\n\n.text-grey-dk-200 {\n color: $grey-dk-200 !important;\n}\n\n.text-grey-dk-250 {\n color: $grey-dk-250 !important;\n}\n\n.text-grey-dk-300 {\n color: $grey-dk-300 !important;\n}\n\n.text-grey-lt-000 {\n color: $grey-lt-000 !important;\n}\n\n.text-grey-lt-100 {\n color: $grey-lt-100 !important;\n}\n\n.text-grey-lt-200 {\n color: $grey-lt-200 !important;\n}\n\n.text-grey-lt-300 {\n color: $grey-lt-300 !important;\n}\n\n.text-blue-000 {\n color: $blue-000 !important;\n}\n\n.text-blue-100 {\n color: $blue-100 !important;\n}\n\n.text-blue-200 {\n color: $blue-200 !important;\n}\n\n.text-blue-300 {\n color: $blue-300 !important;\n}\n\n.text-green-000 {\n color: $green-000 !important;\n}\n\n.text-green-100 {\n color: $green-100 !important;\n}\n\n.text-green-200 {\n color: $green-200 !important;\n}\n\n.text-green-300 {\n color: $green-300 !important;\n}\n\n.text-purple-000 {\n color: $purple-000 !important;\n}\n\n.text-purple-100 {\n color: $purple-100 !important;\n}\n\n.text-purple-200 {\n color: $purple-200 !important;\n}\n\n.text-purple-300 {\n color: $purple-300 !important;\n}\n\n.text-yellow-000 {\n color: $yellow-000 !important;\n}\n\n.text-yellow-100 {\n color: $yellow-100 !important;\n}\n\n.text-yellow-200 {\n color: $yellow-200 !important;\n}\n\n.text-yellow-300 {\n color: $yellow-300 !important;\n}\n\n.text-red-000 {\n color: $red-000 !important;\n}\n\n.text-red-100 {\n color: $red-100 !important;\n}\n\n.text-red-200 {\n color: $red-200 !important;\n}\n\n.text-red-300 {\n color: $red-300 !important;\n}\n\n// Background colors\n\n.bg-grey-dk-000 {\n background-color: $grey-dk-000 !important;\n}\n\n.bg-grey-dk-100 {\n background-color: $grey-dk-100 !important;\n}\n\n.bg-grey-dk-200 {\n background-color: $grey-dk-200 !important;\n}\n\n.bg-grey-dk-250 {\n background-color: $grey-dk-250 !important;\n}\n\n.bg-grey-dk-300 {\n background-color: $grey-dk-300 !important;\n}\n\n.bg-grey-lt-000 {\n background-color: $grey-lt-000 !important;\n}\n\n.bg-grey-lt-100 {\n background-color: $grey-lt-100 !important;\n}\n\n.bg-grey-lt-200 {\n background-color: $grey-lt-200 !important;\n}\n\n.bg-grey-lt-300 {\n background-color: $grey-lt-300 !important;\n}\n\n.bg-blue-000 {\n background-color: $blue-000 !important;\n}\n\n.bg-blue-100 {\n background-color: $blue-100 !important;\n}\n\n.bg-blue-200 {\n background-color: $blue-200 !important;\n}\n\n.bg-blue-300 {\n background-color: $blue-300 !important;\n}\n\n.bg-green-000 {\n background-color: $green-000 !important;\n}\n\n.bg-green-100 {\n background-color: $green-100 !important;\n}\n\n.bg-green-200 {\n background-color: $green-200 !important;\n}\n\n.bg-green-300 {\n background-color: $green-300 !important;\n}\n\n.bg-purple-000 {\n background-color: $purple-000 !important;\n}\n\n.bg-purple-100 {\n background-color: $purple-100 !important;\n}\n\n.bg-purple-200 {\n background-color: $purple-200 !important;\n}\n\n.bg-purple-300 {\n background-color: $purple-300 !important;\n}\n\n.bg-yellow-000 {\n background-color: $yellow-000 !important;\n}\n\n.bg-yellow-100 {\n background-color: $yellow-100 !important;\n}\n\n.bg-yellow-200 {\n background-color: $yellow-200 !important;\n}\n\n.bg-yellow-300 {\n background-color: $yellow-300 !important;\n}\n\n.bg-red-000 {\n background-color: $red-000 !important;\n}\n\n.bg-red-100 {\n background-color: $red-100 !important;\n}\n\n.bg-red-200 {\n background-color: $red-200 !important;\n}\n\n.bg-red-300 {\n background-color: $red-300 !important;\n}\n","// Utility classes for layout\n\n// Display\n\n.d-block {\n display: block !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-none {\n display: none !important;\n}\n\n// Screenreader-only\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border-width: 0;\n}\n\n@each $media-query in map-keys($media-queries) {\n @for $i from 1 through length($spacers) {\n @include mq($media-query) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .d-sm-block, .d-md-none, .d-lg-inline\n .d-#{$media-query}-block {\n display: block !important;\n }\n .d-#{$media-query}-flex {\n display: flex !important;\n }\n .d-#{$media-query}-inline {\n display: inline !important;\n }\n .d-#{$media-query}-inline-block {\n display: inline-block !important;\n }\n .d-#{$media-query}-none {\n display: none !important;\n }\n }\n }\n}\n\n// Horizontal alignment\n\n.float-left {\n float: left !important;\n}\n\n.float-right {\n float: right !important;\n}\n\n.flex-justify-start {\n justify-content: flex-start !important;\n}\n\n.flex-justify-end {\n justify-content: flex-end !important;\n}\n\n.flex-justify-between {\n justify-content: space-between !important;\n}\n\n.flex-justify-around {\n justify-content: space-around !important;\n}\n\n// Vertical alignment\n\n.v-align-baseline {\n vertical-align: baseline !important;\n}\n\n.v-align-bottom {\n vertical-align: bottom !important;\n}\n\n.v-align-middle {\n vertical-align: middle !important;\n}\n\n.v-align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.v-align-text-top {\n vertical-align: text-top !important;\n}\n\n.v-align-top {\n vertical-align: top !important;\n}\n","// Utility classes for typography\n\n.fs-1 {\n @include fs-1;\n}\n\n.fs-2 {\n @include fs-2;\n}\n\n.fs-3 {\n @include fs-3;\n}\n\n.fs-4 {\n @include fs-4;\n}\n\n.fs-5 {\n @include fs-5;\n}\n\n.fs-6 {\n @include fs-6;\n}\n\n.fs-7 {\n @include fs-7;\n}\n\n.fs-8 {\n @include fs-8;\n}\n\n.fs-9 {\n @include fs-9;\n}\n\n.fs-10 {\n @include fs-10;\n}\n\n.fw-300 {\n font-weight: 300 !important;\n}\n\n.fw-400 {\n font-weight: 400 !important;\n}\n\n.fw-500 {\n font-weight: 500 !important;\n}\n\n.fw-700 {\n font-weight: 700 !important;\n}\n\n.lh-0 {\n line-height: 0 !important;\n}\n\n.lh-default {\n line-height: $body-line-height;\n}\n\n.lh-tight {\n line-height: $body-heading-line-height;\n}\n\n.ls-5 {\n letter-spacing: 0.05em !important;\n}\n\n.ls-10 {\n letter-spacing: 0.1em !important;\n}\n\n.ls-0 {\n letter-spacing: 0 !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n","// Utility classes for lists\n\n// stylelint-disable selector-max-type\n\n.list-style-none {\n padding: 0 !important;\n margin: 0 !important;\n list-style: none !important;\n\n li {\n &::before {\n display: none !important;\n }\n }\n}\n","// Utility classes for margins and padding\n\n// stylelint-disable block-opening-brace-space-after, block-opening-brace-space-before\n\n// Margin spacer utilities\n\n.mx-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n}\n\n@for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .m-0, .m-1, .m-2...\n .m-#{$scale} {\n margin: #{$size} !important;\n }\n .mt-#{$scale} {\n margin-top: #{$size} !important;\n }\n .mr-#{$scale} {\n margin-right: #{$size} !important;\n }\n .mb-#{$scale} {\n margin-bottom: #{$size} !important;\n }\n .ml-#{$scale} {\n margin-left: #{$size} !important;\n }\n\n .mx-#{$scale} {\n margin-right: #{$size} !important;\n margin-left: #{$size} !important;\n }\n\n .my-#{$scale} {\n margin-top: #{$size} !important;\n margin-bottom: #{$size} !important;\n }\n\n .mxn-#{$scale} {\n margin-right: -#{$size} !important;\n margin-left: -#{$size} !important;\n }\n .mx-#{$scale}-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n}\n\n@each $media-query in map-keys($media-queries) {\n @for $i from 1 through length($spacers) {\n @include mq($media-query) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .m-sm-0, .m-md-1, .m-lg-2...\n .m-#{$media-query}-#{$scale} {\n margin: #{$size} !important;\n }\n .mt-#{$media-query}-#{$scale} {\n margin-top: #{$size} !important;\n }\n .mr-#{$media-query}-#{$scale} {\n margin-right: #{$size} !important;\n }\n .mb-#{$media-query}-#{$scale} {\n margin-bottom: #{$size} !important;\n }\n .ml-#{$media-query}-#{$scale} {\n margin-left: #{$size} !important;\n }\n\n .mx-#{$media-query}-#{$scale} {\n margin-right: #{$size} !important;\n margin-left: #{$size} !important;\n }\n\n .my-#{$media-query}-#{$scale} {\n margin-top: #{$size} !important;\n margin-bottom: #{$size} !important;\n }\n\n .mxn-#{$media-query}-#{$scale} {\n margin-right: -#{$size} !important;\n margin-left: -#{$size} !important;\n }\n }\n }\n}\n\n// Padding spacer utilities\n\n@for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .p-0, .p-1, .p-2...\n .p-#{$scale} {\n padding: #{$size} !important;\n }\n .pt-#{$scale} {\n padding-top: #{$size} !important;\n }\n .pr-#{$scale} {\n padding-right: #{$size} !important;\n }\n .pb-#{$scale} {\n padding-bottom: #{$size} !important;\n }\n .pl-#{$scale} {\n padding-left: #{$size} !important;\n }\n\n .px-#{$scale} {\n padding-right: #{$size} !important;\n padding-left: #{$size} !important;\n }\n\n .py-#{$scale} {\n padding-top: #{$size} !important;\n padding-bottom: #{$size} !important;\n }\n}\n\n@each $media-query in map-keys($media-queries) {\n @include mq($media-query) {\n @for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .p-sm-0, .p-md-1, .p-lg-2...\n .p-#{$media-query}-#{$scale} {\n padding: #{$size} !important;\n }\n .pt-#{$media-query}-#{$scale} {\n padding-top: #{$size} !important;\n }\n .pr-#{$media-query}-#{$scale} {\n padding-right: #{$size} !important;\n }\n .pb-#{$media-query}-#{$scale} {\n padding-bottom: #{$size} !important;\n }\n .pl-#{$media-query}-#{$scale} {\n padding-left: #{$size} !important;\n }\n\n .px-#{$media-query}-#{$scale} {\n padding-right: #{$size} !important;\n padding-left: #{$size} !important;\n }\n\n .py-#{$media-query}-#{$scale} {\n padding-top: #{$size} !important;\n padding-bottom: #{$size} !important;\n }\n }\n }\n}\n","// stylelint-disable selector-max-specificity, selector-max-id, selector-max-type, selector-no-qualifying-type\n\n@media print {\n .site-footer,\n .site-button,\n #edit-this-page,\n #back-to-top,\n .site-nav,\n .main-header {\n display: none !important;\n }\n\n hr {\n margin-top: 1rem;\n margin-bottom: 1rem;\n }\n\n .side-bar {\n width: 100%;\n height: auto;\n border-right: 0 !important;\n }\n\n .site-header {\n border-bottom: 1px solid $border-color;\n }\n\n .site-title {\n font-size: 1rem !important;\n font-weight: 700 !important;\n }\n\n .text-small {\n font-size: 8pt !important;\n }\n\n pre.highlight {\n border: 1px solid $border-color;\n }\n\n .main {\n max-width: none;\n margin-left: 0;\n }\n}\n","// Skipnav\n// Skip to main content\n\na.skip-to-main {\n left: -999px;\n position: absolute;\n top: auto;\n width: 1px;\n height: 1px;\n overflow: hidden;\n z-index: -999;\n}\n\na.skip-to-main:focus,\na.skip-to-main:active {\n color: $link-color;\n background-color: $body-background-color;\n left: auto;\n top: auto;\n width: 30%;\n height: auto;\n overflow: auto;\n margin: 10px 35%;\n padding: 5px;\n border-radius: 15px;\n border: 4px solid $btn-primary-color;\n text-align: center;\n font-size: 1.2em;\n z-index: 999;\n}\n","\n@import \"./support/support\";\n@import \"./custom/setup\";\n@import \"./color_schemes/light\";\n\n@import \"./modules\";\ndiv.opaque {\n background-color: $body-background-color;\n}\n\np.tip, blockquote.tip {\n border: 1px $green-000 solid;\n border-left: $border-radius solid $green-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $green-300;\n content: \"Tip\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .tip-title {\n color: $green-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.tip-title, blockquote.tip-title {\n border: 1px $green-000 solid;\n border-left: $border-radius solid $green-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $green-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.tip {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.tip-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n\np.note, blockquote.note {\n border: 1px $blue-000 solid;\n border-left: $border-radius solid $blue-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $blue-300;\n content: \"Note\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .note-title {\n color: $blue-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.note-title, blockquote.note-title {\n border: 1px $blue-000 solid;\n border-left: $border-radius solid $blue-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $blue-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.note {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.note-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n\np.warning, blockquote.warning {\n border: 1px $yellow-000 solid;\n border-left: $border-radius solid $yellow-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $yellow-300;\n content: \"Warning\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .warning-title {\n color: $yellow-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.warning-title, blockquote.warning-title {\n border: 1px $yellow-000 solid;\n border-left: $border-radius solid $yellow-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $yellow-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.warning {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.warning-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n@import \"./custom/custom\";\n\n\n"],"file":"just-the-docs-light.css"} \ No newline at end of file +{"version":3,"sourceRoot":"","sources":["../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/vendor/accessible-pygments/github-light.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/vendor/normalize.scss/normalize.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/base.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/color_schemes/light.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/support/mixins/_typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/support/mixins/_layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/support/_variables.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/content.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/navigation.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/labels.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/buttons.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/support/mixins/_buttons.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/search.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/tables.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/code.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/utilities/_colors.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/utilities/_layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/utilities/_typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/utilities/_lists.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/utilities/_spacing.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/print.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/skiptomain.scss","just-the-docs-light.scss"],"names":[],"mappings":";AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA;EAAkB;;;AAClB;EAAgB;EAAiB;AACjC;EAAkB;EAAiB;AACnC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAkB;EAAiB;AACnC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAqB;AACtC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAoB;AACrC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAgB;EAAiB;AACjC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AChFlC;AAEA;AAAA;AAGA;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAAA;AAKA;EACE;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;EAEE;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;AAAA;EAGE;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;EAEE;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAAA;AAKA;AAAA;AAAA;AAAA;AAAA;EAKE;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;AAEE;EACA;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;AAEE;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;EAIE;;;AAGF;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;EAIE;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;EAIE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;EAEE;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;EAEE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AC1VF;EACE,cCJa;;;ADOf;EACE;;;AAGF;EACE;;AEmBA;EACE;;AClBA;EHHJ;IEyBI;;;;AFnBJ;EACE,aIfiB;EJgBjB;EACA,aIbiB;EJcjB,OIUY;EJTZ,kBIOM;EJNN;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAYE;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;EACA;EACA;EACA,aI1CyB;EJ2CzB,OIlBY;;;AJqBd;EACE;EACA;;;AAGF;EACE,OItBW;EJuBX;;;AAGF;EACE;EACA,uBI/BY;EJgCZ;;AAEA;EACE;;;AAIJ;EACE,aIvEiB;EJwEjB;EACA,aIvEiB;;;AJ0EnB;AAAA;EAEE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA,kBI/DY;EJgEZ;;;AAIF;EACE;EAGA;EACA;EACA;EACA;;;AK7GF;EACE;EACA;EACA;EACA,kBD6BY;;ADrBV;EEZJ;IAOI;IACA;IACA,ODwFW;ICvFX;IACA;IACA;;;AFAA;EEZJ;IAgBI;IACA,WD+EQ;;;ADpFR;EEQF;IAEI,aD2ES;;;ADrFX;EEQF;IAQI;;;AAOF;EACE;EACA,kBDJQ;;ADrBV;EEuBA;IAKI;IACA,kBDdA;;;ACiBF;EACE;;AFjCJ;EEgCE;IAII;;;;AAOV;EACE;;AF5CE;EE2CJ;IAII;IACA,WDyCY;;;;ACrChB;EACE,aDaK;ECZL,gBDYK;EDvDL,eCuDK;EDtDL,cCsDK;;ADlEH;EEoDJ;IFrCI,eCqDG;IDpDH,cCoDG;;;ADpEH;EEoDJ;IAOI,aDSG;ICRH,gBDQG;;;;ACJP;EACE;EACA;;AFlEE;EEgEJ;IAKI;IACA;IACA,QDmBY;;;;ACfhB;AAAA;AAAA;EAGE;;AF9EE;EE2EJ;AAAA;AAAA;IAMI,ODGQ;;;;ACCZ;EACE;;AAEA;EACE;;AFzFA;EEqFJ;IAQI;IACA,aDxBG;ICyBH,gBD7BG;IC8BH;IACA;;;;AAIJ;EACE;EACA,YDbc;ECcd;;AFxGE;EEqGJ;IAMI,QDjBY;ICkBZ,YDlBY;ICmBZ;;;;AAIJ;EACE;EACA;EACA;EACA;EACA,aDrDK;ECsDL,gBDtDK;ECuDL,ODpGY;EDTZ,eCuDK;EDtDL,cCsDK;;ADlEH;EEiHJ;IFlGI,eCqDG;IDpDH,cCoDG;;;AF/BL;EACE;;ACtCA;EEiHJ;IHvEI;IACA,aEhDuB;;;ADKvB;EEiHJ;IAcI,aD/DG;ICgEH,gBDhEG;;;;AC+EP;EACE;EACA;EACA,SDhFK;ECiFL;;;AFnJE;EEuJF;IACE;;;AAIJ;EACE;;;AAQF;EACE;;;AAOF;EACE;EACA;EACA;EACA,aD/GK;ECgHL,gBDhHK;EDvDL,eCuDK;EDtDL,cCsDK;;ADlEH;EE6KJ;IF9JI,eCqDG;IDpDH,cCoDG;;;AFvEL;EACE;;ACEA;EE6KJ;IH3KI;;;ACFA;EE6KJ;IAYI;IACA;;;;AAIJ;EACE,OD5HK;EC6HL,QD7HK;EC8HL,ODxKW;;;AElCb;EACE,aFEoB;;AEApB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;;AAGF;EACE;EACA;;AAGF;AAAA;EAEE;;AAIA;EACE,YF+CC;;AE3CL;EACE;EACA;;AAEA;EACE;;AAEA;EACE;EACA;EACA;EACA,OFfM;EEgBN;EACA;;AJ1BN;EACE;;ACRA;EG2BE;IJfF;;;ACZA;EG2BE;IAUI;;;AAIJ;EACE;;AAGE;EACE;EACA;;AAOV;EACE;;AAGE;EACE;EACA;EACA,OF7CM;EE8CN;;AAMJ;EACE;;AAIJ;EACE;EACA;;AAKF;EACE;;AAGF;EACE;;AAGF;EACE;EACA;;AAGF;AAAA;EAEE;;AAGF;EACE;EACA;EACA;;AAEA;EACE;;AAIJ;EACE;EACA;EACA;;AAmBE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;;AASF;AAAA;AAAA;AAAA;AAAA;AAAA;EAEE;;AAKN;EACE;EACA;EACA,OFnFG;EEoFH;EACA,eFzFG;EE0FH,cF1FG;EE2FH;;AH1JA;EGmJF;IAUI;IACA;;;AAGF;EACE;EACA;EACA;EACA,OF5IO;EE6IP;;AAYF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;;AAIJ;EACE;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;EACA;EACA;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAKE;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;;AAIJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAWE,YF9JG;;;AG3EP;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;ALoBF;EACE;;AClBA;EILF;IL2BE;;;ACtBA;EDOF;IACE;;;ACRA;EILF;ILiBE;;;AKPA;EACE;EACA,YH+DC;EG9DD,aHuDC;EGtDD,gBHsDC;EGrDD;EAEE,eH0DD;EGzDC,cHqDD;;ADlEH;EIKA;IAeI,YHgDD;IG/CC;IAEE,eH6CH;IG5CG,cH4CH;;;AGrCD;EACE,OHkCD;EGjCC,QHiCD;EGhCC;;AAGF;EACE;EACA;;AAGF;EAEE;EACA;;AASJ;EACE;EAEE;EAGF,OHUC;EGTD,QHSC;EGRD;EACA,OHtCO;;ADzBT;EIsDA;IAYI,OHED;IGDC,QHCD;IGAC;;;AAGF;EACE;;AAQA;EACE;;AAKN;EACE;EACA,cHvBC;EGwBD;;AAEA;EACE;;AAEA;EACE,OH9EI;;AGiFN;EACE,OHlFI;;AGwFR;EAEI;;AAMJ;EACE;;;AAMR;EACE;EACA;EACA;EACA;EACA;;ALhIA;EACE;;ACEA;EIwHJ;ILtHI;;;ACFA;EIwHJ;IASI;IACA,YHhEG;IGiEH;;EAEA;IACE;;;;AAMJ;EACE;;AAEA;EACE;;AAGE;EACE,OH3HG;;AG8HL;EACE,OH/HG;;;AGwIb;EACE;EACA;;ALtKA;EACE;;ACEA;EIiKJ;IL/JI;;;AKoKF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AJlLA;EIiKJ;IAqBI,eHpHG;;;;ADlEH;EI4LJ;IAEI;;;;AAIJ;EACE;EACA,eHnIK;EGoIL;;;AAGF;EACE;;AL5MA;EACE;;ACEA;EIwMJ;ILtMI;;;AK0MF;EACE;;AAGF;EACE;EACA,cHlJG;EGmJH,aHnJG;EGoJH,OHpMU;EGqMV;;AAIA;EACE;;;ACrON;AAAA;EAEE;;ANoEA;AAAA;EACE;EACA,aElEuB;;ADKvB;EKXJ;AAAA;IN4EI;;;;AA5BF;AAAA;AAAA;EACE;;ACtCA;EKJJ;AAAA;AAAA;IN8CI;IACA,aEhDuB;;;;AFgCzB;AAAA;EACE;;AC5BA;EKEJ;AAAA;IN8BI;;;;AMzBJ;AAAA;EAEE;EACA;EACA;;ANdA;AAAA;EACE;;ACEA;EKOJ;AAAA;INLI;;;;AMcJ;EACE;;;ANVA;AAAA;EACE;;ACRA;EKoBJ;AAAA;INRI;;;;AAfF;AAAA;EACE;;ACEA;EKyBJ;AAAA;INvBI;;;;AALF;EACE;;ACEA;EK8BJ;IN5BI;;;;AMgCJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;ACvDF;AAAA;EAEE;EACA;EACA,cLoEK;EKnEL,aLmEK;EKlEL,OLiBM;EKhBN;EACA;EACA,kBL6BS;EK5BT;;APLA;AAAA;EACE;;ACEA;EMRJ;AAAA;IPUI;;;;AOKJ;EACE,kBL4BU;;;AKzBZ;EACE,kBLcW;;;AKXb;EACE,kBL4BQ;;;AKzBV;EACE,OLFY;EKGZ,kBLkBW;;;AMlDb;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,ON2BW;EM1BX;EACA;EACA;EACA,kBTTkB;ESUlB;EACA,eNyEc;EMxEd,YACE;EAEF;;AAEA;EACE;EACA;EACA;;AAGF;EAEE;;AAGF;EAEE;;AAGF;EAIE;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;AAKA;EAEE;EACA;EACA;EACA;EACA;;;AAKN;EACE,ONnCW;EMoCX;EACA;;AAEA;EAIE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA,YACE;;AAIJ;EAEE;;;AAIJ;ECnGE,OP0BM;EOzBN;EACA;EACA,YACE;;AAGF;EAEE,OPiBI;EOhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;ADgFJ;ECvGE,OP0BM;EOzBN;EACA;EACA,YACE;;AAGF;EAEE,OPiBI;EOhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;ADoFJ;EC3GE,OP0BM;EOzBN;EACA;EACA,YACE;;AAGF;EAEE,OPiBI;EOhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;ADwFJ;EC/GE,OP0BM;EOzBN;EACA;EACA,YACE;;AAGF;EAEE,OPiBI;EOhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;AD4FJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AE3HF;EACE;EACA;EACA;EACA,QRgFM;EQ/EN,SRuEK;EQtEL;;ATME;ESZJ;IASI;IACA;IACA;IACA;IACA;;;;AAIJ;EACE;EACA;EACA,QR8DK;EQ7DL;EACA,eRmEc;EQlEd,YACE;EAEF;;ATdE;ESKJ;IAYI;IACA;IACA,WRwEmB;IQvEnB;IACA;IACA;IACA;;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA,ORhBY;EQiBZ,kBRnBM;EQoBN;EACA;EACA;EACA;EACA;;ATvCE;ES2BJ;IAeI;IACA;IACA,kBR7BI;IQ8BJ;;;AAGF;EACE;EACA;;AAEA;EACE,OR5BO;;;AQiCb;EACE;EACA;EACA;EACA,cRIK;;ADlEH;ES0DJ;IAOI,cRGG;IQFH;;;AAGF;EACE;EACA;EACA;EACA,ORzDU;;;AQ6Dd;EACE;EACA;EACA;EACA;EACA;EACA;EACA,kBRrEM;EQsEN,4BRRc;EQSd,2BRTc;EQUd,YACE;;ATxFA;ES6EJ;IAeI;IACA,ORFmB;IQGnB;;;;AAIJ;EACE;EACA,eRrCK;EQsCL;;AVpFA;EACE;;AClBA;ESkGJ;IV5EI;;;ACtBA;EDOF;IACE;;;ACRA;ESkGJ;IVtFI;;;;AUiGJ;EACE;EACA;;;AAGF;EACE;EACA;;AAEA;EAEE,kBX5Ha;;;AWgIjB;EACE;EACA,aR9DK;EQ+DL,gBR/DK;;ADhEH;ES4HJ;IAMI;IACA;IACA,eRpEG;IQqEH;;;;AAIJ;EACE;EACA;EACA;;AAEA;EACE;;AVxIF;EACE;;ACRA;ES8IF;IVlIE;;;ACZA;EDHF;IACE;;;ACEA;ES8IF;IV5IE;;;AUqJF;EACE,ORtFG;EQuFH,QRvFG;EQwFH,cR1FG;EQ2FH,ORlIS;EQmIT;;AAGF;EACE;;;AAIJ;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA,OR5JY;EQ6JZ;EACA;;AV5LA;EACE;;ACYA;ESyKJ;IVjLI;;;;AU2LJ;EACE;EACA,aRrHK;EQsHL,gBRtHK;EQuHL,cRrHK;EQsHL,aRxHK;EQyHL,ORxKY;EQyKZ;EACA,aR/GO;EQgHP,mBRtKY;;AFzBZ;EACE;;ACEA;ESmLJ;IVjLI;;;ACFA;ESmLJ;IAaI;IACA;IACA,cRlIG;IQmIH;IACA;;;;AAIJ;EACE,YR1IK;;;AQ6IP;EACE;;;AAGF;EACE;;AV1MA;EACE;;ACRA;ESgNJ;IVpMI;;;;AUyMJ;EACE;EACA,ORrJK;EQsJL,QRtJK;EQuJL;EACA,ORnJK;EQoJL,QRpJK;EQqJL,kBR7MM;EQ8MN;EACA;EACA,YACE;EAEF;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YACE;;;AAMF;EACE;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE,QRxLI;EQyLJ;;ATjQA;ES+PF;IAKI,ORzKiB;IQ0KjB,YACE;;;AAKN;EACE,kBR7PI;;ADfJ;ES2QF;IAII;;;AT/QF;ESmRF;IAEI;;;AAIJ;EACE;;AAGF;EACE;EACA;EACA;EACA,YACE;;ATlSF;ESwSA;IACE;IACA;IACA;;;AAIJ;EACE,aRxOI;;ADxEJ;ES+SF;IAII;;;;AC9TN;EACE;EACA;EACA;EACA,eT0EK;ESzEL;EACA,eTkFc;ESjFd,YACE;;;AAIJ;EACE;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA,kBTIM;ESHN;EACA;;AXNA;AAAA;EACE;;ACRA;EUOJ;AAAA;IXKI;;;AWKF;AAAA;EACE;;;AAOE;AAAA;EAEE;;AAGF;EACE,gBTkCD;;;AS3BL;EACE;;;AC9CF;EACE;EACA;EACA,kBVmBI;EUlBJ;EACA,eV+EY;;;AU1EhB;EACE,cVkBY;;;AUiCd;AAAA;AAAA;EAGE;EACA,eVMK;EULL,kBV7CM;EU8CN,eVgBc;EUfd;EACA;EACA;EACA;;AAIA;AAAA;AAAA;EACE,OVLG;EUMH;EACA;EACA;EACA;EACA,SVVG;EUWH;EACA;EACA,OV7DU;EU8DV;;AAEA;AAAA;AAAA;EACE,MVjEQ;;AUoEV;AAAA;AAAA;EACE;EACA;EACA;;AAGF;AAAA;AAAA;EACE;EACA;;AAMF;AAAA;AAAA;EACE;EACA;;;AASJ;EACE;EACA,SV/CG;EUgDH;EACA;EACA,eVtCY;;AUyCd;AAAA;EAEE;EACA;EACA;;;AAUJ;EACE;EACA,eVrEK;;AU6CL;EACE;EACA,SV/CG;EUgDH;EACA;EACA,eVtCY;;AUyCd;AAAA;EAEE;EACA;EACA;;;AAwBF;AAAA;EAEE;EACA,SVpFG;EUqFH;EACA;EACA,eV3EY;;;AUmFhB;EACE;EACA;EACA;EACA;;AAEA;AAAA;EAEE;EACA;EACA,kBV3JI;EU4JJ;;AZ9KF;AAAA;EACE;;ACEA;EWsKF;AAAA;IZpKE;;;AY8KF;EACE;EACA,eVjHG;EUkHH,cVlHG;;AUqHL;EACE;EACA;;;AAKJ;AAAA;EAEE,SV9HK;EU+HL,eV/HK;EUgIL;EACA;EACA,eVtHc;;AUwHd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAIE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAKJ;EACE;EACA;EACA;;;AAIF;AAAA;EAEE,YV9MM;EUmNJ,OVjNU;;;AUsNd;EACE,YVzNM;;;AWzBR;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;ACvOF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AbrBE;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;AAQR;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AdhHA;EACE;;ACYA;EcZJ;IfII;;;;AAKF;EACE;;ACEA;EcRJ;IfUI;;;;AAKF;EACE;;ACRA;EcJJ;IfgBI;;;;AAKF;EACE;;AClBA;EcAJ;IfsBI;;;;AAKF;EACE;;AC5BA;EcIJ;If4BI;;;;AAKF;EACE;;ACtCA;EcQJ;IfkCI;IACA,aEhDuB;;;;AFqDzB;EACE;EACA,aEvDuB;;ADKvB;EcYJ;If0CI;;;;AAKF;EACE;EACA,aElEuB;;ADKvB;EcgBJ;IfiDI;;;;AAKF;EACE;EACA,aE7EuB;;ADKvB;EcoBJ;IfwDI;;;;AAKF;EACE;EACA,aExFuB;;ADKvB;EcwBJ;If+DI;;;;Ae3DJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE,abxDiB;;;Aa2DnB;EACE,ab1DyB;;;Aa6D3B;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AC/EF;EACE;EACA;EACA;;AAGE;EACE;;;ACLN;EACE;EACA;;;AAQA;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AhBlCA;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAaN;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AhB7GA;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AC3JR;EACE;AAAA;AAAA;AAAA;AAAA;AAAA;IAME;;EAGF;IACE;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;IACA;;;ACvCJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE,OjBwBW;EiBvBX,kBjBaM;EiBZN;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ACtBF;EACE,kBlBsBM;;;AkBnBR;EACI;EACA;EACA,elB8EY;EkB7EZ;EACA;;AAEA;EACI,OlBgCI;EkB/BJ;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OlBsBM;EkBrBN;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,elBmDY;EkBlDZ;EACA;;AACA;EACE;EACA;EACA,OlBIM;EkBHN;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAMJ;EACI;EACA;EACA,elBKY;EkBJZ;EACA;;AAEA;EACI,OlB7CG;EkB8CH;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OlBvDK;EkBwDL;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,elBtBY;EkBuBZ;EACA;;AACA;EACE;EACA;EACA,OlBzEK;EkB0EL;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAMJ;EACI;EACA;EACA,elBpEY;EkBqEZ;EACA;;AAEA;EACI,OlB9GK;EkB+GL;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OlBxHO;EkByHP;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,elB/FY;EkBgGZ;EACA;;AACA;EACE;EACA;EACA,OlB1IO;EkB2IP;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE","sourcesContent":["/*\ngenerated by accessible-pygments \nCopyright (c) 2022, Quansight Labs\nLicensed under the BSD license, see LICENSE for details.\n--\ngenerated by Pygments \nCopyright 2006-2025 by the Pygments team.\nLicensed under the BSD license, see LICENSE for details.\n*/\n\n.highlight .hll { background-color: #0969da4a }\n.highlight .c { color: #6E7781 } /* Comment */\n.highlight .err { color: #CF222E } /* Error */\n.highlight .k { color: #CF222E } /* Keyword */\n.highlight .l { color: #953800 } /* Literal */\n.highlight .n { color: #8250DF } /* Name */\n.highlight .o { color: #116329 } /* Operator */\n.highlight .p { color: #24292F } /* Punctuation */\n.highlight .ch { color: #6E7781 } /* Comment.Hashbang */\n.highlight .cm { color: #6E7781 } /* Comment.Multiline */\n.highlight .cp { color: #6E7781 } /* Comment.Preproc */\n.highlight .cpf { color: #6E7781 } /* Comment.PreprocFile */\n.highlight .c1 { color: #6E7781 } /* Comment.Single */\n.highlight .cs { color: #6E7781 } /* Comment.Special */\n.highlight .gd { color: #0550AE } /* Generic.Deleted */\n.highlight .ge { font-style: italic } /* Generic.Emph */\n.highlight .gr { color: #CF222E } /* Generic.Error */\n.highlight .gh { color: #0550AE } /* Generic.Heading */\n.highlight .gs { font-weight: bold } /* Generic.Strong */\n.highlight .gu { color: #0550AE } /* Generic.Subheading */\n.highlight .kc { color: #0550AE } /* Keyword.Constant */\n.highlight .kd { color: #CF222E } /* Keyword.Declaration */\n.highlight .kn { color: #CF222E } /* Keyword.Namespace */\n.highlight .kp { color: #CF222E } /* Keyword.Pseudo */\n.highlight .kr { color: #CF222E } /* Keyword.Reserved */\n.highlight .kt { color: #CF222E } /* Keyword.Type */\n.highlight .ld { color: #953800 } /* Literal.Date */\n.highlight .m { color: #953800 } /* Literal.Number */\n.highlight .s { color: #0550AE } /* Literal.String */\n.highlight .na { color: #953800 } /* Name.Attribute */\n.highlight .nb { color: #953800 } /* Name.Builtin */\n.highlight .nc { color: #0550AE } /* Name.Class */\n.highlight .no { color: #0550AE } /* Name.Constant */\n.highlight .nd { color: #953800 } /* Name.Decorator */\n.highlight .ni { color: #116329 } /* Name.Entity */\n.highlight .ne { color: #8250DF } /* Name.Exception */\n.highlight .nf { color: #0550AE } /* Name.Function */\n.highlight .nl { color: #953800 } /* Name.Label */\n.highlight .nn { color: #24292F } /* Name.Namespace */\n.highlight .nx { color: #8250DF } /* Name.Other */\n.highlight .py { color: #0550AE } /* Name.Property */\n.highlight .nt { color: #116329 } /* Name.Tag */\n.highlight .nv { color: #953800 } /* Name.Variable */\n.highlight .ow { color: #8250DF } /* Operator.Word */\n.highlight .pm { color: #24292F } /* Punctuation.Marker */\n.highlight .w { color: #24292F } /* Text.Whitespace */\n.highlight .mb { color: #953800 } /* Literal.Number.Bin */\n.highlight .mf { color: #953800 } /* Literal.Number.Float */\n.highlight .mh { color: #953800 } /* Literal.Number.Hex */\n.highlight .mi { color: #953800 } /* Literal.Number.Integer */\n.highlight .mo { color: #953800 } /* Literal.Number.Oct */\n.highlight .sa { color: #0550AE } /* Literal.String.Affix */\n.highlight .sb { color: #0550AE } /* Literal.String.Backtick */\n.highlight .sc { color: #0550AE } /* Literal.String.Char */\n.highlight .dl { color: #0550AE } /* Literal.String.Delimiter */\n.highlight .sd { color: #0550AE } /* Literal.String.Doc */\n.highlight .s2 { color: #0550AE } /* Literal.String.Double */\n.highlight .se { color: #0550AE } /* Literal.String.Escape */\n.highlight .sh { color: #0550AE } /* Literal.String.Heredoc */\n.highlight .si { color: #0550AE } /* Literal.String.Interpol */\n.highlight .sx { color: #0550AE } /* Literal.String.Other */\n.highlight .sr { color: #0550AE } /* Literal.String.Regex */\n.highlight .s1 { color: #0550AE } /* Literal.String.Single */\n.highlight .ss { color: #0550AE } /* Literal.String.Symbol */\n.highlight .bp { color: #953800 } /* Name.Builtin.Pseudo */\n.highlight .fm { color: #0550AE } /* Name.Function.Magic */\n.highlight .vc { color: #953800 } /* Name.Variable.Class */\n.highlight .vg { color: #953800 } /* Name.Variable.Global */\n.highlight .vi { color: #953800 } /* Name.Variable.Instance */\n.highlight .vm { color: #953800 } /* Name.Variable.Magic */\n.highlight .il { color: #953800 } /* Literal.Number.Integer.Long */\n","/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */\n\n/* Document\n ========================================================================== */\n\n/**\n * 1. Correct the line height in all browsers.\n * 2. Prevent adjustments of font size after orientation changes in iOS.\n */\n\nhtml {\n line-height: 1.15; /* 1 */\n text-size-adjust: 100%; /* 2 */\n}\n\n/* Sections\n ========================================================================== */\n\n/**\n * Remove the margin in all browsers.\n */\n\nbody {\n margin: 0;\n}\n\n/**\n * Render the `main` element consistently in IE.\n */\n\nmain {\n display: block;\n}\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n/* Grouping content\n ========================================================================== */\n\n/**\n * 1. Add the correct box sizing in Firefox.\n * 2. Show the overflow in Edge and IE.\n */\n\nhr {\n box-sizing: content-box; /* 1 */\n height: 0; /* 1 */\n overflow: visible; /* 2 */\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\npre {\n font-family: monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/* Text-level semantics\n ========================================================================== */\n\n/**\n * Remove the gray background on active links in IE 10.\n */\n\na {\n background-color: transparent;\n}\n\n/**\n * 1. Remove the bottom border in Chrome 57-\n * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n */\n\nabbr[title] {\n border-bottom: none; /* 1 */\n text-decoration: underline; /* 2 */\n text-decoration: underline dotted; /* 2 */\n}\n\n/**\n * Add the correct font weight in Chrome, Edge, and Safari.\n */\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\ncode,\nkbd,\nsamp {\n font-family: monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/**\n * Add the correct font size in all browsers.\n */\n\nsmall {\n font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` elements from affecting the line height in\n * all browsers.\n */\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/* Embedded content\n ========================================================================== */\n\n/**\n * Remove the border on images inside links in IE 10.\n */\n\nimg {\n border-style: none;\n}\n\n/* Forms\n ========================================================================== */\n\n/**\n * 1. Change the font styles in all browsers.\n * 2. Remove the margin in Firefox and Safari.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-size: 100%; /* 1 */\n line-height: 1.15; /* 1 */\n margin: 0; /* 2 */\n}\n\n/**\n * Show the overflow in IE.\n * 1. Show the overflow in Edge.\n */\n\nbutton,\ninput {\n /* 1 */\n overflow: visible;\n}\n\n/**\n * Remove the inheritance of text transform in Edge, Firefox, and IE.\n * 1. Remove the inheritance of text transform in Firefox.\n */\n\nbutton,\nselect {\n /* 1 */\n text-transform: none;\n}\n\n/**\n * Correct the inability to style clickable types in iOS and Safari.\n */\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n appearance: button;\n}\n\n/**\n * Remove the inner border and padding in Firefox.\n */\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n border-style: none;\n padding: 0;\n}\n\n/**\n * Restore the focus styles unset by the previous rule.\n */\n\nbutton:-moz-focusring,\n[type=\"button\"]:-moz-focusring,\n[type=\"reset\"]:-moz-focusring,\n[type=\"submit\"]:-moz-focusring {\n outline: 1px dotted ButtonText;\n}\n\n/**\n * Correct the padding in Firefox.\n */\n\nfieldset {\n padding: 0.35em 0.75em 0.625em;\n}\n\n/**\n * 1. Correct the text wrapping in Edge and IE.\n * 2. Correct the color inheritance from `fieldset` elements in IE.\n * 3. Remove the padding so developers are not caught out when they zero out\n * `fieldset` elements in all browsers.\n */\n\nlegend {\n box-sizing: border-box; /* 1 */\n color: inherit; /* 2 */\n display: table; /* 1 */\n max-width: 100%; /* 1 */\n padding: 0; /* 3 */\n white-space: normal; /* 1 */\n}\n\n/**\n * Add the correct vertical alignment in Chrome, Firefox, and Opera.\n */\n\nprogress {\n vertical-align: baseline;\n}\n\n/**\n * Remove the default vertical scrollbar in IE 10+.\n */\n\ntextarea {\n overflow: auto;\n}\n\n/**\n * 1. Add the correct box sizing in IE 10.\n * 2. Remove the padding in IE 10.\n */\n\n[type=\"checkbox\"],\n[type=\"radio\"] {\n box-sizing: border-box; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Correct the cursor style of increment and decrement buttons in Chrome.\n */\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n/**\n * 1. Correct the odd appearance in Chrome and Safari.\n * 2. Correct the outline style in Safari.\n */\n\n[type=\"search\"] {\n appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/**\n * Remove the inner padding in Chrome and Safari on macOS.\n */\n\n[type=\"search\"]::-webkit-search-decoration {\n appearance: none;\n}\n\n/**\n * 1. Correct the inability to style clickable types in iOS and Safari.\n * 2. Change font properties to `inherit` in Safari.\n */\n\n::-webkit-file-upload-button {\n appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/* Interactive\n ========================================================================== */\n\n/*\n * Add the correct display in Edge, IE 10+, and Firefox.\n */\n\ndetails {\n display: block;\n}\n\n/*\n * Add the correct display in all browsers.\n */\n\nsummary {\n display: list-item;\n}\n\n/* Misc\n ========================================================================== */\n\n/**\n * Add the correct display in IE 10+.\n */\n\ntemplate {\n display: none;\n}\n\n/**\n * Add the correct display in IE 10.\n */\n\n[hidden] {\n display: none;\n}\n","// Base element style overrides\n// stylelint-disable selector-no-type, selector-max-type, selector-max-specificity, selector-max-id\n\n:root {\n color-scheme: $color-scheme;\n}\n\n* {\n box-sizing: border-box;\n}\n\nhtml {\n scroll-behavior: smooth;\n\n @include fs-4;\n}\n\nbody {\n font-family: $body-font-family;\n font-size: inherit;\n line-height: $body-line-height;\n color: $body-text-color;\n background-color: $body-background-color;\n overflow-wrap: break-word;\n}\n\nol,\nul,\ndl,\npre,\naddress,\nblockquote,\ntable,\ndiv,\nhr,\nform,\nfieldset,\nnoscript .table-wrapper {\n margin-top: 0;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n#toctitle {\n margin-top: 0;\n margin-bottom: 1em;\n font-weight: 500;\n line-height: $body-heading-line-height;\n color: $body-heading-color;\n}\n\np {\n margin-top: 1em;\n margin-bottom: 1em;\n}\n\na {\n color: $link-color;\n text-decoration: none;\n}\n\na:not([class]) {\n text-decoration: underline;\n text-decoration-color: $border-color;\n text-underline-offset: 2px;\n\n &:hover {\n text-decoration-color: rgba($link-color, 0.45);\n }\n}\n\ncode {\n font-family: $mono-font-family;\n font-size: 0.75em;\n line-height: $body-line-height;\n}\n\nfigure,\npre {\n margin: 0;\n}\n\nli {\n margin: 0.25em 0;\n}\n\nimg {\n max-width: 100%;\n height: auto;\n}\n\nhr {\n height: 1px;\n padding: 0;\n margin: $sp-6 0;\n background-color: $border-color;\n border: 0;\n}\n\n// adds a GitHub-style sidebar to blockquotes\nblockquote {\n margin: 10px 0;\n\n // resets user-agent stylesheets for blockquotes\n margin-block-start: 0;\n margin-inline-start: 0;\n padding-left: 1rem;\n border-left: 3px solid $border-color;\n}\n","$color-scheme: light !default;\n$body-background-color: $white !default;\n$body-heading-color: $grey-dk-300 !default;\n$body-text-color: $grey-dk-100 !default;\n$link-color: $purple-000 !default;\n$nav-child-link-color: $grey-dk-100 !default;\n$sidebar-color: $grey-lt-000 !default;\n$base-button-color: #f7f7f7 !default;\n$btn-primary-color: $purple-100 !default;\n$code-background-color: $white !default;\n$feedback-color: darken($sidebar-color, 3%) !default;\n$table-background-color: $white !default;\n$search-background-color: $white !default;\n$search-result-preview-color: $grey-dk-100 !default;\n\n@import \"./vendor/accessible-pygments/github-light\";\n","@mixin fs-1 {\n & {\n font-size: $font-size-1 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-1-sm !important;\n }\n}\n\n@mixin fs-2 {\n & {\n font-size: $font-size-2 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-3 !important;\n }\n}\n\n@mixin fs-3 {\n & {\n font-size: $font-size-3 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-4 !important;\n }\n}\n\n@mixin fs-4 {\n & {\n font-size: $font-size-4 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-5 !important;\n }\n}\n\n@mixin fs-5 {\n & {\n font-size: $font-size-5 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-6 !important;\n }\n}\n\n@mixin fs-6 {\n & {\n font-size: $font-size-6 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-7 !important;\n line-height: $body-heading-line-height;\n }\n}\n\n@mixin fs-7 {\n & {\n font-size: $font-size-7 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-8 !important;\n }\n}\n\n@mixin fs-8 {\n & {\n font-size: $font-size-8 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-9 !important;\n }\n}\n\n@mixin fs-9 {\n & {\n font-size: $font-size-9 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-10 !important;\n }\n}\n\n@mixin fs-10 {\n & {\n font-size: $font-size-10 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-10-sm !important;\n }\n}\n","// Media query\n\n// Media query mixin\n// Usage:\n// @include mq(md) {\n// ..medium and up styles\n// }\n@mixin mq($name) {\n // Retrieves the value from the key\n $value: map-get($media-queries, $name);\n\n // If the key exists in the map\n @if $value {\n // Prints a media query based on the value\n @media (min-width: $value) {\n @content;\n }\n } @else {\n @warn \"No value could be retrieved from `#{$media-query}`. Please make sure it is defined in `$media-queries` map.\";\n }\n}\n\n// Responsive container\n\n@mixin container {\n padding-right: $gutter-spacing-sm;\n padding-left: $gutter-spacing-sm;\n\n @include mq(md) {\n padding-right: $gutter-spacing;\n padding-left: $gutter-spacing;\n }\n}\n","// Typography\n\n// prettier-ignore\n$body-font-family: system-ui, -apple-system, blinkmacsystemfont, \"Segoe UI\",\n roboto, \"Helvetica Neue\", arial, sans-serif, \"Segoe UI Emoji\" !default;\n$mono-font-family: \"SFMono-Regular\", menlo, consolas, monospace !default;\n$root-font-size: 16px !default; // DEPRECATED: previously base font-size for rems\n$body-line-height: 1.4 !default;\n$content-line-height: 1.6 !default;\n$body-heading-line-height: 1.25 !default;\n\n// Font size\n// `-sm` suffix is the size at the small (and above) media query\n\n$font-size-1: 0.5625rem !default;\n$font-size-1-sm: 0.625rem !default;\n$font-size-2: 0.6875rem !default; // h4 - uppercased!, h6 not uppercased, text-small\n$font-size-3: 0.75rem !default; // h5\n$font-size-4: 0.875rem !default;\n$font-size-5: 1rem !default; // h3\n$font-size-6: 1.125rem !default; // h2\n$font-size-7: 1.5rem !default;\n$font-size-8: 2rem !default; // h1\n$font-size-9: 2.25rem !default;\n$font-size-10: 2.625rem !default;\n$font-size-10-sm: 3rem !default;\n\n// Colors\n\n$white: #fff !default;\n$grey-dk-000: #959396 !default;\n$grey-dk-100: #5c5962 !default;\n$grey-dk-200: #44434d !default;\n$grey-dk-250: #302d36 !default;\n$grey-dk-300: #27262b !default;\n$grey-lt-000: #f5f6fa !default;\n$grey-lt-100: #eeebee !default;\n$grey-lt-200: #ecebed !default;\n$grey-lt-300: #e6e1e8 !default;\n$purple-000: #7253ed !default;\n$purple-100: #5e41d0 !default;\n$purple-200: #4e26af !default;\n$purple-300: #381885 !default;\n$blue-000: #2c84fa !default;\n$blue-100: #2869e6 !default;\n$blue-200: #264caf !default;\n$blue-300: #183385 !default;\n$green-000: #41d693 !default;\n$green-100: #11b584 !default;\n$green-200: #009c7b !default;\n$green-300: #026e57 !default;\n$yellow-000: #ffeb82 !default;\n$yellow-100: #fadf50 !default;\n$yellow-200: #f7d12e !default;\n$yellow-300: #e7af06 !default;\n$red-000: #f77e7e !default;\n$red-100: #f96e65 !default;\n$red-200: #e94c4c !default;\n$red-300: #dd2e2e !default;\n\n// Spacing\n\n$spacing-unit: 1rem; // 1rem == 16px\n\n$spacers: (\n sp-0: 0,\n sp-1: $spacing-unit * 0.25,\n sp-2: $spacing-unit * 0.5,\n sp-3: $spacing-unit * 0.75,\n sp-4: $spacing-unit,\n sp-5: $spacing-unit * 1.5,\n sp-6: $spacing-unit * 2,\n sp-7: $spacing-unit * 2.5,\n sp-8: $spacing-unit * 3,\n sp-9: $spacing-unit * 3.5,\n sp-10: $spacing-unit * 4,\n) !default;\n$sp-1: map-get($spacers, sp-1) !default; // 0.25 rem == 4px\n$sp-2: map-get($spacers, sp-2) !default; // 0.5 rem == 8px\n$sp-3: map-get($spacers, sp-3) !default; // 0.75 rem == 12px\n$sp-4: map-get($spacers, sp-4) !default; // 1 rem == 16px\n$sp-5: map-get($spacers, sp-5) !default; // 1.5 rem == 24px\n$sp-6: map-get($spacers, sp-6) !default; // 2 rem == 32px\n$sp-7: map-get($spacers, sp-7) !default; // 2.5 rem == 40px\n$sp-8: map-get($spacers, sp-8) !default; // 3 rem == 48px\n$sp-9: map-get($spacers, sp-9) !default; // 3.5 rem == 56px\n$sp-10: map-get($spacers, sp-10) !default; // 4 rem == 64px\n\n// Borders\n\n$border: 1px solid !default;\n$border-radius: 4px !default;\n$border-color: $grey-lt-100 !default;\n\n// Grid system\n\n$gutter-spacing: $sp-6 !default;\n$gutter-spacing-sm: $sp-4 !default;\n$nav-width: 16.5rem !default;\n$nav-width-md: 15.5rem !default;\n$nav-list-item-height: $sp-6 !default;\n$nav-list-item-height-sm: $sp-8 !default;\n$nav-list-expander-right: true;\n$content-width: 50rem !default;\n$header-height: 3.75rem !default;\n$search-results-width: $content-width - $nav-width !default;\n$transition-duration: 400ms;\n\n// Media queries in pixels\n\n$media-queries: (\n xs: 20rem,\n sm: 31.25rem,\n md: $content-width,\n lg: $content-width + $nav-width,\n xl: 87.5rem,\n) !default;\n","// The basic two column layout\n\n.side-bar {\n z-index: 0;\n display: flex;\n flex-wrap: wrap;\n background-color: $sidebar-color;\n\n @include mq(md) {\n flex-flow: column nowrap;\n position: fixed;\n width: $nav-width-md;\n height: 100%;\n border-right: $border $border-color;\n align-items: flex-end;\n }\n\n @include mq(lg) {\n width: calc((100% - #{$nav-width + $content-width}) / 2 + #{$nav-width});\n min-width: $nav-width;\n }\n\n & + .main {\n @include mq(md) {\n margin-left: $nav-width-md;\n }\n\n @include mq(lg) {\n // stylelint-disable function-name-case\n // disable for Max(), we want to use the CSS max() function\n margin-left: Max(\n #{$nav-width},\n calc((100% - #{$nav-width + $content-width}) / 2 + #{$nav-width})\n );\n // stylelint-enable function-name-case\n }\n\n .main-header {\n display: none;\n background-color: $sidebar-color;\n\n @include mq(md) {\n display: flex;\n background-color: $body-background-color;\n }\n\n &.nav-open {\n display: block;\n\n @include mq(md) {\n display: flex;\n }\n }\n }\n }\n}\n\n.main {\n margin: auto;\n\n @include mq(md) {\n position: relative;\n max-width: $content-width;\n }\n}\n\n.main-content-wrap {\n padding-top: $gutter-spacing-sm;\n padding-bottom: $gutter-spacing-sm;\n\n @include container;\n\n @include mq(md) {\n padding-top: $gutter-spacing;\n padding-bottom: $gutter-spacing;\n }\n}\n\n.main-header {\n z-index: 0;\n border-bottom: $border $border-color;\n\n @include mq(md) {\n display: flex;\n justify-content: space-between;\n height: $header-height;\n }\n}\n\n.site-nav,\n.site-header,\n.site-footer {\n width: 100%;\n\n @include mq(lg) {\n width: $nav-width;\n }\n}\n\n.site-nav {\n display: none;\n\n &.nav-open {\n display: block;\n }\n\n @include mq(md) {\n display: block;\n padding-top: $sp-8;\n padding-bottom: $gutter-spacing-sm;\n overflow-y: auto;\n flex: 1 1 auto;\n }\n}\n\n.site-header {\n display: flex;\n min-height: $header-height;\n align-items: center;\n\n @include mq(md) {\n height: $header-height;\n max-height: $header-height;\n border-bottom: $border $border-color;\n }\n}\n\n.site-title {\n flex-grow: 1;\n display: flex;\n height: 100%;\n align-items: center;\n padding-top: $sp-3;\n padding-bottom: $sp-3;\n color: $body-heading-color;\n\n @include container;\n\n @include fs-6;\n\n @include mq(md) {\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n }\n}\n\n@if variable-exists(logo) {\n .site-logo {\n width: 100%;\n height: 100%;\n background-image: url($logo);\n background-repeat: no-repeat;\n background-position: left center;\n background-size: contain;\n }\n}\n\n.site-button {\n display: flex;\n height: 100%;\n padding: $gutter-spacing-sm;\n align-items: center;\n}\n\n@include mq(md) {\n .site-header .site-button {\n display: none;\n }\n}\n\n.site-title:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 80%,\n rgba($feedback-color, 0) 100%\n );\n}\n\n.site-button:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 100%\n );\n}\n\n.site-footer {\n position: absolute;\n bottom: 0;\n left: 0;\n padding-top: $sp-4;\n padding-bottom: $sp-4;\n\n @include container;\n\n @include fs-2;\n\n @include mq(md) {\n position: static;\n justify-self: end;\n }\n}\n\n.icon {\n width: $sp-5;\n height: $sp-5;\n color: $link-color;\n}\n","@charset \"UTF-8\";\n\n// Styles for rendered markdown in the .main-content container\n// stylelint-disable selector-no-type, max-nesting-depth, selector-max-compound-selectors, selector-max-type, selector-max-specificity, selector-max-id\n\n.main-content {\n line-height: $content-line-height;\n\n ol,\n ul,\n dl,\n pre,\n address,\n blockquote,\n .table-wrapper {\n margin-top: 0.5em;\n }\n\n a {\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n ul,\n ol {\n padding-left: 1.5em;\n }\n\n li {\n .highlight {\n margin-top: $sp-1;\n }\n }\n\n ol {\n list-style-type: none;\n counter-reset: step-counter;\n\n > li {\n position: relative;\n\n &::before {\n position: absolute;\n top: 0.2em;\n left: -1.6em;\n color: $grey-dk-000;\n content: counter(step-counter);\n counter-increment: step-counter;\n @include fs-3;\n\n @include mq(sm) {\n top: 0.11em;\n }\n }\n\n ol {\n counter-reset: sub-counter;\n\n > li {\n &::before {\n content: counter(sub-counter, lower-alpha);\n counter-increment: sub-counter;\n }\n }\n }\n }\n }\n\n ul {\n list-style: none;\n\n > li {\n &::before {\n position: absolute;\n margin-left: -1.4em;\n color: $grey-dk-000;\n content: \"•\";\n }\n }\n }\n\n .task-list-item {\n &::before {\n content: \"\";\n }\n }\n\n .task-list-item-checkbox {\n margin-right: 0.6em;\n margin-left: -1.4em;\n\n // The same margin-left is used above for ul > li::before\n }\n\n hr + * {\n margin-top: 0;\n }\n\n h1:first-of-type {\n margin-top: 0.5em;\n }\n\n dl {\n display: grid;\n grid-template: auto / 10em 1fr;\n }\n\n dt,\n dd {\n margin: 0.25em 0;\n }\n\n dt {\n grid-column: 1;\n font-weight: 500;\n text-align: right;\n\n &::after {\n content: \":\";\n }\n }\n\n dd {\n grid-column: 2;\n margin-bottom: 0;\n margin-left: 1em;\n\n blockquote,\n div,\n dl,\n dt,\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n li,\n ol,\n p,\n pre,\n table,\n ul,\n .table-wrapper {\n &:first-child {\n margin-top: 0;\n }\n }\n }\n\n dd,\n ol,\n ul {\n dl:first-child {\n dt:first-child,\n dd:nth-child(2) {\n margin-top: 0;\n }\n }\n }\n\n .anchor-heading {\n position: absolute;\n right: -$sp-4;\n width: $sp-5;\n height: 100%;\n padding-right: $sp-1;\n padding-left: $sp-1;\n overflow: visible;\n\n @include mq(md) {\n right: auto;\n left: -$sp-5;\n }\n\n svg {\n display: inline-block;\n width: 100%;\n height: 100%;\n color: $link-color;\n visibility: hidden;\n }\n }\n\n .anchor-heading:hover,\n .anchor-heading:focus,\n h1:hover > .anchor-heading,\n h2:hover > .anchor-heading,\n h3:hover > .anchor-heading,\n h4:hover > .anchor-heading,\n h5:hover > .anchor-heading,\n h6:hover > .anchor-heading {\n svg {\n visibility: visible;\n }\n }\n\n summary {\n cursor: pointer;\n }\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n #toctitle {\n position: relative;\n margin-top: 1.5em;\n margin-bottom: 0.25em;\n\n + table,\n + .table-wrapper,\n + .code-example,\n + .highlighter-rouge,\n + .sectionbody .listingblock {\n margin-top: 1em;\n }\n\n + p:not(.label) {\n margin-top: 0;\n }\n }\n\n > h1:first-child,\n > h2:first-child,\n > h3:first-child,\n > h4:first-child,\n > h5:first-child,\n > h6:first-child,\n > .sect1:first-child > h2,\n > .sect2:first-child > h3,\n > .sect3:first-child > h4,\n > .sect4:first-child > h5,\n > .sect5:first-child > h6 {\n margin-top: $sp-2;\n }\n}\n","// Main nav, breadcrumb, etc...\n// stylelint-disable selector-no-type, max-nesting-depth, selector-max-compound-selectors, selector-max-type, selector-max-specificity\n\n.nav-list {\n padding: 0;\n margin-top: 0;\n margin-bottom: 0;\n list-style: none;\n\n .nav-list-item {\n position: relative;\n margin: 0;\n\n @include fs-4;\n\n @include mq(md) {\n @include fs-3;\n }\n\n .nav-list-link {\n display: block;\n min-height: $nav-list-item-height-sm;\n padding-top: $sp-1;\n padding-bottom: $sp-1;\n line-height: #{$nav-list-item-height-sm - 2 * $sp-1};\n @if $nav-list-expander-right {\n padding-right: $nav-list-item-height-sm;\n padding-left: $gutter-spacing-sm;\n } @else {\n padding-right: $gutter-spacing-sm;\n padding-left: $nav-list-item-height-sm;\n }\n\n @include mq(md) {\n min-height: $nav-list-item-height;\n line-height: #{$nav-list-item-height - 2 * $sp-1};\n @if $nav-list-expander-right {\n padding-right: $nav-list-item-height;\n padding-left: $gutter-spacing;\n } @else {\n padding-right: $gutter-spacing;\n padding-left: $nav-list-item-height;\n }\n }\n\n &.external > svg {\n width: $sp-4;\n height: $sp-4;\n vertical-align: text-bottom;\n }\n\n &.active {\n font-weight: 600;\n text-decoration: none;\n }\n\n &:hover,\n &.active {\n color: darken($link-color, 5%);\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 80%,\n rgba($feedback-color, 0) 100%\n );\n }\n }\n\n .nav-list-expander {\n position: absolute;\n @if $nav-list-expander-right {\n right: 0;\n }\n\n width: $nav-list-item-height-sm;\n height: $nav-list-item-height-sm;\n padding: #{$nav-list-item-height-sm * 0.25};\n color: $link-color;\n\n @include mq(md) {\n width: $nav-list-item-height;\n height: $nav-list-item-height;\n padding: #{$nav-list-item-height * 0.25};\n }\n\n &:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 100%\n );\n }\n\n @if $nav-list-expander-right {\n svg {\n transform: rotate(90deg);\n }\n }\n }\n\n > .nav-list {\n display: none;\n padding-left: $sp-3;\n list-style: none;\n\n .nav-list-item {\n position: relative;\n\n .nav-list-link {\n color: $nav-child-link-color;\n }\n\n .nav-list-expander {\n color: $nav-child-link-color;\n }\n }\n }\n\n &.active {\n > .nav-list-expander svg {\n @if $nav-list-expander-right {\n transform: rotate(-90deg);\n } @else {\n transform: rotate(90deg);\n }\n }\n\n > .nav-list {\n display: block;\n }\n }\n }\n}\n\n.nav-category {\n padding: $sp-2 $gutter-spacing-sm;\n font-weight: 600;\n text-align: start;\n text-transform: uppercase;\n border-bottom: $border $border-color;\n @include fs-2;\n\n @include mq(md) {\n padding: $sp-2 $gutter-spacing;\n margin-top: $gutter-spacing-sm;\n text-align: start;\n\n &:first-child {\n margin-top: 0;\n }\n }\n}\n\n.nav-list.nav-category-list {\n > .nav-list-item {\n margin: 0;\n\n > .nav-list {\n padding: 0;\n\n > .nav-list-item {\n > .nav-list-link {\n color: $link-color;\n }\n\n > .nav-list-expander {\n color: $link-color;\n }\n }\n }\n }\n}\n\n// Aux nav\n\n.aux-nav {\n height: 100%;\n overflow-x: auto;\n @include fs-2;\n\n .aux-nav-list {\n display: flex;\n height: 100%;\n padding: 0;\n margin: 0;\n list-style: none;\n }\n\n .aux-nav-list-item {\n display: inline-block;\n height: 100%;\n padding: 0;\n margin: 0;\n }\n\n @include mq(md) {\n padding-right: $gutter-spacing-sm;\n }\n}\n\n// Breadcrumb nav\n\n.breadcrumb-nav {\n @include mq(md) {\n margin-top: -$sp-4;\n }\n}\n\n.breadcrumb-nav-list {\n padding-left: 0;\n margin-bottom: $sp-3;\n list-style: none;\n}\n\n.breadcrumb-nav-list-item {\n display: table-cell;\n @include fs-2;\n\n &::before {\n display: none;\n }\n\n &::after {\n display: inline-block;\n margin-right: $sp-2;\n margin-left: $sp-2;\n color: $grey-dk-000;\n content: \"/\";\n }\n\n &:last-child {\n &::after {\n content: \"\";\n }\n }\n}\n","// Typography\n// stylelint-disable selector-no-type, selector-max-type, selector-max-specificity, selector-max-id\n\nh1,\n.text-alpha {\n font-weight: 300;\n\n @include fs-8;\n}\n\nh2,\n.text-beta,\n#toctitle {\n @include fs-6;\n}\n\nh3,\n.text-gamma {\n @include fs-5;\n}\n\nh4,\n.text-delta {\n font-weight: 400;\n text-transform: uppercase;\n letter-spacing: 0.1em;\n\n @include fs-2;\n}\n\nh4 code {\n text-transform: none;\n}\n\nh5,\n.text-epsilon {\n @include fs-3;\n}\n\nh6,\n.text-zeta {\n @include fs-2;\n}\n\n.text-small {\n @include fs-2;\n}\n\n.text-mono {\n font-family: $mono-font-family !important;\n}\n\n.text-left {\n text-align: left !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n.text-right {\n text-align: right !important;\n}\n","// Labels (not the form kind)\n\n// this :not() prevents a style clash with Mermaid.js's\n// diagram labels, which also use .label\n// for more, see https://github.com/just-the-docs/just-the-docs/issues/1272\n// and the accompanying PR\n.label:not(g),\n.label-blue:not(g) {\n display: inline-block;\n padding: 0.16em 0.56em;\n margin-right: $sp-2;\n margin-left: $sp-2;\n color: $white;\n text-transform: uppercase;\n vertical-align: middle;\n background-color: $blue-100;\n border-radius: 12px;\n\n @include fs-2;\n}\n\n.label-green:not(g) {\n background-color: $green-300;\n}\n\n.label-purple:not(g) {\n background-color: $purple-100;\n}\n\n.label-red:not(g) {\n background-color: $red-300;\n}\n\n.label-yellow:not(g) {\n color: $grey-dk-200;\n background-color: $yellow-200;\n}\n","// Buttons and things that look like buttons\n// stylelint-disable color-named\n\n.btn {\n display: inline-block;\n box-sizing: border-box;\n padding: 0.3em 1em;\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n font-weight: 500;\n line-height: 1.5;\n color: $link-color;\n text-decoration: none;\n vertical-align: baseline;\n cursor: pointer;\n background-color: $base-button-color;\n border-width: 0;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n appearance: none;\n\n &:focus {\n text-decoration: none;\n outline: none;\n box-shadow: 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:focus:hover,\n &.selected:focus {\n box-shadow: 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:hover,\n &.zeroclipboard-is-hover {\n color: darken($link-color, 2%);\n }\n\n &:hover,\n &:active,\n &.zeroclipboard-is-hover,\n &.zeroclipboard-is-active {\n text-decoration: none;\n background-color: darken($base-button-color, 1%);\n }\n\n &:active,\n &.selected,\n &.zeroclipboard-is-active {\n background-color: darken($base-button-color, 3%);\n background-image: none;\n box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15);\n }\n\n &.selected:hover {\n background-color: darken(#dcdcdc, 5%);\n }\n\n &:disabled,\n &.disabled {\n &,\n &:hover {\n color: rgba(102, 102, 102, 0.5);\n cursor: default;\n background-color: rgba(229, 229, 229, 0.5);\n background-image: none;\n box-shadow: none;\n }\n }\n}\n\n.btn-outline {\n color: $link-color;\n background: transparent;\n box-shadow: inset 0 0 0 2px $grey-lt-300;\n\n &:hover,\n &:active,\n &.zeroclipboard-is-hover,\n &.zeroclipboard-is-active {\n color: darken($link-color, 4%);\n text-decoration: none;\n background-color: transparent;\n box-shadow: inset 0 0 0 3px $grey-lt-300;\n }\n\n &:focus {\n text-decoration: none;\n outline: none;\n box-shadow:\n inset 0 0 0 2px $grey-dk-100,\n 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:focus:hover,\n &.selected:focus {\n box-shadow: inset 0 0 0 2px $grey-dk-100;\n }\n}\n\n.btn-primary {\n @include btn-color($white, $btn-primary-color);\n}\n\n.btn-purple {\n @include btn-color($white, $purple-100);\n}\n\n.btn-blue {\n @include btn-color($white, $blue-200);\n}\n\n.btn-green {\n @include btn-color($white, $green-300);\n}\n\n.btn-reset {\n background: none;\n border: none;\n margin: 0;\n text-align: inherit;\n font: inherit;\n border-radius: 0;\n appearance: none;\n}\n","// Colored button\n\n@mixin btn-color($fg, $bg) {\n color: $fg;\n background-color: darken($bg, 2%);\n background-image: linear-gradient(lighten($bg, 5%), darken($bg, 2%));\n box-shadow:\n 0 1px 3px rgba(0, 0, 0, 0.25),\n 0 4px 10px rgba(0, 0, 0, 0.12);\n\n &:hover,\n &.zeroclipboard-is-hover {\n color: $fg;\n background-color: darken($bg, 4%);\n background-image: linear-gradient((lighten($bg, 2%), darken($bg, 4%)));\n }\n\n &:active,\n &.selected,\n &.zeroclipboard-is-active {\n background-color: darken($bg, 5%);\n background-image: none;\n box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15);\n }\n\n &.selected:hover {\n background-color: darken($bg, 10%);\n }\n}\n","// Search input and autocomplete\n\n.search {\n position: relative;\n z-index: 2;\n flex-grow: 1;\n height: $sp-10;\n padding: $sp-2;\n transition: padding linear #{$transition-duration * 0.5};\n\n @include mq(md) {\n position: relative !important;\n width: auto !important;\n height: 100% !important;\n padding: 0;\n transition: none;\n }\n}\n\n.search-input-wrap {\n position: relative;\n z-index: 1;\n height: $sp-8;\n overflow: hidden;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n transition: height linear #{$transition-duration * 0.5};\n\n @include mq(md) {\n position: absolute;\n width: 100%;\n max-width: $search-results-width;\n height: 100% !important;\n border-radius: 0;\n box-shadow: none;\n transition: width ease $transition-duration;\n }\n}\n\n.search-input {\n position: absolute;\n width: 100%;\n height: 100%;\n padding: $sp-2 $gutter-spacing-sm $sp-2 #{$gutter-spacing-sm + $sp-5};\n font-size: 1rem;\n color: $body-text-color;\n background-color: $search-background-color;\n border-top: 0;\n border-right: 0;\n border-bottom: 0;\n border-left: 0;\n border-radius: 0;\n\n @include mq(md) {\n padding: $sp-2 $gutter-spacing-sm $sp-2 #{$gutter-spacing + $sp-5};\n font-size: 0.875rem;\n background-color: $body-background-color;\n transition: padding-left linear #{$transition-duration * 0.5};\n }\n\n &:focus {\n outline: 2px solid $link-color;\n outline-offset: -2px;\n\n + .search-label .search-icon {\n color: $link-color;\n }\n }\n}\n\n.search-label {\n position: absolute;\n display: flex;\n height: 100%;\n padding-left: $gutter-spacing-sm;\n\n @include mq(md) {\n padding-left: $gutter-spacing;\n transition: padding-left linear #{$transition-duration * 0.5};\n }\n\n .search-icon {\n width: #{$sp-4 * 1.2};\n height: #{$sp-4 * 1.2};\n align-self: center;\n color: $grey-dk-000;\n }\n}\n\n.search-results {\n position: absolute;\n left: 0;\n display: none;\n width: 100%;\n max-height: calc(100% - #{$sp-10});\n overflow-y: auto;\n background-color: $search-background-color;\n border-bottom-right-radius: $border-radius;\n border-bottom-left-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n\n @include mq(md) {\n top: 100%;\n width: $search-results-width;\n max-height: calc(100vh - 200%) !important;\n }\n}\n\n.search-results-list {\n padding-left: 0;\n margin-bottom: $sp-1;\n list-style: none;\n @include fs-4;\n\n @include mq(md) {\n @include fs-3;\n }\n}\n\n.search-results-list-item {\n padding: 0;\n margin: 0;\n}\n\n.search-result {\n display: block;\n padding: $sp-1 $sp-3;\n\n &:hover,\n &.active {\n background-color: $feedback-color;\n }\n}\n\n.search-result-title {\n display: block;\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n\n @include mq(sm) {\n display: inline-block;\n width: 40%;\n padding-right: $sp-2;\n vertical-align: top;\n }\n}\n\n.search-result-doc {\n display: flex;\n align-items: center;\n word-wrap: break-word;\n\n &.search-result-doc-parent {\n opacity: 0.5;\n @include fs-3;\n\n @include mq(md) {\n @include fs-2;\n }\n }\n\n .search-result-icon {\n width: $sp-4;\n height: $sp-4;\n margin-right: $sp-2;\n color: $link-color;\n flex-shrink: 0;\n }\n\n .search-result-doc-title {\n overflow: auto;\n }\n}\n\n.search-result-section {\n margin-left: #{$sp-4 + $sp-2};\n word-wrap: break-word;\n}\n\n.search-result-rel-url {\n display: block;\n margin-left: #{$sp-4 + $sp-2};\n overflow: hidden;\n color: $search-result-preview-color;\n text-overflow: ellipsis;\n white-space: nowrap;\n @include fs-1;\n}\n\n.search-result-previews {\n display: block;\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n padding-left: $sp-4;\n margin-left: $sp-2;\n color: $search-result-preview-color;\n word-wrap: break-word;\n border-left: $border;\n border-left-color: $border-color;\n @include fs-2;\n\n @include mq(sm) {\n display: inline-block;\n width: 60%;\n padding-left: $sp-2;\n margin-left: 0;\n vertical-align: top;\n }\n}\n\n.search-result-preview + .search-result-preview {\n margin-top: $sp-1;\n}\n\n.search-result-highlight {\n font-weight: bold;\n}\n\n.search-no-result {\n padding: $sp-2 $sp-3;\n @include fs-3;\n}\n\n.search-button {\n position: fixed;\n right: $sp-4;\n bottom: $sp-4;\n display: flex;\n width: $sp-9;\n height: $sp-9;\n background-color: $search-background-color;\n border: 1px solid rgba($link-color, 0.3);\n border-radius: #{$sp-9 * 0.5};\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n align-items: center;\n justify-content: center;\n}\n\n.search-overlay {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1;\n width: 0;\n height: 0;\n background-color: rgba(0, 0, 0, 0.3);\n opacity: 0;\n transition:\n opacity ease $transition-duration,\n width 0s $transition-duration,\n height 0s $transition-duration;\n}\n\n.search-active {\n .search {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n padding: 0;\n }\n\n .search-input-wrap {\n height: $sp-10;\n border-radius: 0;\n\n @include mq(md) {\n width: $search-results-width;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n }\n }\n\n .search-input {\n background-color: $search-background-color;\n\n @include mq(md) {\n padding-left: 2.3rem;\n }\n }\n\n .search-label {\n @include mq(md) {\n padding-left: 0.6rem;\n }\n }\n\n .search-results {\n display: block;\n }\n\n .search-overlay {\n width: 100%;\n height: 100%;\n opacity: 1;\n transition:\n opacity ease $transition-duration,\n width 0s,\n height 0s;\n }\n\n @include mq(md) {\n .main {\n position: fixed;\n right: 0;\n left: 0;\n }\n }\n\n .main-header {\n padding-top: $sp-10;\n\n @include mq(md) {\n padding-top: 0;\n }\n }\n}\n","// Tables\n// stylelint-disable max-nesting-depth, selector-no-type, selector-max-type\n\n.table-wrapper {\n display: block;\n width: 100%;\n max-width: 100%;\n margin-bottom: $sp-5;\n overflow-x: auto;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n}\n\ntable {\n display: table;\n min-width: 100%;\n border-collapse: separate;\n}\n\nth,\ntd {\n min-width: 7.5rem;\n padding: $sp-2 $sp-3;\n background-color: $table-background-color;\n border-bottom: $border rgba($border-color, 0.5);\n border-left: $border $border-color;\n\n @include fs-3;\n\n &:first-of-type {\n border-left: 0;\n }\n}\n\ntbody {\n tr {\n &:last-of-type {\n th,\n td {\n border-bottom: 0;\n }\n\n td {\n padding-bottom: $sp-3;\n }\n }\n }\n}\n\nthead {\n th {\n border-bottom: $border $border-color;\n }\n}\n","// Code and syntax highlighting\n// stylelint-disable selector-no-qualifying-type, declaration-block-semicolon-newline-after,declaration-block-single-line-max-declarations, selector-no-type, selector-max-type, scss/comment-no-empty\n\n// {% raw %}\n\n// This instruction applies to all queues not within 'pre' or 'figure', avoiding 'code' generated by the highlight.\n:not(pre, figure) {\n & > code {\n padding: 0.2em 0.15em;\n font-weight: 400;\n background-color: $code-background-color;\n border: $border $border-color;\n border-radius: $border-radius;\n }\n}\n\n// Avoid appearance of dark border around visited code links in Safari\na:visited code {\n border-color: $border-color;\n}\n\n// Content structure for highlighted code blocks using fences or Liquid\n//\n// ```[LANG]...```, no kramdown line_numbers:\n// div.[language-LANG.]highlighter-rouge > div.highlight > pre.highlight > code\n//\n// ```[LANG]...```, kramdown line_numbers = true:\n// div.[language-LANG.]highlighter-rouge > div.highlight > pre.highlight > code\n// > div.table-wrapper > table.rouge-table > tbody > tr\n// > td.rouge-gutter.gl > pre.lineno\n// | td.rouge-code > pre\n//\n// {% highlight LANG %}...{% endhighlight %}:\n// figure.highlight > pre > code.language-LANG\n//\n// {% highlight LANG linenos %}...{% endhighlight %}:\n// figure.highlight > pre > code.language-LANG\n// > div.table-wrapper > table.rouge-table > tbody > tr\n// > td.gutter.gl > pre.lineno\n// | td.code > pre\n//\n// ----...---- (AsciiDoc)\n// div.listingblock > div.content > pre.rouge.highlight\n//\n// fix_linenos removes the outermost pre when it encloses table.rouge-table\n//\n// See docs/index-test.md for some tests.\n//\n// No kramdown line_numbers: fences and Liquid highlighting look the same.\n// Kramdown line_numbers = true: fences have a wider gutter than with Liquid?\n\n// ```[LANG]...```\n// or in AsciiDoc:\n//\n// ----\n// ...\n// ----\n\n// the code may appear with 3 different types:\n// container \\ case: default case, code with line number, code with html rendering\n// top level: div.highlighter-rouge, figure.highlight, figure.highlight\n// second level: div.highlight, div.table-wrapper, pre.highlight\n// third level: pre.highlight, td.code, absent\n// last level: code, pre, code (optionality)\n// highlighter level: span, span, span\n// the spacing are only in the second level for case 1, 3 and in the third level for case 2\n// in AsciiDoc, there is a parent container that contains optionally a title and the content.\n\n// select top level container\ndiv.highlighter-rouge,\ndiv.listingblock > div.content,\nfigure.highlight {\n margin-top: 0;\n margin-bottom: $sp-3;\n background-color: $code-background-color;\n border-radius: $border-radius;\n box-shadow: none;\n -webkit-overflow-scrolling: touch;\n position: relative;\n padding: 0;\n\n // copy button (or other button)\n // the button appear only when there is a hover on the code or focus on button\n > button {\n width: $sp-3;\n opacity: 0;\n position: absolute;\n top: 0;\n right: 0;\n padding: $sp-3;\n border: none;\n background: none;\n color: $body-text-color;\n box-sizing: content-box;\n\n svg {\n fill: $body-text-color;\n }\n\n &:active {\n text-decoration: none;\n outline: none;\n opacity: 1;\n }\n\n &:focus {\n opacity: 1;\n outline: 2px solid $link-color;\n }\n }\n\n // the button can be seen by doing a simple hover in the code, there is no need to go over the location of the button\n &:hover {\n > button {\n cursor: copy;\n opacity: 1;\n }\n }\n}\n\n// setting the spacing and scrollbar on the second level for the first case\n// remove all space on the second and third level\n// this is a mixin to accommodate for the slightly different structures generated via Markdown vs AsciiDoc\n@mixin scroll-and-spacing($code-div, $pre-select) {\n #{$code-div} {\n overflow-x: auto;\n padding: $sp-3;\n margin: 0;\n border: 1px solid $body-text-color;\n border-radius: $border-radius;\n }\n\n #{$pre-select},\n code {\n padding: 0;\n margin: 0;\n border: 0;\n }\n}\n\n// for Markdown\ndiv.highlighter-rouge {\n @include scroll-and-spacing(\"div.highlight\", \"pre.highlight\");\n}\n\n// for AsciiDoc. we also need to fix the margins for its parent container.\ndiv.listingblock {\n margin-top: 0;\n margin-bottom: $sp-3;\n\n @include scroll-and-spacing(\"div.content\", \"div.content > pre\");\n}\n\n// {% highlight LANG %}...{% endhighlight %},\n// {% highlight LANG linenos %}...{% endhighlight %}:\n\n// setting the spacing and scrollbar on the second level for the thirt case\n// the css rule are apply only to the last code enviroment\n// setting the scroolbar\nfigure.highlight {\n pre,\n :not(pre) > code {\n overflow-x: auto;\n padding: $sp-3;\n margin: 0;\n border: 1px solid $body-text-color;\n border-radius: $border-radius;\n }\n}\n\n// ```[LANG]...```, kramdown line_numbers = true,\n// {% highlight LANG linenos %}...{% endhighlight %}:\n\n// setting the spacing and scrollbar on the thirt level for the second case\n.highlight .table-wrapper {\n padding: $sp-3 0;\n margin: 0;\n border: 0;\n box-shadow: none;\n\n td,\n pre {\n min-width: 0;\n padding: 0;\n background-color: $code-background-color;\n border: 0;\n\n @include fs-2;\n }\n\n td.gl {\n width: 1em;\n padding-right: $sp-3;\n padding-left: $sp-3;\n }\n\n pre {\n margin: 0;\n line-height: 2;\n }\n}\n\n// Code examples: html render of a code\n.code-example,\n.listingblock > .title {\n padding: $sp-3;\n margin-bottom: $sp-3;\n overflow: auto;\n border: 1px solid $border-color;\n border-radius: $border-radius;\n\n + .highlighter-rouge,\n + .sectionbody .listingblock,\n + .content,\n + figure.highlight {\n position: relative;\n margin-top: -$sp-4;\n border-right: 1px solid $border-color;\n border-bottom: 1px solid $border-color;\n border-left: 1px solid $border-color;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n }\n}\n\n// Mermaid diagram code blocks should be left unstyled.\ncode.language-mermaid {\n padding: 0;\n background-color: inherit;\n border: 0;\n}\n\n// Override OneDarkJekyll Colors for Code Blocks\n.highlight,\npre.highlight {\n background: $code-background-color; // Code Background\n // For Backwards Compatibility Before $code-linenumber-color was added\n @if variable-exists(code-linenumber-color) {\n color: $code-linenumber-color; // Code Line Numbers\n } @else {\n color: $body-text-color; // Code Line Numbers\n }\n}\n\n// Override OneDarkJekyll Colors for Code Blocks\n.highlight pre {\n background: $code-background-color; // Code Background\n}\n\n// {% endraw %}\n","// Utility classes for colors\n\n// Text colors\n\n.text-grey-dk-000 {\n color: $grey-dk-000 !important;\n}\n\n.text-grey-dk-100 {\n color: $grey-dk-100 !important;\n}\n\n.text-grey-dk-200 {\n color: $grey-dk-200 !important;\n}\n\n.text-grey-dk-250 {\n color: $grey-dk-250 !important;\n}\n\n.text-grey-dk-300 {\n color: $grey-dk-300 !important;\n}\n\n.text-grey-lt-000 {\n color: $grey-lt-000 !important;\n}\n\n.text-grey-lt-100 {\n color: $grey-lt-100 !important;\n}\n\n.text-grey-lt-200 {\n color: $grey-lt-200 !important;\n}\n\n.text-grey-lt-300 {\n color: $grey-lt-300 !important;\n}\n\n.text-blue-000 {\n color: $blue-000 !important;\n}\n\n.text-blue-100 {\n color: $blue-100 !important;\n}\n\n.text-blue-200 {\n color: $blue-200 !important;\n}\n\n.text-blue-300 {\n color: $blue-300 !important;\n}\n\n.text-green-000 {\n color: $green-000 !important;\n}\n\n.text-green-100 {\n color: $green-100 !important;\n}\n\n.text-green-200 {\n color: $green-200 !important;\n}\n\n.text-green-300 {\n color: $green-300 !important;\n}\n\n.text-purple-000 {\n color: $purple-000 !important;\n}\n\n.text-purple-100 {\n color: $purple-100 !important;\n}\n\n.text-purple-200 {\n color: $purple-200 !important;\n}\n\n.text-purple-300 {\n color: $purple-300 !important;\n}\n\n.text-yellow-000 {\n color: $yellow-000 !important;\n}\n\n.text-yellow-100 {\n color: $yellow-100 !important;\n}\n\n.text-yellow-200 {\n color: $yellow-200 !important;\n}\n\n.text-yellow-300 {\n color: $yellow-300 !important;\n}\n\n.text-red-000 {\n color: $red-000 !important;\n}\n\n.text-red-100 {\n color: $red-100 !important;\n}\n\n.text-red-200 {\n color: $red-200 !important;\n}\n\n.text-red-300 {\n color: $red-300 !important;\n}\n\n// Background colors\n\n.bg-grey-dk-000 {\n background-color: $grey-dk-000 !important;\n}\n\n.bg-grey-dk-100 {\n background-color: $grey-dk-100 !important;\n}\n\n.bg-grey-dk-200 {\n background-color: $grey-dk-200 !important;\n}\n\n.bg-grey-dk-250 {\n background-color: $grey-dk-250 !important;\n}\n\n.bg-grey-dk-300 {\n background-color: $grey-dk-300 !important;\n}\n\n.bg-grey-lt-000 {\n background-color: $grey-lt-000 !important;\n}\n\n.bg-grey-lt-100 {\n background-color: $grey-lt-100 !important;\n}\n\n.bg-grey-lt-200 {\n background-color: $grey-lt-200 !important;\n}\n\n.bg-grey-lt-300 {\n background-color: $grey-lt-300 !important;\n}\n\n.bg-blue-000 {\n background-color: $blue-000 !important;\n}\n\n.bg-blue-100 {\n background-color: $blue-100 !important;\n}\n\n.bg-blue-200 {\n background-color: $blue-200 !important;\n}\n\n.bg-blue-300 {\n background-color: $blue-300 !important;\n}\n\n.bg-green-000 {\n background-color: $green-000 !important;\n}\n\n.bg-green-100 {\n background-color: $green-100 !important;\n}\n\n.bg-green-200 {\n background-color: $green-200 !important;\n}\n\n.bg-green-300 {\n background-color: $green-300 !important;\n}\n\n.bg-purple-000 {\n background-color: $purple-000 !important;\n}\n\n.bg-purple-100 {\n background-color: $purple-100 !important;\n}\n\n.bg-purple-200 {\n background-color: $purple-200 !important;\n}\n\n.bg-purple-300 {\n background-color: $purple-300 !important;\n}\n\n.bg-yellow-000 {\n background-color: $yellow-000 !important;\n}\n\n.bg-yellow-100 {\n background-color: $yellow-100 !important;\n}\n\n.bg-yellow-200 {\n background-color: $yellow-200 !important;\n}\n\n.bg-yellow-300 {\n background-color: $yellow-300 !important;\n}\n\n.bg-red-000 {\n background-color: $red-000 !important;\n}\n\n.bg-red-100 {\n background-color: $red-100 !important;\n}\n\n.bg-red-200 {\n background-color: $red-200 !important;\n}\n\n.bg-red-300 {\n background-color: $red-300 !important;\n}\n","// Utility classes for layout\n\n// Display\n\n.d-block {\n display: block !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-none {\n display: none !important;\n}\n\n// Screenreader-only\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border-width: 0;\n}\n\n@each $media-query in map-keys($media-queries) {\n @for $i from 1 through length($spacers) {\n @include mq($media-query) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .d-sm-block, .d-md-none, .d-lg-inline\n .d-#{$media-query}-block {\n display: block !important;\n }\n .d-#{$media-query}-flex {\n display: flex !important;\n }\n .d-#{$media-query}-inline {\n display: inline !important;\n }\n .d-#{$media-query}-inline-block {\n display: inline-block !important;\n }\n .d-#{$media-query}-none {\n display: none !important;\n }\n }\n }\n}\n\n// Horizontal alignment\n\n.float-left {\n float: left !important;\n}\n\n.float-right {\n float: right !important;\n}\n\n.flex-justify-start {\n justify-content: flex-start !important;\n}\n\n.flex-justify-end {\n justify-content: flex-end !important;\n}\n\n.flex-justify-between {\n justify-content: space-between !important;\n}\n\n.flex-justify-around {\n justify-content: space-around !important;\n}\n\n// Vertical alignment\n\n.v-align-baseline {\n vertical-align: baseline !important;\n}\n\n.v-align-bottom {\n vertical-align: bottom !important;\n}\n\n.v-align-middle {\n vertical-align: middle !important;\n}\n\n.v-align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.v-align-text-top {\n vertical-align: text-top !important;\n}\n\n.v-align-top {\n vertical-align: top !important;\n}\n","// Utility classes for typography\n\n.fs-1 {\n @include fs-1;\n}\n\n.fs-2 {\n @include fs-2;\n}\n\n.fs-3 {\n @include fs-3;\n}\n\n.fs-4 {\n @include fs-4;\n}\n\n.fs-5 {\n @include fs-5;\n}\n\n.fs-6 {\n @include fs-6;\n}\n\n.fs-7 {\n @include fs-7;\n}\n\n.fs-8 {\n @include fs-8;\n}\n\n.fs-9 {\n @include fs-9;\n}\n\n.fs-10 {\n @include fs-10;\n}\n\n.fw-300 {\n font-weight: 300 !important;\n}\n\n.fw-400 {\n font-weight: 400 !important;\n}\n\n.fw-500 {\n font-weight: 500 !important;\n}\n\n.fw-700 {\n font-weight: 700 !important;\n}\n\n.lh-0 {\n line-height: 0 !important;\n}\n\n.lh-default {\n line-height: $body-line-height;\n}\n\n.lh-tight {\n line-height: $body-heading-line-height;\n}\n\n.ls-5 {\n letter-spacing: 0.05em !important;\n}\n\n.ls-10 {\n letter-spacing: 0.1em !important;\n}\n\n.ls-0 {\n letter-spacing: 0 !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n","// Utility classes for lists\n\n// stylelint-disable selector-max-type\n\n.list-style-none {\n padding: 0 !important;\n margin: 0 !important;\n list-style: none !important;\n\n li {\n &::before {\n display: none !important;\n }\n }\n}\n","// Utility classes for margins and padding\n\n// stylelint-disable block-opening-brace-space-after, block-opening-brace-space-before\n\n// Margin spacer utilities\n\n.mx-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n}\n\n@for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .m-0, .m-1, .m-2...\n .m-#{$scale} {\n margin: #{$size} !important;\n }\n .mt-#{$scale} {\n margin-top: #{$size} !important;\n }\n .mr-#{$scale} {\n margin-right: #{$size} !important;\n }\n .mb-#{$scale} {\n margin-bottom: #{$size} !important;\n }\n .ml-#{$scale} {\n margin-left: #{$size} !important;\n }\n\n .mx-#{$scale} {\n margin-right: #{$size} !important;\n margin-left: #{$size} !important;\n }\n\n .my-#{$scale} {\n margin-top: #{$size} !important;\n margin-bottom: #{$size} !important;\n }\n\n .mxn-#{$scale} {\n margin-right: -#{$size} !important;\n margin-left: -#{$size} !important;\n }\n .mx-#{$scale}-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n}\n\n@each $media-query in map-keys($media-queries) {\n @for $i from 1 through length($spacers) {\n @include mq($media-query) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .m-sm-0, .m-md-1, .m-lg-2...\n .m-#{$media-query}-#{$scale} {\n margin: #{$size} !important;\n }\n .mt-#{$media-query}-#{$scale} {\n margin-top: #{$size} !important;\n }\n .mr-#{$media-query}-#{$scale} {\n margin-right: #{$size} !important;\n }\n .mb-#{$media-query}-#{$scale} {\n margin-bottom: #{$size} !important;\n }\n .ml-#{$media-query}-#{$scale} {\n margin-left: #{$size} !important;\n }\n\n .mx-#{$media-query}-#{$scale} {\n margin-right: #{$size} !important;\n margin-left: #{$size} !important;\n }\n\n .my-#{$media-query}-#{$scale} {\n margin-top: #{$size} !important;\n margin-bottom: #{$size} !important;\n }\n\n .mxn-#{$media-query}-#{$scale} {\n margin-right: -#{$size} !important;\n margin-left: -#{$size} !important;\n }\n }\n }\n}\n\n// Padding spacer utilities\n\n@for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .p-0, .p-1, .p-2...\n .p-#{$scale} {\n padding: #{$size} !important;\n }\n .pt-#{$scale} {\n padding-top: #{$size} !important;\n }\n .pr-#{$scale} {\n padding-right: #{$size} !important;\n }\n .pb-#{$scale} {\n padding-bottom: #{$size} !important;\n }\n .pl-#{$scale} {\n padding-left: #{$size} !important;\n }\n\n .px-#{$scale} {\n padding-right: #{$size} !important;\n padding-left: #{$size} !important;\n }\n\n .py-#{$scale} {\n padding-top: #{$size} !important;\n padding-bottom: #{$size} !important;\n }\n}\n\n@each $media-query in map-keys($media-queries) {\n @include mq($media-query) {\n @for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .p-sm-0, .p-md-1, .p-lg-2...\n .p-#{$media-query}-#{$scale} {\n padding: #{$size} !important;\n }\n .pt-#{$media-query}-#{$scale} {\n padding-top: #{$size} !important;\n }\n .pr-#{$media-query}-#{$scale} {\n padding-right: #{$size} !important;\n }\n .pb-#{$media-query}-#{$scale} {\n padding-bottom: #{$size} !important;\n }\n .pl-#{$media-query}-#{$scale} {\n padding-left: #{$size} !important;\n }\n\n .px-#{$media-query}-#{$scale} {\n padding-right: #{$size} !important;\n padding-left: #{$size} !important;\n }\n\n .py-#{$media-query}-#{$scale} {\n padding-top: #{$size} !important;\n padding-bottom: #{$size} !important;\n }\n }\n }\n}\n","// stylelint-disable selector-max-specificity, selector-max-id, selector-max-type, selector-no-qualifying-type\n\n@media print {\n .site-footer,\n .site-button,\n #edit-this-page,\n #back-to-top,\n .site-nav,\n .main-header {\n display: none !important;\n }\n\n hr {\n margin-top: 1rem;\n margin-bottom: 1rem;\n }\n\n .side-bar {\n width: 100%;\n height: auto;\n border-right: 0 !important;\n }\n\n .site-header {\n border-bottom: 1px solid $border-color;\n }\n\n .site-title {\n font-size: 1rem !important;\n font-weight: 700 !important;\n }\n\n .text-small {\n font-size: 8pt !important;\n }\n\n pre.highlight {\n border: 1px solid $border-color;\n }\n\n .main {\n max-width: none;\n margin-left: 0;\n }\n}\n","// Skipnav\n// Skip to main content\n\na.skip-to-main {\n left: -999px;\n position: absolute;\n top: auto;\n width: 1px;\n height: 1px;\n overflow: hidden;\n z-index: -999;\n}\n\na.skip-to-main:focus,\na.skip-to-main:active {\n color: $link-color;\n background-color: $body-background-color;\n left: auto;\n top: auto;\n width: 30%;\n height: auto;\n overflow: auto;\n margin: 10px 35%;\n padding: 5px;\n border-radius: 15px;\n border: 4px solid $btn-primary-color;\n text-align: center;\n font-size: 1.2em;\n z-index: 999;\n}\n","\n@import \"./support/support\";\n@import \"./custom/setup\";\n@import \"./color_schemes/light\";\n\n@import \"./modules\";\ndiv.opaque {\n background-color: $body-background-color;\n}\n\np.tip, blockquote.tip {\n border: 1px $green-000 solid;\n border-left: $border-radius solid $green-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $green-300;\n content: \"Tip\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .tip-title {\n color: $green-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.tip-title, blockquote.tip-title {\n border: 1px $green-000 solid;\n border-left: $border-radius solid $green-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $green-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.tip {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.tip-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n\np.note, blockquote.note {\n border: 1px $blue-000 solid;\n border-left: $border-radius solid $blue-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $blue-300;\n content: \"Note\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .note-title {\n color: $blue-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.note-title, blockquote.note-title {\n border: 1px $blue-000 solid;\n border-left: $border-radius solid $blue-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $blue-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.note {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.note-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n\np.warning, blockquote.warning {\n border: 1px $yellow-000 solid;\n border-left: $border-radius solid $yellow-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $yellow-300;\n content: \"Warning\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .warning-title {\n color: $yellow-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.warning-title, blockquote.warning-title {\n border: 1px $yellow-000 solid;\n border-left: $border-radius solid $yellow-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $yellow-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.warning {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.warning-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n@import \"./custom/custom\";\n\n\n"],"file":"just-the-docs-light.css"} \ No newline at end of file diff --git a/main/assets/css/just-the-docs-meshtastic-dark.css.map b/main/assets/css/just-the-docs-meshtastic-dark.css.map index c7ab62c365..99847b1ef5 100644 --- a/main/assets/css/just-the-docs-meshtastic-dark.css.map +++ b/main/assets/css/just-the-docs-meshtastic-dark.css.map @@ -1 +1 @@ -{"version":3,"sourceRoot":"","sources":["../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/vendor/accessible-pygments/github-light.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/vendor/normalize.scss/normalize.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/base.scss","../../_sass/color_schemes/meshtastic-dark.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/support/mixins/_typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/support/mixins/_layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/support/_variables.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/content.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/navigation.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/labels.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/buttons.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/support/mixins/_buttons.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/search.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/tables.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/code.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/utilities/_colors.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/utilities/_layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/utilities/_typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/utilities/_lists.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/utilities/_spacing.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/print.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/skiptomain.scss","just-the-docs-meshtastic-dark.scss"],"names":[],"mappings":";AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA;EAAkB;;;AAClB;EAAgB;EAAiB;AACjC;EAAkB;EAAiB;AACnC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAkB;EAAiB;AACnC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAqB;AACtC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAoB;AACrC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAgB;EAAiB;AACjC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AChFlC;AAEA;AAAA;AAGA;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAAA;AAKA;EACE;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;EAEE;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;AAAA;EAGE;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;EAEE;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAAA;AAKA;AAAA;AAAA;AAAA;AAAA;EAKE;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;AAEE;EACA;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;AAEE;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;EAIE;;;AAGF;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;EAIE;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;EAIE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;EAEE;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;EAEE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AC1VF;EACE,cCGa;;;ADAf;EACE;;;AAGF;EACE;;AEmBA;EACE;;AClBA;EHHJ;IEyBI;;;;AFnBJ;EACE,aIfiB;EJgBjB;EACA,aIbiB;EJcjB,OCTgB;EDUhB,kBCZsB;EDatB;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAYE;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;EACA;EACA;EACA,aI1CyB;EJ2CzB,OCvCmB;;;AD0CrB;EACE;EACA;;;AAGF;EACE,OC7CW;ED8CX;;;AAGF;EACE;EACA,uBCvCa;EDwCb;;AAEA;EACE;;;AAIJ;EACE,aIvEiB;EJwEjB;EACA,aIvEiB;;;AJ0EnB;AAAA;EAEE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA,kBCvEa;EDwEb;;;AAIF;EACE;EAGA;EACA;EACA;EACA;;;AK7GF;EACE;EACA;EACA;EACA,kBJKc;;AEGZ;EEZJ;IAOI;IACA;IACA,ODwFW;ICvFX;IACA;IACA;;;AFAA;EEZJ;IAgBI;IACA,WD+EQ;;;ADpFR;EEQF;IAEI,aD2ES;;;ADrFX;EEQF;IAQI;;;AAOF;EACE;EACA,kBJ5BU;;AEGZ;EEuBA;IAKI;IACA,kBJjCgB;;;AIoClB;EACE;;AFjCJ;EEgCE;IAII;;;;AAOV;EACE;;AF5CE;EE2CJ;IAII;IACA,WDyCY;;;;ACrChB;EACE,aDaK;ECZL,gBDYK;EDvDL,eCuDK;EDtDL,cCsDK;;ADlEH;EEoDJ;IFrCI,eCqDG;IDpDH,cCoDG;;;ADpEH;EEoDJ;IAOI,aDSG;ICRH,gBDQG;;;;ACJP;EACE;EACA;;AFlEE;EEgEJ;IAKI;IACA;IACA,QDmBY;;;;ACfhB;AAAA;AAAA;EAGE;;AF9EE;EE2EJ;AAAA;AAAA;IAMI,ODGQ;;;;ACCZ;EACE;;AAEA;EACE;;AFzFA;EEqFJ;IAQI;IACA,aDxBG;ICyBH,gBD7BG;IC8BH;IACA;;;;AAIJ;EACE;EACA,YDbc;ECcd;;AFxGE;EEqGJ;IAMI,QDjBY;ICkBZ,YDlBY;ICmBZ;;;;AAIJ;EACE;EACA;EACA;EACA;EACA,aDrDK;ECsDL,gBDtDK;ECuDL,OJzHmB;EEYnB,eCuDK;EDtDL,cCsDK;;ADlEH;EEiHJ;IFlGI,eCqDG;IDpDH,cCoDG;;;AF/BL;EACE;;ACtCA;EEiHJ;IHvEI;IACA,aEhDuB;;;ADKvB;EEiHJ;IAcI,aD/DG;ICgEH,gBDhEG;;;;AC+EP;EACE;EACA;EACA,SDhFK;ECiFL;;;AFnJE;EEuJF;IACE;;;AAIJ;EACE;;;AAQF;EACE;;;AAOF;EACE;EACA;EACA;EACA,aD/GK;ECgHL,gBDhHK;EDvDL,eCuDK;EDtDL,cCsDK;;ADlEH;EE6KJ;IF9JI,eCqDG;IDpDH,cCoDG;;;AFvEL;EACE;;ACEA;EE6KJ;IH3KI;;;ACFA;EE6KJ;IAYI;IACA;;;;AAIJ;EACE,OD5HK;EC6HL,QD7HK;EC8HL,OJ/LW;;;AKXb;EACE,aFEoB;;AEApB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;;AAGF;EACE;EACA;;AAGF;AAAA;EAEE;;AAIA;EACE,YF+CC;;AE3CL;EACE;EACA;;AAEA;EACE;;AAEA;EACE;EACA;EACA;EACA,OFfM;EEgBN;EACA;;AJ1BN;EACE;;ACRA;EG2BE;IJfF;;;ACZA;EG2BE;IAUI;;;AAIJ;EACE;;AAGE;EACE;EACA;;AAOV;EACE;;AAGE;EACE;EACA;EACA,OF7CM;EE8CN;;AAMJ;EACE;;AAIJ;EACE;EACA;;AAKF;EACE;;AAGF;EACE;;AAGF;EACE;EACA;;AAGF;AAAA;EAEE;;AAGF;EACE;EACA;EACA;;AAEA;EACE;;AAIJ;EACE;EACA;EACA;;AAmBE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;;AASF;AAAA;AAAA;AAAA;AAAA;AAAA;EAEE;;AAKN;EACE;EACA;EACA,OFnFG;EEoFH;EACA,eFzFG;EE0FH,cF1FG;EE2FH;;AH1JA;EGmJF;IAUI;IACA;;;AAGF;EACE;EACA;EACA;EACA,OLnKO;EKoKP;;AAYF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;;AAIJ;EACE;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;EACA;EACA;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAKE;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;;AAIJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAWE,YF9JG;;;AG3EP;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;ALoBF;EACE;;AClBA;EILF;IL2BE;;;ACtBA;EDOF;IACE;;;ACRA;EILF;ILiBE;;;AKPA;EACE;EACA,YH+DC;EG9DD,aHuDC;EGtDD,gBHsDC;EGrDD;EAEE,eH0DD;EGzDC,cHqDD;;ADlEH;EIKA;IAeI,YHgDD;IG/CC;IAEE,eH6CH;IG5CG,cH4CH;;;AGrCD;EACE,OHkCD;EGjCC,QHiCD;EGhCC;;AAGF;EACE;EACA;;AAGF;EAEE;EACA;;AASJ;EACE;EAEE;EAGF,OHUC;EGTD,QHSC;EGRD;EACA,ON7DO;;AEFT;EIsDA;IAYI,OHED;IGDC,QHCD;IGAC;;;AAGF;EACE;;AAQA;EACE;;AAKN;EACE;EACA,cHvBC;EGwBD;;AAEA;EACE;;AAEA;EACE,ONzFa;;AM4Ff;EACE,ON7Fa;;AMmGjB;EAEI;;AAMJ;EACE;;;AAMR;EACE;EACA;EACA;EACA;EACA;;ALhIA;EACE;;ACEA;EIwHJ;ILtHI;;;ACFA;EIwHJ;IASI;IACA,YHhEG;IGiEH;;EAEA;IACE;;;;AAMJ;EACE;;AAEA;EACE;;AAGE;EACE,ONlJG;;AMqJL;EACE,ONtJG;;;AM+Jb;EACE;EACA;;ALtKA;EACE;;ACEA;EIiKJ;IL/JI;;;AKoKF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AJlLA;EIiKJ;IAqBI,eHpHG;;;;ADlEH;EI4LJ;IAEI;;;;AAIJ;EACE;EACA,eHnIK;EGoIL;;;AAGF;EACE;;AL5MA;EACE;;ACEA;EIwMJ;ILtMI;;;AK0MF;EACE;;AAGF;EACE;EACA,cHlJG;EGmJH,aHnJG;EGoJH,OHpMU;EGqMV;;AAIA;EACE;;;ACrON;AAAA;EAEE;;ANoEA;AAAA;EACE;EACA,aElEuB;;ADKvB;EKXJ;AAAA;IN4EI;;;;AA5BF;AAAA;AAAA;EACE;;ACtCA;EKJJ;AAAA;AAAA;IN8CI;IACA,aEhDuB;;;;AFgCzB;AAAA;EACE;;AC5BA;EKEJ;AAAA;IN8BI;;;;AMzBJ;AAAA;EAEE;EACA;EACA;;ANdA;AAAA;EACE;;ACEA;EKOJ;AAAA;INLI;;;;AMcJ;EACE;;;ANVA;AAAA;EACE;;ACRA;EKoBJ;AAAA;INRI;;;;AAfF;AAAA;EACE;;ACEA;EKyBJ;AAAA;INvBI;;;;AALF;EACE;;ACEA;EK8BJ;IN5BI;;;;AMgCJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;ACvDF;AAAA;EAEE;EACA;EACA,cLoEK;EKnEL,aLmEK;EKlEL,OLiBM;EKhBN;EACA;EACA,kBL6BS;EK5BT;;APLA;AAAA;EACE;;ACEA;EMRJ;AAAA;IPUI;;;;AOKJ;EACE,kBL4BU;;;AKzBZ;EACE,kBLcW;;;AKXb;EACE,kBL4BQ;;;AKzBV;EACE,OLFY;EKGZ,kBLkBW;;;AMlDb;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,OTIW;ESHX;EACA;EACA;EACA,kBTiBkB;EShBlB;EACA,eNyEc;EMxEd,YACE;EAEF;;AAEA;EACE;EACA;EACA;;AAGF;EAEE;;AAGF;EAEE;;AAGF;EAIE;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;AAKA;EAEE;EACA;EACA;EACA;EACA;;;AAKN;EACE,OT1DW;ES2DX;EACA;;AAEA;EAIE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA,YACE;;AAIJ;EAEE;;;AAIJ;ECnGE,OP0BM;EOzBN;EACA;EACA,YACE;;AAGF;EAEE,OPiBI;EOhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;ADgFJ;ECvGE,OP0BM;EOzBN;EACA;EACA,YACE;;AAGF;EAEE,OPiBI;EOhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;ADoFJ;EC3GE,OP0BM;EOzBN;EACA;EACA,YACE;;AAGF;EAEE,OPiBI;EOhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;ADwFJ;EC/GE,OP0BM;EOzBN;EACA;EACA,YACE;;AAGF;EAEE,OPiBI;EOhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;AD4FJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AE3HF;EACE;EACA;EACA;EACA,QRgFM;EQ/EN,SRuEK;EQtEL;;ATME;ESZJ;IASI;IACA;IACA;IACA;IACA;;;;AAIJ;EACE;EACA;EACA,QR8DK;EQ7DL;EACA,eRmEc;EQlEd,YACE;EAEF;;ATdE;ESKJ;IAYI;IACA;IACA,WRwEmB;IQvEnB;IACA;IACA;IACA;;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA,OXnCgB;EWoChB,kBXTwB;EWUxB;EACA;EACA;EACA;EACA;;ATvCE;ES2BJ;IAeI;IACA;IACA,kBXhDoB;IWiDpB;;;AAGF;EACE;EACA;;AAEA;EACE,OXnDO;;;AWwDb;EACE;EACA;EACA;EACA,cRIK;;ADlEH;ES0DJ;IAOI,cRGG;IQFH;;;AAGF;EACE;EACA;EACA;EACA,ORzDU;;;AQ6Dd;EACE;EACA;EACA;EACA;EACA;EACA;EACA,kBX3DwB;EW4DxB,4BRRc;EQSd,2BRTc;EQUd,YACE;;ATxFA;ES6EJ;IAeI;IACA,ORFmB;IQGnB;;;;AAIJ;EACE;EACA,eRrCK;EQsCL;;AVpFA;EACE;;AClBA;ESkGJ;IV5EI;;;ACtBA;EDOF;IACE;;;ACRA;ESkGJ;IVtFI;;;;AUiGJ;EACE;EACA;;;AAGF;EACE;EACA;;AAEA;EAEE,kBXlGa;;;AWsGjB;EACE;EACA,aR9DK;EQ+DL,gBR/DK;;ADhEH;ES4HJ;IAMI;IACA;IACA,eRpEG;IQqEH;;;;AAIJ;EACE;EACA;EACA;;AAEA;EACE;;AVxIF;EACE;;ACRA;ES8IF;IVlIE;;;ACZA;EDHF;IACE;;;ACEA;ES8IF;IV5IE;;;AUqJF;EACE,ORtFG;EQuFH,QRvFG;EQwFH,cR1FG;EQ2FH,OXzJS;EW0JT;;AAGF;EACE;;;AAIJ;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA,OXtK4B;EWuK5B;EACA;;AV5LA;EACE;;ACYA;ESyKJ;IVjLI;;;;AU2LJ;EACE;EACA,aRrHK;EQsHL,gBRtHK;EQuHL,cRrHK;EQsHL,aRxHK;EQyHL,OXlL4B;EWmL5B;EACA,aR/GO;EQgHP,mBX9Ka;;ACjBb;EACE;;ACEA;ESmLJ;IVjLI;;;ACFA;ESmLJ;IAaI;IACA;IACA,cRlIG;IQmIH;IACA;;;;AAIJ;EACE,YR1IK;;;AQ6IP;EACE;;;AAGF;EACE;;AV1MA;EACE;;ACRA;ESgNJ;IVpMI;;;;AUyMJ;EACE;EACA,ORrJK;EQsJL,QRtJK;EQuJL;EACA,ORnJK;EQoJL,QRpJK;EQqJL,kBXnMwB;EWoMxB;EACA;EACA,YACE;EAEF;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YACE;;;AAMF;EACE;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE,QRxLI;EQyLJ;;ATjQA;ES+PF;IAKI,ORzKiB;IQ0KjB,YACE;;;AAKN;EACE,kBXnPsB;;AEzBtB;ES2QF;IAII;;;AT/QF;ESmRF;IAEI;;;AAIJ;EACE;;AAGF;EACE;EACA;EACA;EACA,YACE;;ATlSF;ESwSA;IACE;IACA;IACA;;;AAIJ;EACE,aRxOI;;ADxEJ;ES+SF;IAII;;;;AC9TN;EACE;EACA;EACA;EACA,eT0EK;ESzEL;EACA,eTkFc;ESjFd,YACE;;;AAIJ;EACE;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA,kBZIuB;EYHvB;EACA;;AXNA;AAAA;EACE;;ACRA;EUOJ;AAAA;IXKI;;;AWKF;AAAA;EACE;;;AAOE;AAAA;EAEE;;AAGF;EACE,gBTkCD;;;AS3BL;EACE;;;AC9CF;EACE;EACA;EACA,kBbcoB;EabpB;EACA,eV+EY;;;AU1EhB;EACE,cbUa;;;AayCf;AAAA;AAAA;EAGE;EACA,eVMK;EULL,kBblDsB;EamDtB,eVgBc;EUfd;EACA;EACA;EACA;;AAIA;AAAA;AAAA;EACE,OVLG;EUMH;EACA;EACA;EACA;EACA,SVVG;EUWH;EACA;EACA,ObhFc;EaiFd;;AAEA;AAAA;AAAA;EACE,MbpFY;;AauFd;AAAA;AAAA;EACE;EACA;EACA;;AAGF;AAAA;AAAA;EACE;EACA;;AAMF;AAAA;AAAA;EACE;EACA;;;AASJ;EACE;EACA,SV/CG;EUgDH;EACA;EACA,eVtCY;;AUyCd;AAAA;EAEE;EACA;EACA;;;AAUJ;EACE;EACA,eVrEK;;AU6CL;EACE;EACA,SV/CG;EUgDH;EACA;EACA,eVtCY;;AUyCd;AAAA;EAEE;EACA;EACA;;;AAwBF;AAAA;EAEE;EACA,SVpFG;EUqFH;EACA;EACA,eV3EY;;;AUmFhB;EACE;EACA;EACA;EACA;;AAEA;AAAA;EAEE;EACA;EACA,kBbhKoB;EaiKpB;;AZ9KF;AAAA;EACE;;ACEA;EWsKF;AAAA;IZpKE;;;AY8KF;EACE;EACA,eVjHG;EUkHH,cVlHG;;AUqHL;EACE;EACA;;;AAKJ;AAAA;EAEE,SV9HK;EU+HL,eV/HK;EUgIL;EACA;EACA,eVtHc;;AUwHd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAIE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAKJ;EACE;EACA;EACA;;;AAIF;AAAA;EAEE,YbnNsB;EasNpB,ObrNoB;;;Aa4NxB;EACE,Yb9NsB;;;AcpBxB;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;ACvOF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AbrBE;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;AAQR;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AdhHA;EACE;;ACYA;EcZJ;IfII;;;;AAKF;EACE;;ACEA;EcRJ;IfUI;;;;AAKF;EACE;;ACRA;EcJJ;IfgBI;;;;AAKF;EACE;;AClBA;EcAJ;IfsBI;;;;AAKF;EACE;;AC5BA;EcIJ;If4BI;;;;AAKF;EACE;;ACtCA;EcQJ;IfkCI;IACA,aEhDuB;;;;AFqDzB;EACE;EACA,aEvDuB;;ADKvB;EcYJ;If0CI;;;;AAKF;EACE;EACA,aElEuB;;ADKvB;EcgBJ;IfiDI;;;;AAKF;EACE;EACA,aE7EuB;;ADKvB;EcoBJ;IfwDI;;;;AAKF;EACE;EACA,aExFuB;;ADKvB;EcwBJ;If+DI;;;;Ae3DJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE,abxDiB;;;Aa2DnB;EACE,ab1DyB;;;Aa6D3B;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AC/EF;EACE;EACA;EACA;;AAGE;EACE;;;ACLN;EACE;EACA;;;AAQA;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AhBlCA;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAaN;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AhB7GA;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AC3JR;EACE;AAAA;AAAA;AAAA;AAAA;AAAA;IAME;;EAGF;IACE;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;IACA;;;ACvCJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE,OpBCW;EoBAX,kBpBNsB;EoBOtB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ACpBF;EACE,kBrBCsB;;;AqBExB;EACI;EACA;EACA,elB4EY;EkB3EZ;EACA;;AAEA;EACI,OlB8BI;EkB7BJ;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OlBoBM;EkBnBN;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,elBiDY;EkBhDZ;EACA;;AACA;EACE;EACA;EACA,OlBEM;EkBDN;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAMJ;EACI;EACA;EACA,elBGY;EkBFZ;EACA;;AAEA;EACI,OlB/CG;EkBgDH;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OlBzDK;EkB0DL;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,elBxBY;EkByBZ;EACA;;AACA;EACE;EACA;EACA,OlB3EK;EkB4EL;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAMJ;EACI;EACA;EACA,elBtEY;EkBuEZ;EACA;;AAEA;EACI,OlBhHK;EkBiHL;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OlB1HO;EkB2HP;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,elBjGY;EkBkGZ;EACA;;AACA;EACE;EACA;EACA,OlB5IO;EkB6IP;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE","sourcesContent":["/*\ngenerated by accessible-pygments \nCopyright (c) 2022, Quansight Labs\nLicensed under the BSD license, see LICENSE for details.\n--\ngenerated by Pygments \nCopyright 2006-2025 by the Pygments team.\nLicensed under the BSD license, see LICENSE for details.\n*/\n\n.highlight .hll { background-color: #0969da4a }\n.highlight .c { color: #6E7781 } /* Comment */\n.highlight .err { color: #CF222E } /* Error */\n.highlight .k { color: #CF222E } /* Keyword */\n.highlight .l { color: #953800 } /* Literal */\n.highlight .n { color: #8250DF } /* Name */\n.highlight .o { color: #116329 } /* Operator */\n.highlight .p { color: #24292F } /* Punctuation */\n.highlight .ch { color: #6E7781 } /* Comment.Hashbang */\n.highlight .cm { color: #6E7781 } /* Comment.Multiline */\n.highlight .cp { color: #6E7781 } /* Comment.Preproc */\n.highlight .cpf { color: #6E7781 } /* Comment.PreprocFile */\n.highlight .c1 { color: #6E7781 } /* Comment.Single */\n.highlight .cs { color: #6E7781 } /* Comment.Special */\n.highlight .gd { color: #0550AE } /* Generic.Deleted */\n.highlight .ge { font-style: italic } /* Generic.Emph */\n.highlight .gr { color: #CF222E } /* Generic.Error */\n.highlight .gh { color: #0550AE } /* Generic.Heading */\n.highlight .gs { font-weight: bold } /* Generic.Strong */\n.highlight .gu { color: #0550AE } /* Generic.Subheading */\n.highlight .kc { color: #0550AE } /* Keyword.Constant */\n.highlight .kd { color: #CF222E } /* Keyword.Declaration */\n.highlight .kn { color: #CF222E } /* Keyword.Namespace */\n.highlight .kp { color: #CF222E } /* Keyword.Pseudo */\n.highlight .kr { color: #CF222E } /* Keyword.Reserved */\n.highlight .kt { color: #CF222E } /* Keyword.Type */\n.highlight .ld { color: #953800 } /* Literal.Date */\n.highlight .m { color: #953800 } /* Literal.Number */\n.highlight .s { color: #0550AE } /* Literal.String */\n.highlight .na { color: #953800 } /* Name.Attribute */\n.highlight .nb { color: #953800 } /* Name.Builtin */\n.highlight .nc { color: #0550AE } /* Name.Class */\n.highlight .no { color: #0550AE } /* Name.Constant */\n.highlight .nd { color: #953800 } /* Name.Decorator */\n.highlight .ni { color: #116329 } /* Name.Entity */\n.highlight .ne { color: #8250DF } /* Name.Exception */\n.highlight .nf { color: #0550AE } /* Name.Function */\n.highlight .nl { color: #953800 } /* Name.Label */\n.highlight .nn { color: #24292F } /* Name.Namespace */\n.highlight .nx { color: #8250DF } /* Name.Other */\n.highlight .py { color: #0550AE } /* Name.Property */\n.highlight .nt { color: #116329 } /* Name.Tag */\n.highlight .nv { color: #953800 } /* Name.Variable */\n.highlight .ow { color: #8250DF } /* Operator.Word */\n.highlight .pm { color: #24292F } /* Punctuation.Marker */\n.highlight .w { color: #24292F } /* Text.Whitespace */\n.highlight .mb { color: #953800 } /* Literal.Number.Bin */\n.highlight .mf { color: #953800 } /* Literal.Number.Float */\n.highlight .mh { color: #953800 } /* Literal.Number.Hex */\n.highlight .mi { color: #953800 } /* Literal.Number.Integer */\n.highlight .mo { color: #953800 } /* Literal.Number.Oct */\n.highlight .sa { color: #0550AE } /* Literal.String.Affix */\n.highlight .sb { color: #0550AE } /* Literal.String.Backtick */\n.highlight .sc { color: #0550AE } /* Literal.String.Char */\n.highlight .dl { color: #0550AE } /* Literal.String.Delimiter */\n.highlight .sd { color: #0550AE } /* Literal.String.Doc */\n.highlight .s2 { color: #0550AE } /* Literal.String.Double */\n.highlight .se { color: #0550AE } /* Literal.String.Escape */\n.highlight .sh { color: #0550AE } /* Literal.String.Heredoc */\n.highlight .si { color: #0550AE } /* Literal.String.Interpol */\n.highlight .sx { color: #0550AE } /* Literal.String.Other */\n.highlight .sr { color: #0550AE } /* Literal.String.Regex */\n.highlight .s1 { color: #0550AE } /* Literal.String.Single */\n.highlight .ss { color: #0550AE } /* Literal.String.Symbol */\n.highlight .bp { color: #953800 } /* Name.Builtin.Pseudo */\n.highlight .fm { color: #0550AE } /* Name.Function.Magic */\n.highlight .vc { color: #953800 } /* Name.Variable.Class */\n.highlight .vg { color: #953800 } /* Name.Variable.Global */\n.highlight .vi { color: #953800 } /* Name.Variable.Instance */\n.highlight .vm { color: #953800 } /* Name.Variable.Magic */\n.highlight .il { color: #953800 } /* Literal.Number.Integer.Long */\n","/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */\n\n/* Document\n ========================================================================== */\n\n/**\n * 1. Correct the line height in all browsers.\n * 2. Prevent adjustments of font size after orientation changes in iOS.\n */\n\nhtml {\n line-height: 1.15; /* 1 */\n text-size-adjust: 100%; /* 2 */\n}\n\n/* Sections\n ========================================================================== */\n\n/**\n * Remove the margin in all browsers.\n */\n\nbody {\n margin: 0;\n}\n\n/**\n * Render the `main` element consistently in IE.\n */\n\nmain {\n display: block;\n}\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n/* Grouping content\n ========================================================================== */\n\n/**\n * 1. Add the correct box sizing in Firefox.\n * 2. Show the overflow in Edge and IE.\n */\n\nhr {\n box-sizing: content-box; /* 1 */\n height: 0; /* 1 */\n overflow: visible; /* 2 */\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\npre {\n font-family: monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/* Text-level semantics\n ========================================================================== */\n\n/**\n * Remove the gray background on active links in IE 10.\n */\n\na {\n background-color: transparent;\n}\n\n/**\n * 1. Remove the bottom border in Chrome 57-\n * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n */\n\nabbr[title] {\n border-bottom: none; /* 1 */\n text-decoration: underline; /* 2 */\n text-decoration: underline dotted; /* 2 */\n}\n\n/**\n * Add the correct font weight in Chrome, Edge, and Safari.\n */\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\ncode,\nkbd,\nsamp {\n font-family: monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/**\n * Add the correct font size in all browsers.\n */\n\nsmall {\n font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` elements from affecting the line height in\n * all browsers.\n */\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/* Embedded content\n ========================================================================== */\n\n/**\n * Remove the border on images inside links in IE 10.\n */\n\nimg {\n border-style: none;\n}\n\n/* Forms\n ========================================================================== */\n\n/**\n * 1. Change the font styles in all browsers.\n * 2. Remove the margin in Firefox and Safari.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-size: 100%; /* 1 */\n line-height: 1.15; /* 1 */\n margin: 0; /* 2 */\n}\n\n/**\n * Show the overflow in IE.\n * 1. Show the overflow in Edge.\n */\n\nbutton,\ninput {\n /* 1 */\n overflow: visible;\n}\n\n/**\n * Remove the inheritance of text transform in Edge, Firefox, and IE.\n * 1. Remove the inheritance of text transform in Firefox.\n */\n\nbutton,\nselect {\n /* 1 */\n text-transform: none;\n}\n\n/**\n * Correct the inability to style clickable types in iOS and Safari.\n */\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n appearance: button;\n}\n\n/**\n * Remove the inner border and padding in Firefox.\n */\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n border-style: none;\n padding: 0;\n}\n\n/**\n * Restore the focus styles unset by the previous rule.\n */\n\nbutton:-moz-focusring,\n[type=\"button\"]:-moz-focusring,\n[type=\"reset\"]:-moz-focusring,\n[type=\"submit\"]:-moz-focusring {\n outline: 1px dotted ButtonText;\n}\n\n/**\n * Correct the padding in Firefox.\n */\n\nfieldset {\n padding: 0.35em 0.75em 0.625em;\n}\n\n/**\n * 1. Correct the text wrapping in Edge and IE.\n * 2. Correct the color inheritance from `fieldset` elements in IE.\n * 3. Remove the padding so developers are not caught out when they zero out\n * `fieldset` elements in all browsers.\n */\n\nlegend {\n box-sizing: border-box; /* 1 */\n color: inherit; /* 2 */\n display: table; /* 1 */\n max-width: 100%; /* 1 */\n padding: 0; /* 3 */\n white-space: normal; /* 1 */\n}\n\n/**\n * Add the correct vertical alignment in Chrome, Firefox, and Opera.\n */\n\nprogress {\n vertical-align: baseline;\n}\n\n/**\n * Remove the default vertical scrollbar in IE 10+.\n */\n\ntextarea {\n overflow: auto;\n}\n\n/**\n * 1. Add the correct box sizing in IE 10.\n * 2. Remove the padding in IE 10.\n */\n\n[type=\"checkbox\"],\n[type=\"radio\"] {\n box-sizing: border-box; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Correct the cursor style of increment and decrement buttons in Chrome.\n */\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n/**\n * 1. Correct the odd appearance in Chrome and Safari.\n * 2. Correct the outline style in Safari.\n */\n\n[type=\"search\"] {\n appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/**\n * Remove the inner padding in Chrome and Safari on macOS.\n */\n\n[type=\"search\"]::-webkit-search-decoration {\n appearance: none;\n}\n\n/**\n * 1. Correct the inability to style clickable types in iOS and Safari.\n * 2. Change font properties to `inherit` in Safari.\n */\n\n::-webkit-file-upload-button {\n appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/* Interactive\n ========================================================================== */\n\n/*\n * Add the correct display in Edge, IE 10+, and Firefox.\n */\n\ndetails {\n display: block;\n}\n\n/*\n * Add the correct display in all browsers.\n */\n\nsummary {\n display: list-item;\n}\n\n/* Misc\n ========================================================================== */\n\n/**\n * Add the correct display in IE 10+.\n */\n\ntemplate {\n display: none;\n}\n\n/**\n * Add the correct display in IE 10.\n */\n\n[hidden] {\n display: none;\n}\n","// Base element style overrides\n// stylelint-disable selector-no-type, selector-max-type, selector-max-specificity, selector-max-id\n\n:root {\n color-scheme: $color-scheme;\n}\n\n* {\n box-sizing: border-box;\n}\n\nhtml {\n scroll-behavior: smooth;\n\n @include fs-4;\n}\n\nbody {\n font-family: $body-font-family;\n font-size: inherit;\n line-height: $body-line-height;\n color: $body-text-color;\n background-color: $body-background-color;\n overflow-wrap: break-word;\n}\n\nol,\nul,\ndl,\npre,\naddress,\nblockquote,\ntable,\ndiv,\nhr,\nform,\nfieldset,\nnoscript .table-wrapper {\n margin-top: 0;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n#toctitle {\n margin-top: 0;\n margin-bottom: 1em;\n font-weight: 500;\n line-height: $body-heading-line-height;\n color: $body-heading-color;\n}\n\np {\n margin-top: 1em;\n margin-bottom: 1em;\n}\n\na {\n color: $link-color;\n text-decoration: none;\n}\n\na:not([class]) {\n text-decoration: underline;\n text-decoration-color: $border-color;\n text-underline-offset: 2px;\n\n &:hover {\n text-decoration-color: rgba($link-color, 0.45);\n }\n}\n\ncode {\n font-family: $mono-font-family;\n font-size: 0.75em;\n line-height: $body-line-height;\n}\n\nfigure,\npre {\n margin: 0;\n}\n\nli {\n margin: 0.25em 0;\n}\n\nimg {\n max-width: 100%;\n height: auto;\n}\n\nhr {\n height: 1px;\n padding: 0;\n margin: $sp-6 0;\n background-color: $border-color;\n border: 0;\n}\n\n// adds a GitHub-style sidebar to blockquotes\nblockquote {\n margin: 10px 0;\n\n // resets user-agent stylesheets for blockquotes\n margin-block-start: 0;\n margin-inline-start: 0;\n padding-left: 1rem;\n border-left: 3px solid $border-color;\n}\n","// Meshtastic Material 3 — Dark color scheme for just-the-docs\n// Source: core/ui/.../Color.kt §8.3 (Dark Scheme)\n//\n// Brand colors:\n// Primary (Dark): #67EA94 (Green 500)\n// Surface (Dark): #1A1B26 (Neutral 900)\n\n$color-scheme: dark;\n\n// Body / page background\n$body-background-color: #1A1B26; // Neutral 900 — surfaceDark\n$sidebar-color: #1A1B26; // Neutral 900\n$body-text-color: #ECEDF3; // Neutral 100 — onSurfaceDark\n$body-heading-color: #ECEDF3; // Neutral 100\n\n// Links\n$link-color: #67EA94; // Green 500 — primaryDark\n$nav-link-color: #67EA94; // Green 500\n\n// Navigation\n$nav-child-link-color: #B8BAC8; // Neutral 300 — secondaryDark\n$search-result-preview-color: #B8BAC8;\n\n// Code\n$code-background-color: #0F1017; // Neutral 950 — surfaceContainerLowestDark\n$code-linenumber-color: #9496A6; // Neutral 400\n\n// Borders\n$border-color: #3D3E50; // Neutral 700 — outlineVariantDark\n$table-background-color: #242533; // Interpolated — surfaceContainerDark\n\n// Buttons\n$btn-primary-color: #67EA94; // Green 500\n$base-button-color: #2C2D3C; // Neutral 800\n\n// Feedback / callouts\n$feedback-color: #242533; // surfaceContainerDark\n\n// Search\n$search-background-color: #242533; // surfaceContainerDark\n","@mixin fs-1 {\n & {\n font-size: $font-size-1 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-1-sm !important;\n }\n}\n\n@mixin fs-2 {\n & {\n font-size: $font-size-2 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-3 !important;\n }\n}\n\n@mixin fs-3 {\n & {\n font-size: $font-size-3 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-4 !important;\n }\n}\n\n@mixin fs-4 {\n & {\n font-size: $font-size-4 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-5 !important;\n }\n}\n\n@mixin fs-5 {\n & {\n font-size: $font-size-5 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-6 !important;\n }\n}\n\n@mixin fs-6 {\n & {\n font-size: $font-size-6 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-7 !important;\n line-height: $body-heading-line-height;\n }\n}\n\n@mixin fs-7 {\n & {\n font-size: $font-size-7 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-8 !important;\n }\n}\n\n@mixin fs-8 {\n & {\n font-size: $font-size-8 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-9 !important;\n }\n}\n\n@mixin fs-9 {\n & {\n font-size: $font-size-9 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-10 !important;\n }\n}\n\n@mixin fs-10 {\n & {\n font-size: $font-size-10 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-10-sm !important;\n }\n}\n","// Media query\n\n// Media query mixin\n// Usage:\n// @include mq(md) {\n// ..medium and up styles\n// }\n@mixin mq($name) {\n // Retrieves the value from the key\n $value: map-get($media-queries, $name);\n\n // If the key exists in the map\n @if $value {\n // Prints a media query based on the value\n @media (min-width: $value) {\n @content;\n }\n } @else {\n @warn \"No value could be retrieved from `#{$media-query}`. Please make sure it is defined in `$media-queries` map.\";\n }\n}\n\n// Responsive container\n\n@mixin container {\n padding-right: $gutter-spacing-sm;\n padding-left: $gutter-spacing-sm;\n\n @include mq(md) {\n padding-right: $gutter-spacing;\n padding-left: $gutter-spacing;\n }\n}\n","// Typography\n\n// prettier-ignore\n$body-font-family: system-ui, -apple-system, blinkmacsystemfont, \"Segoe UI\",\n roboto, \"Helvetica Neue\", arial, sans-serif, \"Segoe UI Emoji\" !default;\n$mono-font-family: \"SFMono-Regular\", menlo, consolas, monospace !default;\n$root-font-size: 16px !default; // DEPRECATED: previously base font-size for rems\n$body-line-height: 1.4 !default;\n$content-line-height: 1.6 !default;\n$body-heading-line-height: 1.25 !default;\n\n// Font size\n// `-sm` suffix is the size at the small (and above) media query\n\n$font-size-1: 0.5625rem !default;\n$font-size-1-sm: 0.625rem !default;\n$font-size-2: 0.6875rem !default; // h4 - uppercased!, h6 not uppercased, text-small\n$font-size-3: 0.75rem !default; // h5\n$font-size-4: 0.875rem !default;\n$font-size-5: 1rem !default; // h3\n$font-size-6: 1.125rem !default; // h2\n$font-size-7: 1.5rem !default;\n$font-size-8: 2rem !default; // h1\n$font-size-9: 2.25rem !default;\n$font-size-10: 2.625rem !default;\n$font-size-10-sm: 3rem !default;\n\n// Colors\n\n$white: #fff !default;\n$grey-dk-000: #959396 !default;\n$grey-dk-100: #5c5962 !default;\n$grey-dk-200: #44434d !default;\n$grey-dk-250: #302d36 !default;\n$grey-dk-300: #27262b !default;\n$grey-lt-000: #f5f6fa !default;\n$grey-lt-100: #eeebee !default;\n$grey-lt-200: #ecebed !default;\n$grey-lt-300: #e6e1e8 !default;\n$purple-000: #7253ed !default;\n$purple-100: #5e41d0 !default;\n$purple-200: #4e26af !default;\n$purple-300: #381885 !default;\n$blue-000: #2c84fa !default;\n$blue-100: #2869e6 !default;\n$blue-200: #264caf !default;\n$blue-300: #183385 !default;\n$green-000: #41d693 !default;\n$green-100: #11b584 !default;\n$green-200: #009c7b !default;\n$green-300: #026e57 !default;\n$yellow-000: #ffeb82 !default;\n$yellow-100: #fadf50 !default;\n$yellow-200: #f7d12e !default;\n$yellow-300: #e7af06 !default;\n$red-000: #f77e7e !default;\n$red-100: #f96e65 !default;\n$red-200: #e94c4c !default;\n$red-300: #dd2e2e !default;\n\n// Spacing\n\n$spacing-unit: 1rem; // 1rem == 16px\n\n$spacers: (\n sp-0: 0,\n sp-1: $spacing-unit * 0.25,\n sp-2: $spacing-unit * 0.5,\n sp-3: $spacing-unit * 0.75,\n sp-4: $spacing-unit,\n sp-5: $spacing-unit * 1.5,\n sp-6: $spacing-unit * 2,\n sp-7: $spacing-unit * 2.5,\n sp-8: $spacing-unit * 3,\n sp-9: $spacing-unit * 3.5,\n sp-10: $spacing-unit * 4,\n) !default;\n$sp-1: map-get($spacers, sp-1) !default; // 0.25 rem == 4px\n$sp-2: map-get($spacers, sp-2) !default; // 0.5 rem == 8px\n$sp-3: map-get($spacers, sp-3) !default; // 0.75 rem == 12px\n$sp-4: map-get($spacers, sp-4) !default; // 1 rem == 16px\n$sp-5: map-get($spacers, sp-5) !default; // 1.5 rem == 24px\n$sp-6: map-get($spacers, sp-6) !default; // 2 rem == 32px\n$sp-7: map-get($spacers, sp-7) !default; // 2.5 rem == 40px\n$sp-8: map-get($spacers, sp-8) !default; // 3 rem == 48px\n$sp-9: map-get($spacers, sp-9) !default; // 3.5 rem == 56px\n$sp-10: map-get($spacers, sp-10) !default; // 4 rem == 64px\n\n// Borders\n\n$border: 1px solid !default;\n$border-radius: 4px !default;\n$border-color: $grey-lt-100 !default;\n\n// Grid system\n\n$gutter-spacing: $sp-6 !default;\n$gutter-spacing-sm: $sp-4 !default;\n$nav-width: 16.5rem !default;\n$nav-width-md: 15.5rem !default;\n$nav-list-item-height: $sp-6 !default;\n$nav-list-item-height-sm: $sp-8 !default;\n$nav-list-expander-right: true;\n$content-width: 50rem !default;\n$header-height: 3.75rem !default;\n$search-results-width: $content-width - $nav-width !default;\n$transition-duration: 400ms;\n\n// Media queries in pixels\n\n$media-queries: (\n xs: 20rem,\n sm: 31.25rem,\n md: $content-width,\n lg: $content-width + $nav-width,\n xl: 87.5rem,\n) !default;\n","// The basic two column layout\n\n.side-bar {\n z-index: 0;\n display: flex;\n flex-wrap: wrap;\n background-color: $sidebar-color;\n\n @include mq(md) {\n flex-flow: column nowrap;\n position: fixed;\n width: $nav-width-md;\n height: 100%;\n border-right: $border $border-color;\n align-items: flex-end;\n }\n\n @include mq(lg) {\n width: calc((100% - #{$nav-width + $content-width}) / 2 + #{$nav-width});\n min-width: $nav-width;\n }\n\n & + .main {\n @include mq(md) {\n margin-left: $nav-width-md;\n }\n\n @include mq(lg) {\n // stylelint-disable function-name-case\n // disable for Max(), we want to use the CSS max() function\n margin-left: Max(\n #{$nav-width},\n calc((100% - #{$nav-width + $content-width}) / 2 + #{$nav-width})\n );\n // stylelint-enable function-name-case\n }\n\n .main-header {\n display: none;\n background-color: $sidebar-color;\n\n @include mq(md) {\n display: flex;\n background-color: $body-background-color;\n }\n\n &.nav-open {\n display: block;\n\n @include mq(md) {\n display: flex;\n }\n }\n }\n }\n}\n\n.main {\n margin: auto;\n\n @include mq(md) {\n position: relative;\n max-width: $content-width;\n }\n}\n\n.main-content-wrap {\n padding-top: $gutter-spacing-sm;\n padding-bottom: $gutter-spacing-sm;\n\n @include container;\n\n @include mq(md) {\n padding-top: $gutter-spacing;\n padding-bottom: $gutter-spacing;\n }\n}\n\n.main-header {\n z-index: 0;\n border-bottom: $border $border-color;\n\n @include mq(md) {\n display: flex;\n justify-content: space-between;\n height: $header-height;\n }\n}\n\n.site-nav,\n.site-header,\n.site-footer {\n width: 100%;\n\n @include mq(lg) {\n width: $nav-width;\n }\n}\n\n.site-nav {\n display: none;\n\n &.nav-open {\n display: block;\n }\n\n @include mq(md) {\n display: block;\n padding-top: $sp-8;\n padding-bottom: $gutter-spacing-sm;\n overflow-y: auto;\n flex: 1 1 auto;\n }\n}\n\n.site-header {\n display: flex;\n min-height: $header-height;\n align-items: center;\n\n @include mq(md) {\n height: $header-height;\n max-height: $header-height;\n border-bottom: $border $border-color;\n }\n}\n\n.site-title {\n flex-grow: 1;\n display: flex;\n height: 100%;\n align-items: center;\n padding-top: $sp-3;\n padding-bottom: $sp-3;\n color: $body-heading-color;\n\n @include container;\n\n @include fs-6;\n\n @include mq(md) {\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n }\n}\n\n@if variable-exists(logo) {\n .site-logo {\n width: 100%;\n height: 100%;\n background-image: url($logo);\n background-repeat: no-repeat;\n background-position: left center;\n background-size: contain;\n }\n}\n\n.site-button {\n display: flex;\n height: 100%;\n padding: $gutter-spacing-sm;\n align-items: center;\n}\n\n@include mq(md) {\n .site-header .site-button {\n display: none;\n }\n}\n\n.site-title:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 80%,\n rgba($feedback-color, 0) 100%\n );\n}\n\n.site-button:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 100%\n );\n}\n\n.site-footer {\n position: absolute;\n bottom: 0;\n left: 0;\n padding-top: $sp-4;\n padding-bottom: $sp-4;\n\n @include container;\n\n @include fs-2;\n\n @include mq(md) {\n position: static;\n justify-self: end;\n }\n}\n\n.icon {\n width: $sp-5;\n height: $sp-5;\n color: $link-color;\n}\n","@charset \"UTF-8\";\n\n// Styles for rendered markdown in the .main-content container\n// stylelint-disable selector-no-type, max-nesting-depth, selector-max-compound-selectors, selector-max-type, selector-max-specificity, selector-max-id\n\n.main-content {\n line-height: $content-line-height;\n\n ol,\n ul,\n dl,\n pre,\n address,\n blockquote,\n .table-wrapper {\n margin-top: 0.5em;\n }\n\n a {\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n ul,\n ol {\n padding-left: 1.5em;\n }\n\n li {\n .highlight {\n margin-top: $sp-1;\n }\n }\n\n ol {\n list-style-type: none;\n counter-reset: step-counter;\n\n > li {\n position: relative;\n\n &::before {\n position: absolute;\n top: 0.2em;\n left: -1.6em;\n color: $grey-dk-000;\n content: counter(step-counter);\n counter-increment: step-counter;\n @include fs-3;\n\n @include mq(sm) {\n top: 0.11em;\n }\n }\n\n ol {\n counter-reset: sub-counter;\n\n > li {\n &::before {\n content: counter(sub-counter, lower-alpha);\n counter-increment: sub-counter;\n }\n }\n }\n }\n }\n\n ul {\n list-style: none;\n\n > li {\n &::before {\n position: absolute;\n margin-left: -1.4em;\n color: $grey-dk-000;\n content: \"•\";\n }\n }\n }\n\n .task-list-item {\n &::before {\n content: \"\";\n }\n }\n\n .task-list-item-checkbox {\n margin-right: 0.6em;\n margin-left: -1.4em;\n\n // The same margin-left is used above for ul > li::before\n }\n\n hr + * {\n margin-top: 0;\n }\n\n h1:first-of-type {\n margin-top: 0.5em;\n }\n\n dl {\n display: grid;\n grid-template: auto / 10em 1fr;\n }\n\n dt,\n dd {\n margin: 0.25em 0;\n }\n\n dt {\n grid-column: 1;\n font-weight: 500;\n text-align: right;\n\n &::after {\n content: \":\";\n }\n }\n\n dd {\n grid-column: 2;\n margin-bottom: 0;\n margin-left: 1em;\n\n blockquote,\n div,\n dl,\n dt,\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n li,\n ol,\n p,\n pre,\n table,\n ul,\n .table-wrapper {\n &:first-child {\n margin-top: 0;\n }\n }\n }\n\n dd,\n ol,\n ul {\n dl:first-child {\n dt:first-child,\n dd:nth-child(2) {\n margin-top: 0;\n }\n }\n }\n\n .anchor-heading {\n position: absolute;\n right: -$sp-4;\n width: $sp-5;\n height: 100%;\n padding-right: $sp-1;\n padding-left: $sp-1;\n overflow: visible;\n\n @include mq(md) {\n right: auto;\n left: -$sp-5;\n }\n\n svg {\n display: inline-block;\n width: 100%;\n height: 100%;\n color: $link-color;\n visibility: hidden;\n }\n }\n\n .anchor-heading:hover,\n .anchor-heading:focus,\n h1:hover > .anchor-heading,\n h2:hover > .anchor-heading,\n h3:hover > .anchor-heading,\n h4:hover > .anchor-heading,\n h5:hover > .anchor-heading,\n h6:hover > .anchor-heading {\n svg {\n visibility: visible;\n }\n }\n\n summary {\n cursor: pointer;\n }\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n #toctitle {\n position: relative;\n margin-top: 1.5em;\n margin-bottom: 0.25em;\n\n + table,\n + .table-wrapper,\n + .code-example,\n + .highlighter-rouge,\n + .sectionbody .listingblock {\n margin-top: 1em;\n }\n\n + p:not(.label) {\n margin-top: 0;\n }\n }\n\n > h1:first-child,\n > h2:first-child,\n > h3:first-child,\n > h4:first-child,\n > h5:first-child,\n > h6:first-child,\n > .sect1:first-child > h2,\n > .sect2:first-child > h3,\n > .sect3:first-child > h4,\n > .sect4:first-child > h5,\n > .sect5:first-child > h6 {\n margin-top: $sp-2;\n }\n}\n","// Main nav, breadcrumb, etc...\n// stylelint-disable selector-no-type, max-nesting-depth, selector-max-compound-selectors, selector-max-type, selector-max-specificity\n\n.nav-list {\n padding: 0;\n margin-top: 0;\n margin-bottom: 0;\n list-style: none;\n\n .nav-list-item {\n position: relative;\n margin: 0;\n\n @include fs-4;\n\n @include mq(md) {\n @include fs-3;\n }\n\n .nav-list-link {\n display: block;\n min-height: $nav-list-item-height-sm;\n padding-top: $sp-1;\n padding-bottom: $sp-1;\n line-height: #{$nav-list-item-height-sm - 2 * $sp-1};\n @if $nav-list-expander-right {\n padding-right: $nav-list-item-height-sm;\n padding-left: $gutter-spacing-sm;\n } @else {\n padding-right: $gutter-spacing-sm;\n padding-left: $nav-list-item-height-sm;\n }\n\n @include mq(md) {\n min-height: $nav-list-item-height;\n line-height: #{$nav-list-item-height - 2 * $sp-1};\n @if $nav-list-expander-right {\n padding-right: $nav-list-item-height;\n padding-left: $gutter-spacing;\n } @else {\n padding-right: $gutter-spacing;\n padding-left: $nav-list-item-height;\n }\n }\n\n &.external > svg {\n width: $sp-4;\n height: $sp-4;\n vertical-align: text-bottom;\n }\n\n &.active {\n font-weight: 600;\n text-decoration: none;\n }\n\n &:hover,\n &.active {\n color: darken($link-color, 5%);\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 80%,\n rgba($feedback-color, 0) 100%\n );\n }\n }\n\n .nav-list-expander {\n position: absolute;\n @if $nav-list-expander-right {\n right: 0;\n }\n\n width: $nav-list-item-height-sm;\n height: $nav-list-item-height-sm;\n padding: #{$nav-list-item-height-sm * 0.25};\n color: $link-color;\n\n @include mq(md) {\n width: $nav-list-item-height;\n height: $nav-list-item-height;\n padding: #{$nav-list-item-height * 0.25};\n }\n\n &:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 100%\n );\n }\n\n @if $nav-list-expander-right {\n svg {\n transform: rotate(90deg);\n }\n }\n }\n\n > .nav-list {\n display: none;\n padding-left: $sp-3;\n list-style: none;\n\n .nav-list-item {\n position: relative;\n\n .nav-list-link {\n color: $nav-child-link-color;\n }\n\n .nav-list-expander {\n color: $nav-child-link-color;\n }\n }\n }\n\n &.active {\n > .nav-list-expander svg {\n @if $nav-list-expander-right {\n transform: rotate(-90deg);\n } @else {\n transform: rotate(90deg);\n }\n }\n\n > .nav-list {\n display: block;\n }\n }\n }\n}\n\n.nav-category {\n padding: $sp-2 $gutter-spacing-sm;\n font-weight: 600;\n text-align: start;\n text-transform: uppercase;\n border-bottom: $border $border-color;\n @include fs-2;\n\n @include mq(md) {\n padding: $sp-2 $gutter-spacing;\n margin-top: $gutter-spacing-sm;\n text-align: start;\n\n &:first-child {\n margin-top: 0;\n }\n }\n}\n\n.nav-list.nav-category-list {\n > .nav-list-item {\n margin: 0;\n\n > .nav-list {\n padding: 0;\n\n > .nav-list-item {\n > .nav-list-link {\n color: $link-color;\n }\n\n > .nav-list-expander {\n color: $link-color;\n }\n }\n }\n }\n}\n\n// Aux nav\n\n.aux-nav {\n height: 100%;\n overflow-x: auto;\n @include fs-2;\n\n .aux-nav-list {\n display: flex;\n height: 100%;\n padding: 0;\n margin: 0;\n list-style: none;\n }\n\n .aux-nav-list-item {\n display: inline-block;\n height: 100%;\n padding: 0;\n margin: 0;\n }\n\n @include mq(md) {\n padding-right: $gutter-spacing-sm;\n }\n}\n\n// Breadcrumb nav\n\n.breadcrumb-nav {\n @include mq(md) {\n margin-top: -$sp-4;\n }\n}\n\n.breadcrumb-nav-list {\n padding-left: 0;\n margin-bottom: $sp-3;\n list-style: none;\n}\n\n.breadcrumb-nav-list-item {\n display: table-cell;\n @include fs-2;\n\n &::before {\n display: none;\n }\n\n &::after {\n display: inline-block;\n margin-right: $sp-2;\n margin-left: $sp-2;\n color: $grey-dk-000;\n content: \"/\";\n }\n\n &:last-child {\n &::after {\n content: \"\";\n }\n }\n}\n","// Typography\n// stylelint-disable selector-no-type, selector-max-type, selector-max-specificity, selector-max-id\n\nh1,\n.text-alpha {\n font-weight: 300;\n\n @include fs-8;\n}\n\nh2,\n.text-beta,\n#toctitle {\n @include fs-6;\n}\n\nh3,\n.text-gamma {\n @include fs-5;\n}\n\nh4,\n.text-delta {\n font-weight: 400;\n text-transform: uppercase;\n letter-spacing: 0.1em;\n\n @include fs-2;\n}\n\nh4 code {\n text-transform: none;\n}\n\nh5,\n.text-epsilon {\n @include fs-3;\n}\n\nh6,\n.text-zeta {\n @include fs-2;\n}\n\n.text-small {\n @include fs-2;\n}\n\n.text-mono {\n font-family: $mono-font-family !important;\n}\n\n.text-left {\n text-align: left !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n.text-right {\n text-align: right !important;\n}\n","// Labels (not the form kind)\n\n// this :not() prevents a style clash with Mermaid.js's\n// diagram labels, which also use .label\n// for more, see https://github.com/just-the-docs/just-the-docs/issues/1272\n// and the accompanying PR\n.label:not(g),\n.label-blue:not(g) {\n display: inline-block;\n padding: 0.16em 0.56em;\n margin-right: $sp-2;\n margin-left: $sp-2;\n color: $white;\n text-transform: uppercase;\n vertical-align: middle;\n background-color: $blue-100;\n border-radius: 12px;\n\n @include fs-2;\n}\n\n.label-green:not(g) {\n background-color: $green-300;\n}\n\n.label-purple:not(g) {\n background-color: $purple-100;\n}\n\n.label-red:not(g) {\n background-color: $red-300;\n}\n\n.label-yellow:not(g) {\n color: $grey-dk-200;\n background-color: $yellow-200;\n}\n","// Buttons and things that look like buttons\n// stylelint-disable color-named\n\n.btn {\n display: inline-block;\n box-sizing: border-box;\n padding: 0.3em 1em;\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n font-weight: 500;\n line-height: 1.5;\n color: $link-color;\n text-decoration: none;\n vertical-align: baseline;\n cursor: pointer;\n background-color: $base-button-color;\n border-width: 0;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n appearance: none;\n\n &:focus {\n text-decoration: none;\n outline: none;\n box-shadow: 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:focus:hover,\n &.selected:focus {\n box-shadow: 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:hover,\n &.zeroclipboard-is-hover {\n color: darken($link-color, 2%);\n }\n\n &:hover,\n &:active,\n &.zeroclipboard-is-hover,\n &.zeroclipboard-is-active {\n text-decoration: none;\n background-color: darken($base-button-color, 1%);\n }\n\n &:active,\n &.selected,\n &.zeroclipboard-is-active {\n background-color: darken($base-button-color, 3%);\n background-image: none;\n box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15);\n }\n\n &.selected:hover {\n background-color: darken(#dcdcdc, 5%);\n }\n\n &:disabled,\n &.disabled {\n &,\n &:hover {\n color: rgba(102, 102, 102, 0.5);\n cursor: default;\n background-color: rgba(229, 229, 229, 0.5);\n background-image: none;\n box-shadow: none;\n }\n }\n}\n\n.btn-outline {\n color: $link-color;\n background: transparent;\n box-shadow: inset 0 0 0 2px $grey-lt-300;\n\n &:hover,\n &:active,\n &.zeroclipboard-is-hover,\n &.zeroclipboard-is-active {\n color: darken($link-color, 4%);\n text-decoration: none;\n background-color: transparent;\n box-shadow: inset 0 0 0 3px $grey-lt-300;\n }\n\n &:focus {\n text-decoration: none;\n outline: none;\n box-shadow:\n inset 0 0 0 2px $grey-dk-100,\n 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:focus:hover,\n &.selected:focus {\n box-shadow: inset 0 0 0 2px $grey-dk-100;\n }\n}\n\n.btn-primary {\n @include btn-color($white, $btn-primary-color);\n}\n\n.btn-purple {\n @include btn-color($white, $purple-100);\n}\n\n.btn-blue {\n @include btn-color($white, $blue-200);\n}\n\n.btn-green {\n @include btn-color($white, $green-300);\n}\n\n.btn-reset {\n background: none;\n border: none;\n margin: 0;\n text-align: inherit;\n font: inherit;\n border-radius: 0;\n appearance: none;\n}\n","// Colored button\n\n@mixin btn-color($fg, $bg) {\n color: $fg;\n background-color: darken($bg, 2%);\n background-image: linear-gradient(lighten($bg, 5%), darken($bg, 2%));\n box-shadow:\n 0 1px 3px rgba(0, 0, 0, 0.25),\n 0 4px 10px rgba(0, 0, 0, 0.12);\n\n &:hover,\n &.zeroclipboard-is-hover {\n color: $fg;\n background-color: darken($bg, 4%);\n background-image: linear-gradient((lighten($bg, 2%), darken($bg, 4%)));\n }\n\n &:active,\n &.selected,\n &.zeroclipboard-is-active {\n background-color: darken($bg, 5%);\n background-image: none;\n box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15);\n }\n\n &.selected:hover {\n background-color: darken($bg, 10%);\n }\n}\n","// Search input and autocomplete\n\n.search {\n position: relative;\n z-index: 2;\n flex-grow: 1;\n height: $sp-10;\n padding: $sp-2;\n transition: padding linear #{$transition-duration * 0.5};\n\n @include mq(md) {\n position: relative !important;\n width: auto !important;\n height: 100% !important;\n padding: 0;\n transition: none;\n }\n}\n\n.search-input-wrap {\n position: relative;\n z-index: 1;\n height: $sp-8;\n overflow: hidden;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n transition: height linear #{$transition-duration * 0.5};\n\n @include mq(md) {\n position: absolute;\n width: 100%;\n max-width: $search-results-width;\n height: 100% !important;\n border-radius: 0;\n box-shadow: none;\n transition: width ease $transition-duration;\n }\n}\n\n.search-input {\n position: absolute;\n width: 100%;\n height: 100%;\n padding: $sp-2 $gutter-spacing-sm $sp-2 #{$gutter-spacing-sm + $sp-5};\n font-size: 1rem;\n color: $body-text-color;\n background-color: $search-background-color;\n border-top: 0;\n border-right: 0;\n border-bottom: 0;\n border-left: 0;\n border-radius: 0;\n\n @include mq(md) {\n padding: $sp-2 $gutter-spacing-sm $sp-2 #{$gutter-spacing + $sp-5};\n font-size: 0.875rem;\n background-color: $body-background-color;\n transition: padding-left linear #{$transition-duration * 0.5};\n }\n\n &:focus {\n outline: 2px solid $link-color;\n outline-offset: -2px;\n\n + .search-label .search-icon {\n color: $link-color;\n }\n }\n}\n\n.search-label {\n position: absolute;\n display: flex;\n height: 100%;\n padding-left: $gutter-spacing-sm;\n\n @include mq(md) {\n padding-left: $gutter-spacing;\n transition: padding-left linear #{$transition-duration * 0.5};\n }\n\n .search-icon {\n width: #{$sp-4 * 1.2};\n height: #{$sp-4 * 1.2};\n align-self: center;\n color: $grey-dk-000;\n }\n}\n\n.search-results {\n position: absolute;\n left: 0;\n display: none;\n width: 100%;\n max-height: calc(100% - #{$sp-10});\n overflow-y: auto;\n background-color: $search-background-color;\n border-bottom-right-radius: $border-radius;\n border-bottom-left-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n\n @include mq(md) {\n top: 100%;\n width: $search-results-width;\n max-height: calc(100vh - 200%) !important;\n }\n}\n\n.search-results-list {\n padding-left: 0;\n margin-bottom: $sp-1;\n list-style: none;\n @include fs-4;\n\n @include mq(md) {\n @include fs-3;\n }\n}\n\n.search-results-list-item {\n padding: 0;\n margin: 0;\n}\n\n.search-result {\n display: block;\n padding: $sp-1 $sp-3;\n\n &:hover,\n &.active {\n background-color: $feedback-color;\n }\n}\n\n.search-result-title {\n display: block;\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n\n @include mq(sm) {\n display: inline-block;\n width: 40%;\n padding-right: $sp-2;\n vertical-align: top;\n }\n}\n\n.search-result-doc {\n display: flex;\n align-items: center;\n word-wrap: break-word;\n\n &.search-result-doc-parent {\n opacity: 0.5;\n @include fs-3;\n\n @include mq(md) {\n @include fs-2;\n }\n }\n\n .search-result-icon {\n width: $sp-4;\n height: $sp-4;\n margin-right: $sp-2;\n color: $link-color;\n flex-shrink: 0;\n }\n\n .search-result-doc-title {\n overflow: auto;\n }\n}\n\n.search-result-section {\n margin-left: #{$sp-4 + $sp-2};\n word-wrap: break-word;\n}\n\n.search-result-rel-url {\n display: block;\n margin-left: #{$sp-4 + $sp-2};\n overflow: hidden;\n color: $search-result-preview-color;\n text-overflow: ellipsis;\n white-space: nowrap;\n @include fs-1;\n}\n\n.search-result-previews {\n display: block;\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n padding-left: $sp-4;\n margin-left: $sp-2;\n color: $search-result-preview-color;\n word-wrap: break-word;\n border-left: $border;\n border-left-color: $border-color;\n @include fs-2;\n\n @include mq(sm) {\n display: inline-block;\n width: 60%;\n padding-left: $sp-2;\n margin-left: 0;\n vertical-align: top;\n }\n}\n\n.search-result-preview + .search-result-preview {\n margin-top: $sp-1;\n}\n\n.search-result-highlight {\n font-weight: bold;\n}\n\n.search-no-result {\n padding: $sp-2 $sp-3;\n @include fs-3;\n}\n\n.search-button {\n position: fixed;\n right: $sp-4;\n bottom: $sp-4;\n display: flex;\n width: $sp-9;\n height: $sp-9;\n background-color: $search-background-color;\n border: 1px solid rgba($link-color, 0.3);\n border-radius: #{$sp-9 * 0.5};\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n align-items: center;\n justify-content: center;\n}\n\n.search-overlay {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1;\n width: 0;\n height: 0;\n background-color: rgba(0, 0, 0, 0.3);\n opacity: 0;\n transition:\n opacity ease $transition-duration,\n width 0s $transition-duration,\n height 0s $transition-duration;\n}\n\n.search-active {\n .search {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n padding: 0;\n }\n\n .search-input-wrap {\n height: $sp-10;\n border-radius: 0;\n\n @include mq(md) {\n width: $search-results-width;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n }\n }\n\n .search-input {\n background-color: $search-background-color;\n\n @include mq(md) {\n padding-left: 2.3rem;\n }\n }\n\n .search-label {\n @include mq(md) {\n padding-left: 0.6rem;\n }\n }\n\n .search-results {\n display: block;\n }\n\n .search-overlay {\n width: 100%;\n height: 100%;\n opacity: 1;\n transition:\n opacity ease $transition-duration,\n width 0s,\n height 0s;\n }\n\n @include mq(md) {\n .main {\n position: fixed;\n right: 0;\n left: 0;\n }\n }\n\n .main-header {\n padding-top: $sp-10;\n\n @include mq(md) {\n padding-top: 0;\n }\n }\n}\n","// Tables\n// stylelint-disable max-nesting-depth, selector-no-type, selector-max-type\n\n.table-wrapper {\n display: block;\n width: 100%;\n max-width: 100%;\n margin-bottom: $sp-5;\n overflow-x: auto;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n}\n\ntable {\n display: table;\n min-width: 100%;\n border-collapse: separate;\n}\n\nth,\ntd {\n min-width: 7.5rem;\n padding: $sp-2 $sp-3;\n background-color: $table-background-color;\n border-bottom: $border rgba($border-color, 0.5);\n border-left: $border $border-color;\n\n @include fs-3;\n\n &:first-of-type {\n border-left: 0;\n }\n}\n\ntbody {\n tr {\n &:last-of-type {\n th,\n td {\n border-bottom: 0;\n }\n\n td {\n padding-bottom: $sp-3;\n }\n }\n }\n}\n\nthead {\n th {\n border-bottom: $border $border-color;\n }\n}\n","// Code and syntax highlighting\n// stylelint-disable selector-no-qualifying-type, declaration-block-semicolon-newline-after,declaration-block-single-line-max-declarations, selector-no-type, selector-max-type, scss/comment-no-empty\n\n// {% raw %}\n\n// This instruction applies to all queues not within 'pre' or 'figure', avoiding 'code' generated by the highlight.\n:not(pre, figure) {\n & > code {\n padding: 0.2em 0.15em;\n font-weight: 400;\n background-color: $code-background-color;\n border: $border $border-color;\n border-radius: $border-radius;\n }\n}\n\n// Avoid appearance of dark border around visited code links in Safari\na:visited code {\n border-color: $border-color;\n}\n\n// Content structure for highlighted code blocks using fences or Liquid\n//\n// ```[LANG]...```, no kramdown line_numbers:\n// div.[language-LANG.]highlighter-rouge > div.highlight > pre.highlight > code\n//\n// ```[LANG]...```, kramdown line_numbers = true:\n// div.[language-LANG.]highlighter-rouge > div.highlight > pre.highlight > code\n// > div.table-wrapper > table.rouge-table > tbody > tr\n// > td.rouge-gutter.gl > pre.lineno\n// | td.rouge-code > pre\n//\n// {% highlight LANG %}...{% endhighlight %}:\n// figure.highlight > pre > code.language-LANG\n//\n// {% highlight LANG linenos %}...{% endhighlight %}:\n// figure.highlight > pre > code.language-LANG\n// > div.table-wrapper > table.rouge-table > tbody > tr\n// > td.gutter.gl > pre.lineno\n// | td.code > pre\n//\n// ----...---- (AsciiDoc)\n// div.listingblock > div.content > pre.rouge.highlight\n//\n// fix_linenos removes the outermost pre when it encloses table.rouge-table\n//\n// See docs/index-test.md for some tests.\n//\n// No kramdown line_numbers: fences and Liquid highlighting look the same.\n// Kramdown line_numbers = true: fences have a wider gutter than with Liquid?\n\n// ```[LANG]...```\n// or in AsciiDoc:\n//\n// ----\n// ...\n// ----\n\n// the code may appear with 3 different types:\n// container \\ case: default case, code with line number, code with html rendering\n// top level: div.highlighter-rouge, figure.highlight, figure.highlight\n// second level: div.highlight, div.table-wrapper, pre.highlight\n// third level: pre.highlight, td.code, absent\n// last level: code, pre, code (optionality)\n// highlighter level: span, span, span\n// the spacing are only in the second level for case 1, 3 and in the third level for case 2\n// in AsciiDoc, there is a parent container that contains optionally a title and the content.\n\n// select top level container\ndiv.highlighter-rouge,\ndiv.listingblock > div.content,\nfigure.highlight {\n margin-top: 0;\n margin-bottom: $sp-3;\n background-color: $code-background-color;\n border-radius: $border-radius;\n box-shadow: none;\n -webkit-overflow-scrolling: touch;\n position: relative;\n padding: 0;\n\n // copy button (or other button)\n // the button appear only when there is a hover on the code or focus on button\n > button {\n width: $sp-3;\n opacity: 0;\n position: absolute;\n top: 0;\n right: 0;\n padding: $sp-3;\n border: none;\n background: none;\n color: $body-text-color;\n box-sizing: content-box;\n\n svg {\n fill: $body-text-color;\n }\n\n &:active {\n text-decoration: none;\n outline: none;\n opacity: 1;\n }\n\n &:focus {\n opacity: 1;\n outline: 2px solid $link-color;\n }\n }\n\n // the button can be seen by doing a simple hover in the code, there is no need to go over the location of the button\n &:hover {\n > button {\n cursor: copy;\n opacity: 1;\n }\n }\n}\n\n// setting the spacing and scrollbar on the second level for the first case\n// remove all space on the second and third level\n// this is a mixin to accommodate for the slightly different structures generated via Markdown vs AsciiDoc\n@mixin scroll-and-spacing($code-div, $pre-select) {\n #{$code-div} {\n overflow-x: auto;\n padding: $sp-3;\n margin: 0;\n border: 1px solid $body-text-color;\n border-radius: $border-radius;\n }\n\n #{$pre-select},\n code {\n padding: 0;\n margin: 0;\n border: 0;\n }\n}\n\n// for Markdown\ndiv.highlighter-rouge {\n @include scroll-and-spacing(\"div.highlight\", \"pre.highlight\");\n}\n\n// for AsciiDoc. we also need to fix the margins for its parent container.\ndiv.listingblock {\n margin-top: 0;\n margin-bottom: $sp-3;\n\n @include scroll-and-spacing(\"div.content\", \"div.content > pre\");\n}\n\n// {% highlight LANG %}...{% endhighlight %},\n// {% highlight LANG linenos %}...{% endhighlight %}:\n\n// setting the spacing and scrollbar on the second level for the thirt case\n// the css rule are apply only to the last code enviroment\n// setting the scroolbar\nfigure.highlight {\n pre,\n :not(pre) > code {\n overflow-x: auto;\n padding: $sp-3;\n margin: 0;\n border: 1px solid $body-text-color;\n border-radius: $border-radius;\n }\n}\n\n// ```[LANG]...```, kramdown line_numbers = true,\n// {% highlight LANG linenos %}...{% endhighlight %}:\n\n// setting the spacing and scrollbar on the thirt level for the second case\n.highlight .table-wrapper {\n padding: $sp-3 0;\n margin: 0;\n border: 0;\n box-shadow: none;\n\n td,\n pre {\n min-width: 0;\n padding: 0;\n background-color: $code-background-color;\n border: 0;\n\n @include fs-2;\n }\n\n td.gl {\n width: 1em;\n padding-right: $sp-3;\n padding-left: $sp-3;\n }\n\n pre {\n margin: 0;\n line-height: 2;\n }\n}\n\n// Code examples: html render of a code\n.code-example,\n.listingblock > .title {\n padding: $sp-3;\n margin-bottom: $sp-3;\n overflow: auto;\n border: 1px solid $border-color;\n border-radius: $border-radius;\n\n + .highlighter-rouge,\n + .sectionbody .listingblock,\n + .content,\n + figure.highlight {\n position: relative;\n margin-top: -$sp-4;\n border-right: 1px solid $border-color;\n border-bottom: 1px solid $border-color;\n border-left: 1px solid $border-color;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n }\n}\n\n// Mermaid diagram code blocks should be left unstyled.\ncode.language-mermaid {\n padding: 0;\n background-color: inherit;\n border: 0;\n}\n\n// Override OneDarkJekyll Colors for Code Blocks\n.highlight,\npre.highlight {\n background: $code-background-color; // Code Background\n // For Backwards Compatibility Before $code-linenumber-color was added\n @if variable-exists(code-linenumber-color) {\n color: $code-linenumber-color; // Code Line Numbers\n } @else {\n color: $body-text-color; // Code Line Numbers\n }\n}\n\n// Override OneDarkJekyll Colors for Code Blocks\n.highlight pre {\n background: $code-background-color; // Code Background\n}\n\n// {% endraw %}\n","// Utility classes for colors\n\n// Text colors\n\n.text-grey-dk-000 {\n color: $grey-dk-000 !important;\n}\n\n.text-grey-dk-100 {\n color: $grey-dk-100 !important;\n}\n\n.text-grey-dk-200 {\n color: $grey-dk-200 !important;\n}\n\n.text-grey-dk-250 {\n color: $grey-dk-250 !important;\n}\n\n.text-grey-dk-300 {\n color: $grey-dk-300 !important;\n}\n\n.text-grey-lt-000 {\n color: $grey-lt-000 !important;\n}\n\n.text-grey-lt-100 {\n color: $grey-lt-100 !important;\n}\n\n.text-grey-lt-200 {\n color: $grey-lt-200 !important;\n}\n\n.text-grey-lt-300 {\n color: $grey-lt-300 !important;\n}\n\n.text-blue-000 {\n color: $blue-000 !important;\n}\n\n.text-blue-100 {\n color: $blue-100 !important;\n}\n\n.text-blue-200 {\n color: $blue-200 !important;\n}\n\n.text-blue-300 {\n color: $blue-300 !important;\n}\n\n.text-green-000 {\n color: $green-000 !important;\n}\n\n.text-green-100 {\n color: $green-100 !important;\n}\n\n.text-green-200 {\n color: $green-200 !important;\n}\n\n.text-green-300 {\n color: $green-300 !important;\n}\n\n.text-purple-000 {\n color: $purple-000 !important;\n}\n\n.text-purple-100 {\n color: $purple-100 !important;\n}\n\n.text-purple-200 {\n color: $purple-200 !important;\n}\n\n.text-purple-300 {\n color: $purple-300 !important;\n}\n\n.text-yellow-000 {\n color: $yellow-000 !important;\n}\n\n.text-yellow-100 {\n color: $yellow-100 !important;\n}\n\n.text-yellow-200 {\n color: $yellow-200 !important;\n}\n\n.text-yellow-300 {\n color: $yellow-300 !important;\n}\n\n.text-red-000 {\n color: $red-000 !important;\n}\n\n.text-red-100 {\n color: $red-100 !important;\n}\n\n.text-red-200 {\n color: $red-200 !important;\n}\n\n.text-red-300 {\n color: $red-300 !important;\n}\n\n// Background colors\n\n.bg-grey-dk-000 {\n background-color: $grey-dk-000 !important;\n}\n\n.bg-grey-dk-100 {\n background-color: $grey-dk-100 !important;\n}\n\n.bg-grey-dk-200 {\n background-color: $grey-dk-200 !important;\n}\n\n.bg-grey-dk-250 {\n background-color: $grey-dk-250 !important;\n}\n\n.bg-grey-dk-300 {\n background-color: $grey-dk-300 !important;\n}\n\n.bg-grey-lt-000 {\n background-color: $grey-lt-000 !important;\n}\n\n.bg-grey-lt-100 {\n background-color: $grey-lt-100 !important;\n}\n\n.bg-grey-lt-200 {\n background-color: $grey-lt-200 !important;\n}\n\n.bg-grey-lt-300 {\n background-color: $grey-lt-300 !important;\n}\n\n.bg-blue-000 {\n background-color: $blue-000 !important;\n}\n\n.bg-blue-100 {\n background-color: $blue-100 !important;\n}\n\n.bg-blue-200 {\n background-color: $blue-200 !important;\n}\n\n.bg-blue-300 {\n background-color: $blue-300 !important;\n}\n\n.bg-green-000 {\n background-color: $green-000 !important;\n}\n\n.bg-green-100 {\n background-color: $green-100 !important;\n}\n\n.bg-green-200 {\n background-color: $green-200 !important;\n}\n\n.bg-green-300 {\n background-color: $green-300 !important;\n}\n\n.bg-purple-000 {\n background-color: $purple-000 !important;\n}\n\n.bg-purple-100 {\n background-color: $purple-100 !important;\n}\n\n.bg-purple-200 {\n background-color: $purple-200 !important;\n}\n\n.bg-purple-300 {\n background-color: $purple-300 !important;\n}\n\n.bg-yellow-000 {\n background-color: $yellow-000 !important;\n}\n\n.bg-yellow-100 {\n background-color: $yellow-100 !important;\n}\n\n.bg-yellow-200 {\n background-color: $yellow-200 !important;\n}\n\n.bg-yellow-300 {\n background-color: $yellow-300 !important;\n}\n\n.bg-red-000 {\n background-color: $red-000 !important;\n}\n\n.bg-red-100 {\n background-color: $red-100 !important;\n}\n\n.bg-red-200 {\n background-color: $red-200 !important;\n}\n\n.bg-red-300 {\n background-color: $red-300 !important;\n}\n","// Utility classes for layout\n\n// Display\n\n.d-block {\n display: block !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-none {\n display: none !important;\n}\n\n// Screenreader-only\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border-width: 0;\n}\n\n@each $media-query in map-keys($media-queries) {\n @for $i from 1 through length($spacers) {\n @include mq($media-query) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .d-sm-block, .d-md-none, .d-lg-inline\n .d-#{$media-query}-block {\n display: block !important;\n }\n .d-#{$media-query}-flex {\n display: flex !important;\n }\n .d-#{$media-query}-inline {\n display: inline !important;\n }\n .d-#{$media-query}-inline-block {\n display: inline-block !important;\n }\n .d-#{$media-query}-none {\n display: none !important;\n }\n }\n }\n}\n\n// Horizontal alignment\n\n.float-left {\n float: left !important;\n}\n\n.float-right {\n float: right !important;\n}\n\n.flex-justify-start {\n justify-content: flex-start !important;\n}\n\n.flex-justify-end {\n justify-content: flex-end !important;\n}\n\n.flex-justify-between {\n justify-content: space-between !important;\n}\n\n.flex-justify-around {\n justify-content: space-around !important;\n}\n\n// Vertical alignment\n\n.v-align-baseline {\n vertical-align: baseline !important;\n}\n\n.v-align-bottom {\n vertical-align: bottom !important;\n}\n\n.v-align-middle {\n vertical-align: middle !important;\n}\n\n.v-align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.v-align-text-top {\n vertical-align: text-top !important;\n}\n\n.v-align-top {\n vertical-align: top !important;\n}\n","// Utility classes for typography\n\n.fs-1 {\n @include fs-1;\n}\n\n.fs-2 {\n @include fs-2;\n}\n\n.fs-3 {\n @include fs-3;\n}\n\n.fs-4 {\n @include fs-4;\n}\n\n.fs-5 {\n @include fs-5;\n}\n\n.fs-6 {\n @include fs-6;\n}\n\n.fs-7 {\n @include fs-7;\n}\n\n.fs-8 {\n @include fs-8;\n}\n\n.fs-9 {\n @include fs-9;\n}\n\n.fs-10 {\n @include fs-10;\n}\n\n.fw-300 {\n font-weight: 300 !important;\n}\n\n.fw-400 {\n font-weight: 400 !important;\n}\n\n.fw-500 {\n font-weight: 500 !important;\n}\n\n.fw-700 {\n font-weight: 700 !important;\n}\n\n.lh-0 {\n line-height: 0 !important;\n}\n\n.lh-default {\n line-height: $body-line-height;\n}\n\n.lh-tight {\n line-height: $body-heading-line-height;\n}\n\n.ls-5 {\n letter-spacing: 0.05em !important;\n}\n\n.ls-10 {\n letter-spacing: 0.1em !important;\n}\n\n.ls-0 {\n letter-spacing: 0 !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n","// Utility classes for lists\n\n// stylelint-disable selector-max-type\n\n.list-style-none {\n padding: 0 !important;\n margin: 0 !important;\n list-style: none !important;\n\n li {\n &::before {\n display: none !important;\n }\n }\n}\n","// Utility classes for margins and padding\n\n// stylelint-disable block-opening-brace-space-after, block-opening-brace-space-before\n\n// Margin spacer utilities\n\n.mx-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n}\n\n@for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .m-0, .m-1, .m-2...\n .m-#{$scale} {\n margin: #{$size} !important;\n }\n .mt-#{$scale} {\n margin-top: #{$size} !important;\n }\n .mr-#{$scale} {\n margin-right: #{$size} !important;\n }\n .mb-#{$scale} {\n margin-bottom: #{$size} !important;\n }\n .ml-#{$scale} {\n margin-left: #{$size} !important;\n }\n\n .mx-#{$scale} {\n margin-right: #{$size} !important;\n margin-left: #{$size} !important;\n }\n\n .my-#{$scale} {\n margin-top: #{$size} !important;\n margin-bottom: #{$size} !important;\n }\n\n .mxn-#{$scale} {\n margin-right: -#{$size} !important;\n margin-left: -#{$size} !important;\n }\n .mx-#{$scale}-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n}\n\n@each $media-query in map-keys($media-queries) {\n @for $i from 1 through length($spacers) {\n @include mq($media-query) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .m-sm-0, .m-md-1, .m-lg-2...\n .m-#{$media-query}-#{$scale} {\n margin: #{$size} !important;\n }\n .mt-#{$media-query}-#{$scale} {\n margin-top: #{$size} !important;\n }\n .mr-#{$media-query}-#{$scale} {\n margin-right: #{$size} !important;\n }\n .mb-#{$media-query}-#{$scale} {\n margin-bottom: #{$size} !important;\n }\n .ml-#{$media-query}-#{$scale} {\n margin-left: #{$size} !important;\n }\n\n .mx-#{$media-query}-#{$scale} {\n margin-right: #{$size} !important;\n margin-left: #{$size} !important;\n }\n\n .my-#{$media-query}-#{$scale} {\n margin-top: #{$size} !important;\n margin-bottom: #{$size} !important;\n }\n\n .mxn-#{$media-query}-#{$scale} {\n margin-right: -#{$size} !important;\n margin-left: -#{$size} !important;\n }\n }\n }\n}\n\n// Padding spacer utilities\n\n@for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .p-0, .p-1, .p-2...\n .p-#{$scale} {\n padding: #{$size} !important;\n }\n .pt-#{$scale} {\n padding-top: #{$size} !important;\n }\n .pr-#{$scale} {\n padding-right: #{$size} !important;\n }\n .pb-#{$scale} {\n padding-bottom: #{$size} !important;\n }\n .pl-#{$scale} {\n padding-left: #{$size} !important;\n }\n\n .px-#{$scale} {\n padding-right: #{$size} !important;\n padding-left: #{$size} !important;\n }\n\n .py-#{$scale} {\n padding-top: #{$size} !important;\n padding-bottom: #{$size} !important;\n }\n}\n\n@each $media-query in map-keys($media-queries) {\n @include mq($media-query) {\n @for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .p-sm-0, .p-md-1, .p-lg-2...\n .p-#{$media-query}-#{$scale} {\n padding: #{$size} !important;\n }\n .pt-#{$media-query}-#{$scale} {\n padding-top: #{$size} !important;\n }\n .pr-#{$media-query}-#{$scale} {\n padding-right: #{$size} !important;\n }\n .pb-#{$media-query}-#{$scale} {\n padding-bottom: #{$size} !important;\n }\n .pl-#{$media-query}-#{$scale} {\n padding-left: #{$size} !important;\n }\n\n .px-#{$media-query}-#{$scale} {\n padding-right: #{$size} !important;\n padding-left: #{$size} !important;\n }\n\n .py-#{$media-query}-#{$scale} {\n padding-top: #{$size} !important;\n padding-bottom: #{$size} !important;\n }\n }\n }\n}\n","// stylelint-disable selector-max-specificity, selector-max-id, selector-max-type, selector-no-qualifying-type\n\n@media print {\n .site-footer,\n .site-button,\n #edit-this-page,\n #back-to-top,\n .site-nav,\n .main-header {\n display: none !important;\n }\n\n hr {\n margin-top: 1rem;\n margin-bottom: 1rem;\n }\n\n .side-bar {\n width: 100%;\n height: auto;\n border-right: 0 !important;\n }\n\n .site-header {\n border-bottom: 1px solid $border-color;\n }\n\n .site-title {\n font-size: 1rem !important;\n font-weight: 700 !important;\n }\n\n .text-small {\n font-size: 8pt !important;\n }\n\n pre.highlight {\n border: 1px solid $border-color;\n }\n\n .main {\n max-width: none;\n margin-left: 0;\n }\n}\n","// Skipnav\n// Skip to main content\n\na.skip-to-main {\n left: -999px;\n position: absolute;\n top: auto;\n width: 1px;\n height: 1px;\n overflow: hidden;\n z-index: -999;\n}\n\na.skip-to-main:focus,\na.skip-to-main:active {\n color: $link-color;\n background-color: $body-background-color;\n left: auto;\n top: auto;\n width: 30%;\n height: auto;\n overflow: auto;\n margin: 10px 35%;\n padding: 5px;\n border-radius: 15px;\n border: 4px solid $btn-primary-color;\n text-align: center;\n font-size: 1.2em;\n z-index: 999;\n}\n","\n@import \"./support/support\";\n@import \"./custom/setup\";\n@import \"./color_schemes/light\";\n\n@import \"./color_schemes/meshtastic-dark\";\n\n@import \"./modules\";\ndiv.opaque {\n background-color: $body-background-color;\n}\n\np.tip, blockquote.tip {\n border: 1px $green-000 solid;\n border-left: $border-radius solid $green-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $green-300;\n content: \"Tip\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .tip-title {\n color: $green-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.tip-title, blockquote.tip-title {\n border: 1px $green-000 solid;\n border-left: $border-radius solid $green-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $green-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.tip {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.tip-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n\np.note, blockquote.note {\n border: 1px $blue-000 solid;\n border-left: $border-radius solid $blue-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $blue-300;\n content: \"Note\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .note-title {\n color: $blue-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.note-title, blockquote.note-title {\n border: 1px $blue-000 solid;\n border-left: $border-radius solid $blue-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $blue-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.note {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.note-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n\np.warning, blockquote.warning {\n border: 1px $yellow-000 solid;\n border-left: $border-radius solid $yellow-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $yellow-300;\n content: \"Warning\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .warning-title {\n color: $yellow-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.warning-title, blockquote.warning-title {\n border: 1px $yellow-000 solid;\n border-left: $border-radius solid $yellow-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $yellow-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.warning {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.warning-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n@import \"./custom/custom\";\n\n\n"],"file":"just-the-docs-meshtastic-dark.css"} \ No newline at end of file +{"version":3,"sourceRoot":"","sources":["../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/vendor/accessible-pygments/github-light.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/vendor/normalize.scss/normalize.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/base.scss","../../_sass/color_schemes/meshtastic-dark.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/support/mixins/_typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/support/mixins/_layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/support/_variables.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/content.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/navigation.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/labels.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/buttons.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/support/mixins/_buttons.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/search.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/tables.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/code.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/utilities/_colors.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/utilities/_layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/utilities/_typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/utilities/_lists.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/utilities/_spacing.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/print.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/skiptomain.scss","just-the-docs-meshtastic-dark.scss"],"names":[],"mappings":";AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA;EAAkB;;;AAClB;EAAgB;EAAiB;AACjC;EAAkB;EAAiB;AACnC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAkB;EAAiB;AACnC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAqB;AACtC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAoB;AACrC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAgB;EAAiB;AACjC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AChFlC;AAEA;AAAA;AAGA;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAAA;AAKA;EACE;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;EAEE;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;AAAA;EAGE;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;EAEE;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAAA;AAKA;AAAA;AAAA;AAAA;AAAA;EAKE;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;AAEE;EACA;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;AAEE;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;EAIE;;;AAGF;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;EAIE;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;EAIE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;EAEE;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;EAEE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AC1VF;EACE,cCGa;;;ADAf;EACE;;;AAGF;EACE;;AEmBA;EACE;;AClBA;EHHJ;IEyBI;;;;AFnBJ;EACE,aIfiB;EJgBjB;EACA,aIbiB;EJcjB,OCTgB;EDUhB,kBCZsB;EDatB;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAYE;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;EACA;EACA;EACA,aI1CyB;EJ2CzB,OCvCmB;;;AD0CrB;EACE;EACA;;;AAGF;EACE,OC7CW;ED8CX;;;AAGF;EACE;EACA,uBCvCa;EDwCb;;AAEA;EACE;;;AAIJ;EACE,aIvEiB;EJwEjB;EACA,aIvEiB;;;AJ0EnB;AAAA;EAEE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA,kBCvEa;EDwEb;;;AAIF;EACE;EAGA;EACA;EACA;EACA;;;AK7GF;EACE;EACA;EACA;EACA,kBJKc;;AEGZ;EEZJ;IAOI;IACA;IACA,ODwFW;ICvFX;IACA;IACA;;;AFAA;EEZJ;IAgBI;IACA,WD+EQ;;;ADpFR;EEQF;IAEI,aD2ES;;;ADrFX;EEQF;IAQI;;;AAOF;EACE;EACA,kBJ5BU;;AEGZ;EEuBA;IAKI;IACA,kBJjCgB;;;AIoClB;EACE;;AFjCJ;EEgCE;IAII;;;;AAOV;EACE;;AF5CE;EE2CJ;IAII;IACA,WDyCY;;;;ACrChB;EACE,aDaK;ECZL,gBDYK;EDvDL,eCuDK;EDtDL,cCsDK;;ADlEH;EEoDJ;IFrCI,eCqDG;IDpDH,cCoDG;;;ADpEH;EEoDJ;IAOI,aDSG;ICRH,gBDQG;;;;ACJP;EACE;EACA;;AFlEE;EEgEJ;IAKI;IACA;IACA,QDmBY;;;;ACfhB;AAAA;AAAA;EAGE;;AF9EE;EE2EJ;AAAA;AAAA;IAMI,ODGQ;;;;ACCZ;EACE;;AAEA;EACE;;AFzFA;EEqFJ;IAQI;IACA,aDxBG;ICyBH,gBD7BG;IC8BH;IACA;;;;AAIJ;EACE;EACA,YDbc;ECcd;;AFxGE;EEqGJ;IAMI,QDjBY;ICkBZ,YDlBY;ICmBZ;;;;AAIJ;EACE;EACA;EACA;EACA;EACA,aDrDK;ECsDL,gBDtDK;ECuDL,OJzHmB;EEYnB,eCuDK;EDtDL,cCsDK;;ADlEH;EEiHJ;IFlGI,eCqDG;IDpDH,cCoDG;;;AF/BL;EACE;;ACtCA;EEiHJ;IHvEI;IACA,aEhDuB;;;ADKvB;EEiHJ;IAcI,aD/DG;ICgEH,gBDhEG;;;;AC+EP;EACE;EACA;EACA,SDhFK;ECiFL;;;AFnJE;EEuJF;IACE;;;AAIJ;EACE;;;AAQF;EACE;;;AAOF;EACE;EACA;EACA;EACA,aD/GK;ECgHL,gBDhHK;EDvDL,eCuDK;EDtDL,cCsDK;;ADlEH;EE6KJ;IF9JI,eCqDG;IDpDH,cCoDG;;;AFvEL;EACE;;ACEA;EE6KJ;IH3KI;;;ACFA;EE6KJ;IAYI;IACA;;;;AAIJ;EACE,OD5HK;EC6HL,QD7HK;EC8HL,OJ/LW;;;AKXb;EACE,aFEoB;;AEApB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;;AAGF;EACE;EACA;;AAGF;AAAA;EAEE;;AAIA;EACE,YF+CC;;AE3CL;EACE;EACA;;AAEA;EACE;;AAEA;EACE;EACA;EACA;EACA,OFfM;EEgBN;EACA;;AJ1BN;EACE;;ACRA;EG2BE;IJfF;;;ACZA;EG2BE;IAUI;;;AAIJ;EACE;;AAGE;EACE;EACA;;AAOV;EACE;;AAGE;EACE;EACA;EACA,OF7CM;EE8CN;;AAMJ;EACE;;AAIJ;EACE;EACA;;AAKF;EACE;;AAGF;EACE;;AAGF;EACE;EACA;;AAGF;AAAA;EAEE;;AAGF;EACE;EACA;EACA;;AAEA;EACE;;AAIJ;EACE;EACA;EACA;;AAmBE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;;AASF;AAAA;AAAA;AAAA;AAAA;AAAA;EAEE;;AAKN;EACE;EACA;EACA,OFnFG;EEoFH;EACA,eFzFG;EE0FH,cF1FG;EE2FH;;AH1JA;EGmJF;IAUI;IACA;;;AAGF;EACE;EACA;EACA;EACA,OLnKO;EKoKP;;AAYF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;;AAIJ;EACE;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;EACA;EACA;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAKE;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;;AAIJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAWE,YF9JG;;;AG3EP;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;ALoBF;EACE;;AClBA;EILF;IL2BE;;;ACtBA;EDOF;IACE;;;ACRA;EILF;ILiBE;;;AKPA;EACE;EACA,YH+DC;EG9DD,aHuDC;EGtDD,gBHsDC;EGrDD;EAEE,eH0DD;EGzDC,cHqDD;;ADlEH;EIKA;IAeI,YHgDD;IG/CC;IAEE,eH6CH;IG5CG,cH4CH;;;AGrCD;EACE,OHkCD;EGjCC,QHiCD;EGhCC;;AAGF;EACE;EACA;;AAGF;EAEE;EACA;;AASJ;EACE;EAEE;EAGF,OHUC;EGTD,QHSC;EGRD;EACA,ON7DO;;AEFT;EIsDA;IAYI,OHED;IGDC,QHCD;IGAC;;;AAGF;EACE;;AAQA;EACE;;AAKN;EACE;EACA,cHvBC;EGwBD;;AAEA;EACE;;AAEA;EACE,ONzFa;;AM4Ff;EACE,ON7Fa;;AMmGjB;EAEI;;AAMJ;EACE;;;AAMR;EACE;EACA;EACA;EACA;EACA;;ALhIA;EACE;;ACEA;EIwHJ;ILtHI;;;ACFA;EIwHJ;IASI;IACA,YHhEG;IGiEH;;EAEA;IACE;;;;AAMJ;EACE;;AAEA;EACE;;AAGE;EACE,ONlJG;;AMqJL;EACE,ONtJG;;;AM+Jb;EACE;EACA;;ALtKA;EACE;;ACEA;EIiKJ;IL/JI;;;AKoKF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AJlLA;EIiKJ;IAqBI,eHpHG;;;;ADlEH;EI4LJ;IAEI;;;;AAIJ;EACE;EACA,eHnIK;EGoIL;;;AAGF;EACE;;AL5MA;EACE;;ACEA;EIwMJ;ILtMI;;;AK0MF;EACE;;AAGF;EACE;EACA,cHlJG;EGmJH,aHnJG;EGoJH,OHpMU;EGqMV;;AAIA;EACE;;;ACrON;AAAA;EAEE;;ANoEA;AAAA;EACE;EACA,aElEuB;;ADKvB;EKXJ;AAAA;IN4EI;;;;AA5BF;AAAA;AAAA;EACE;;ACtCA;EKJJ;AAAA;AAAA;IN8CI;IACA,aEhDuB;;;;AFgCzB;AAAA;EACE;;AC5BA;EKEJ;AAAA;IN8BI;;;;AMzBJ;AAAA;EAEE;EACA;EACA;;ANdA;AAAA;EACE;;ACEA;EKOJ;AAAA;INLI;;;;AMcJ;EACE;;;ANVA;AAAA;EACE;;ACRA;EKoBJ;AAAA;INRI;;;;AAfF;AAAA;EACE;;ACEA;EKyBJ;AAAA;INvBI;;;;AALF;EACE;;ACEA;EK8BJ;IN5BI;;;;AMgCJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;ACvDF;AAAA;EAEE;EACA;EACA,cLoEK;EKnEL,aLmEK;EKlEL,OLiBM;EKhBN;EACA;EACA,kBL6BS;EK5BT;;APLA;AAAA;EACE;;ACEA;EMRJ;AAAA;IPUI;;;;AOKJ;EACE,kBL4BU;;;AKzBZ;EACE,kBLcW;;;AKXb;EACE,kBL4BQ;;;AKzBV;EACE,OLFY;EKGZ,kBLkBW;;;AMlDb;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,OTIW;ESHX;EACA;EACA;EACA,kBTiBkB;EShBlB;EACA,eNyEc;EMxEd,YACE;EAEF;;AAEA;EACE;EACA;EACA;;AAGF;EAEE;;AAGF;EAEE;;AAGF;EAIE;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;AAKA;EAEE;EACA;EACA;EACA;EACA;;;AAKN;EACE,OT1DW;ES2DX;EACA;;AAEA;EAIE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA,YACE;;AAIJ;EAEE;;;AAIJ;ECnGE,OP0BM;EOzBN;EACA;EACA,YACE;;AAGF;EAEE,OPiBI;EOhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;ADgFJ;ECvGE,OP0BM;EOzBN;EACA;EACA,YACE;;AAGF;EAEE,OPiBI;EOhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;ADoFJ;EC3GE,OP0BM;EOzBN;EACA;EACA,YACE;;AAGF;EAEE,OPiBI;EOhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;ADwFJ;EC/GE,OP0BM;EOzBN;EACA;EACA,YACE;;AAGF;EAEE,OPiBI;EOhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;AD4FJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AE3HF;EACE;EACA;EACA;EACA,QRgFM;EQ/EN,SRuEK;EQtEL;;ATME;ESZJ;IASI;IACA;IACA;IACA;IACA;;;;AAIJ;EACE;EACA;EACA,QR8DK;EQ7DL;EACA,eRmEc;EQlEd,YACE;EAEF;;ATdE;ESKJ;IAYI;IACA;IACA,WRwEmB;IQvEnB;IACA;IACA;IACA;;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA,OXnCgB;EWoChB,kBXTwB;EWUxB;EACA;EACA;EACA;EACA;;ATvCE;ES2BJ;IAeI;IACA;IACA,kBXhDoB;IWiDpB;;;AAGF;EACE;EACA;;AAEA;EACE,OXnDO;;;AWwDb;EACE;EACA;EACA;EACA,cRIK;;ADlEH;ES0DJ;IAOI,cRGG;IQFH;;;AAGF;EACE;EACA;EACA;EACA,ORzDU;;;AQ6Dd;EACE;EACA;EACA;EACA;EACA;EACA;EACA,kBX3DwB;EW4DxB,4BRRc;EQSd,2BRTc;EQUd,YACE;;ATxFA;ES6EJ;IAeI;IACA,ORFmB;IQGnB;;;;AAIJ;EACE;EACA,eRrCK;EQsCL;;AVpFA;EACE;;AClBA;ESkGJ;IV5EI;;;ACtBA;EDOF;IACE;;;ACRA;ESkGJ;IVtFI;;;;AUiGJ;EACE;EACA;;;AAGF;EACE;EACA;;AAEA;EAEE,kBXlGa;;;AWsGjB;EACE;EACA,aR9DK;EQ+DL,gBR/DK;;ADhEH;ES4HJ;IAMI;IACA;IACA,eRpEG;IQqEH;;;;AAIJ;EACE;EACA;EACA;;AAEA;EACE;;AVxIF;EACE;;ACRA;ES8IF;IVlIE;;;ACZA;EDHF;IACE;;;ACEA;ES8IF;IV5IE;;;AUqJF;EACE,ORtFG;EQuFH,QRvFG;EQwFH,cR1FG;EQ2FH,OXzJS;EW0JT;;AAGF;EACE;;;AAIJ;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA,OXtK4B;EWuK5B;EACA;;AV5LA;EACE;;ACYA;ESyKJ;IVjLI;;;;AU2LJ;EACE;EACA,aRrHK;EQsHL,gBRtHK;EQuHL,cRrHK;EQsHL,aRxHK;EQyHL,OXlL4B;EWmL5B;EACA,aR/GO;EQgHP,mBX9Ka;;ACjBb;EACE;;ACEA;ESmLJ;IVjLI;;;ACFA;ESmLJ;IAaI;IACA;IACA,cRlIG;IQmIH;IACA;;;;AAIJ;EACE,YR1IK;;;AQ6IP;EACE;;;AAGF;EACE;;AV1MA;EACE;;ACRA;ESgNJ;IVpMI;;;;AUyMJ;EACE;EACA,ORrJK;EQsJL,QRtJK;EQuJL;EACA,ORnJK;EQoJL,QRpJK;EQqJL,kBXnMwB;EWoMxB;EACA;EACA,YACE;EAEF;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YACE;;;AAMF;EACE;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE,QRxLI;EQyLJ;;ATjQA;ES+PF;IAKI,ORzKiB;IQ0KjB,YACE;;;AAKN;EACE,kBXnPsB;;AEzBtB;ES2QF;IAII;;;AT/QF;ESmRF;IAEI;;;AAIJ;EACE;;AAGF;EACE;EACA;EACA;EACA,YACE;;ATlSF;ESwSA;IACE;IACA;IACA;;;AAIJ;EACE,aRxOI;;ADxEJ;ES+SF;IAII;;;;AC9TN;EACE;EACA;EACA;EACA,eT0EK;ESzEL;EACA,eTkFc;ESjFd,YACE;;;AAIJ;EACE;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA,kBZIuB;EYHvB;EACA;;AXNA;AAAA;EACE;;ACRA;EUOJ;AAAA;IXKI;;;AWKF;AAAA;EACE;;;AAOE;AAAA;EAEE;;AAGF;EACE,gBTkCD;;;AS3BL;EACE;;;AC9CF;EACE;EACA;EACA,kBbcoB;EabpB;EACA,eV+EY;;;AU1EhB;EACE,cbUa;;;AayCf;AAAA;AAAA;EAGE;EACA,eVMK;EULL,kBblDsB;EamDtB,eVgBc;EUfd;EACA;EACA;EACA;;AAIA;AAAA;AAAA;EACE,OVLG;EUMH;EACA;EACA;EACA;EACA,SVVG;EUWH;EACA;EACA,ObhFc;EaiFd;;AAEA;AAAA;AAAA;EACE,MbpFY;;AauFd;AAAA;AAAA;EACE;EACA;EACA;;AAGF;AAAA;AAAA;EACE;EACA;;AAMF;AAAA;AAAA;EACE;EACA;;;AASJ;EACE;EACA,SV/CG;EUgDH;EACA;EACA,eVtCY;;AUyCd;AAAA;EAEE;EACA;EACA;;;AAUJ;EACE;EACA,eVrEK;;AU6CL;EACE;EACA,SV/CG;EUgDH;EACA;EACA,eVtCY;;AUyCd;AAAA;EAEE;EACA;EACA;;;AAwBF;AAAA;EAEE;EACA,SVpFG;EUqFH;EACA;EACA,eV3EY;;;AUmFhB;EACE;EACA;EACA;EACA;;AAEA;AAAA;EAEE;EACA;EACA,kBbhKoB;EaiKpB;;AZ9KF;AAAA;EACE;;ACEA;EWsKF;AAAA;IZpKE;;;AY8KF;EACE;EACA,eVjHG;EUkHH,cVlHG;;AUqHL;EACE;EACA;;;AAKJ;AAAA;EAEE,SV9HK;EU+HL,eV/HK;EUgIL;EACA;EACA,eVtHc;;AUwHd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAIE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAKJ;EACE;EACA;EACA;;;AAIF;AAAA;EAEE,YbnNsB;EasNpB,ObrNoB;;;Aa4NxB;EACE,Yb9NsB;;;AcpBxB;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;ACvOF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AbrBE;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ab5CJ;Ea+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;AAQR;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AdhHA;EACE;;ACYA;EcZJ;IfII;;;;AAKF;EACE;;ACEA;EcRJ;IfUI;;;;AAKF;EACE;;ACRA;EcJJ;IfgBI;;;;AAKF;EACE;;AClBA;EcAJ;IfsBI;;;;AAKF;EACE;;AC5BA;EcIJ;If4BI;;;;AAKF;EACE;;ACtCA;EcQJ;IfkCI;IACA,aEhDuB;;;;AFqDzB;EACE;EACA,aEvDuB;;ADKvB;EcYJ;If0CI;;;;AAKF;EACE;EACA,aElEuB;;ADKvB;EcgBJ;IfiDI;;;;AAKF;EACE;EACA,aE7EuB;;ADKvB;EcoBJ;IfwDI;;;;AAKF;EACE;EACA,aExFuB;;ADKvB;EcwBJ;If+DI;;;;Ae3DJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE,abxDiB;;;Aa2DnB;EACE,ab1DyB;;;Aa6D3B;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AC/EF;EACE;EACA;EACA;;AAGE;EACE;;;ACLN;EACE;EACA;;;AAQA;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AhBlCA;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhBzEJ;EgB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAaN;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AhB7GA;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AhB/IJ;EgBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AC3JR;EACE;AAAA;AAAA;AAAA;AAAA;AAAA;IAME;;EAGF;IACE;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;IACA;;;ACvCJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE,OpBCW;EoBAX,kBpBNsB;EoBOtB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ACpBF;EACE,kBrBCsB;;;AqBExB;EACI;EACA;EACA,elB4EY;EkB3EZ;EACA;;AAEA;EACI,OlB8BI;EkB7BJ;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OlBoBM;EkBnBN;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,elBiDY;EkBhDZ;EACA;;AACA;EACE;EACA;EACA,OlBEM;EkBDN;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAMJ;EACI;EACA;EACA,elBGY;EkBFZ;EACA;;AAEA;EACI,OlB/CG;EkBgDH;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OlBzDK;EkB0DL;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,elBxBY;EkByBZ;EACA;;AACA;EACE;EACA;EACA,OlB3EK;EkB4EL;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAMJ;EACI;EACA;EACA,elBtEY;EkBuEZ;EACA;;AAEA;EACI,OlBhHK;EkBiHL;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OlB1HO;EkB2HP;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,elBjGY;EkBkGZ;EACA;;AACA;EACE;EACA;EACA,OlB5IO;EkB6IP;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE","sourcesContent":["/*\ngenerated by accessible-pygments \nCopyright (c) 2022, Quansight Labs\nLicensed under the BSD license, see LICENSE for details.\n--\ngenerated by Pygments \nCopyright 2006-2025 by the Pygments team.\nLicensed under the BSD license, see LICENSE for details.\n*/\n\n.highlight .hll { background-color: #0969da4a }\n.highlight .c { color: #6E7781 } /* Comment */\n.highlight .err { color: #CF222E } /* Error */\n.highlight .k { color: #CF222E } /* Keyword */\n.highlight .l { color: #953800 } /* Literal */\n.highlight .n { color: #8250DF } /* Name */\n.highlight .o { color: #116329 } /* Operator */\n.highlight .p { color: #24292F } /* Punctuation */\n.highlight .ch { color: #6E7781 } /* Comment.Hashbang */\n.highlight .cm { color: #6E7781 } /* Comment.Multiline */\n.highlight .cp { color: #6E7781 } /* Comment.Preproc */\n.highlight .cpf { color: #6E7781 } /* Comment.PreprocFile */\n.highlight .c1 { color: #6E7781 } /* Comment.Single */\n.highlight .cs { color: #6E7781 } /* Comment.Special */\n.highlight .gd { color: #0550AE } /* Generic.Deleted */\n.highlight .ge { font-style: italic } /* Generic.Emph */\n.highlight .gr { color: #CF222E } /* Generic.Error */\n.highlight .gh { color: #0550AE } /* Generic.Heading */\n.highlight .gs { font-weight: bold } /* Generic.Strong */\n.highlight .gu { color: #0550AE } /* Generic.Subheading */\n.highlight .kc { color: #0550AE } /* Keyword.Constant */\n.highlight .kd { color: #CF222E } /* Keyword.Declaration */\n.highlight .kn { color: #CF222E } /* Keyword.Namespace */\n.highlight .kp { color: #CF222E } /* Keyword.Pseudo */\n.highlight .kr { color: #CF222E } /* Keyword.Reserved */\n.highlight .kt { color: #CF222E } /* Keyword.Type */\n.highlight .ld { color: #953800 } /* Literal.Date */\n.highlight .m { color: #953800 } /* Literal.Number */\n.highlight .s { color: #0550AE } /* Literal.String */\n.highlight .na { color: #953800 } /* Name.Attribute */\n.highlight .nb { color: #953800 } /* Name.Builtin */\n.highlight .nc { color: #0550AE } /* Name.Class */\n.highlight .no { color: #0550AE } /* Name.Constant */\n.highlight .nd { color: #953800 } /* Name.Decorator */\n.highlight .ni { color: #116329 } /* Name.Entity */\n.highlight .ne { color: #8250DF } /* Name.Exception */\n.highlight .nf { color: #0550AE } /* Name.Function */\n.highlight .nl { color: #953800 } /* Name.Label */\n.highlight .nn { color: #24292F } /* Name.Namespace */\n.highlight .nx { color: #8250DF } /* Name.Other */\n.highlight .py { color: #0550AE } /* Name.Property */\n.highlight .nt { color: #116329 } /* Name.Tag */\n.highlight .nv { color: #953800 } /* Name.Variable */\n.highlight .ow { color: #8250DF } /* Operator.Word */\n.highlight .pm { color: #24292F } /* Punctuation.Marker */\n.highlight .w { color: #24292F } /* Text.Whitespace */\n.highlight .mb { color: #953800 } /* Literal.Number.Bin */\n.highlight .mf { color: #953800 } /* Literal.Number.Float */\n.highlight .mh { color: #953800 } /* Literal.Number.Hex */\n.highlight .mi { color: #953800 } /* Literal.Number.Integer */\n.highlight .mo { color: #953800 } /* Literal.Number.Oct */\n.highlight .sa { color: #0550AE } /* Literal.String.Affix */\n.highlight .sb { color: #0550AE } /* Literal.String.Backtick */\n.highlight .sc { color: #0550AE } /* Literal.String.Char */\n.highlight .dl { color: #0550AE } /* Literal.String.Delimiter */\n.highlight .sd { color: #0550AE } /* Literal.String.Doc */\n.highlight .s2 { color: #0550AE } /* Literal.String.Double */\n.highlight .se { color: #0550AE } /* Literal.String.Escape */\n.highlight .sh { color: #0550AE } /* Literal.String.Heredoc */\n.highlight .si { color: #0550AE } /* Literal.String.Interpol */\n.highlight .sx { color: #0550AE } /* Literal.String.Other */\n.highlight .sr { color: #0550AE } /* Literal.String.Regex */\n.highlight .s1 { color: #0550AE } /* Literal.String.Single */\n.highlight .ss { color: #0550AE } /* Literal.String.Symbol */\n.highlight .bp { color: #953800 } /* Name.Builtin.Pseudo */\n.highlight .fm { color: #0550AE } /* Name.Function.Magic */\n.highlight .vc { color: #953800 } /* Name.Variable.Class */\n.highlight .vg { color: #953800 } /* Name.Variable.Global */\n.highlight .vi { color: #953800 } /* Name.Variable.Instance */\n.highlight .vm { color: #953800 } /* Name.Variable.Magic */\n.highlight .il { color: #953800 } /* Literal.Number.Integer.Long */\n","/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */\n\n/* Document\n ========================================================================== */\n\n/**\n * 1. Correct the line height in all browsers.\n * 2. Prevent adjustments of font size after orientation changes in iOS.\n */\n\nhtml {\n line-height: 1.15; /* 1 */\n text-size-adjust: 100%; /* 2 */\n}\n\n/* Sections\n ========================================================================== */\n\n/**\n * Remove the margin in all browsers.\n */\n\nbody {\n margin: 0;\n}\n\n/**\n * Render the `main` element consistently in IE.\n */\n\nmain {\n display: block;\n}\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n/* Grouping content\n ========================================================================== */\n\n/**\n * 1. Add the correct box sizing in Firefox.\n * 2. Show the overflow in Edge and IE.\n */\n\nhr {\n box-sizing: content-box; /* 1 */\n height: 0; /* 1 */\n overflow: visible; /* 2 */\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\npre {\n font-family: monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/* Text-level semantics\n ========================================================================== */\n\n/**\n * Remove the gray background on active links in IE 10.\n */\n\na {\n background-color: transparent;\n}\n\n/**\n * 1. Remove the bottom border in Chrome 57-\n * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n */\n\nabbr[title] {\n border-bottom: none; /* 1 */\n text-decoration: underline; /* 2 */\n text-decoration: underline dotted; /* 2 */\n}\n\n/**\n * Add the correct font weight in Chrome, Edge, and Safari.\n */\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\ncode,\nkbd,\nsamp {\n font-family: monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/**\n * Add the correct font size in all browsers.\n */\n\nsmall {\n font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` elements from affecting the line height in\n * all browsers.\n */\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/* Embedded content\n ========================================================================== */\n\n/**\n * Remove the border on images inside links in IE 10.\n */\n\nimg {\n border-style: none;\n}\n\n/* Forms\n ========================================================================== */\n\n/**\n * 1. Change the font styles in all browsers.\n * 2. Remove the margin in Firefox and Safari.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-size: 100%; /* 1 */\n line-height: 1.15; /* 1 */\n margin: 0; /* 2 */\n}\n\n/**\n * Show the overflow in IE.\n * 1. Show the overflow in Edge.\n */\n\nbutton,\ninput {\n /* 1 */\n overflow: visible;\n}\n\n/**\n * Remove the inheritance of text transform in Edge, Firefox, and IE.\n * 1. Remove the inheritance of text transform in Firefox.\n */\n\nbutton,\nselect {\n /* 1 */\n text-transform: none;\n}\n\n/**\n * Correct the inability to style clickable types in iOS and Safari.\n */\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n appearance: button;\n}\n\n/**\n * Remove the inner border and padding in Firefox.\n */\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n border-style: none;\n padding: 0;\n}\n\n/**\n * Restore the focus styles unset by the previous rule.\n */\n\nbutton:-moz-focusring,\n[type=\"button\"]:-moz-focusring,\n[type=\"reset\"]:-moz-focusring,\n[type=\"submit\"]:-moz-focusring {\n outline: 1px dotted ButtonText;\n}\n\n/**\n * Correct the padding in Firefox.\n */\n\nfieldset {\n padding: 0.35em 0.75em 0.625em;\n}\n\n/**\n * 1. Correct the text wrapping in Edge and IE.\n * 2. Correct the color inheritance from `fieldset` elements in IE.\n * 3. Remove the padding so developers are not caught out when they zero out\n * `fieldset` elements in all browsers.\n */\n\nlegend {\n box-sizing: border-box; /* 1 */\n color: inherit; /* 2 */\n display: table; /* 1 */\n max-width: 100%; /* 1 */\n padding: 0; /* 3 */\n white-space: normal; /* 1 */\n}\n\n/**\n * Add the correct vertical alignment in Chrome, Firefox, and Opera.\n */\n\nprogress {\n vertical-align: baseline;\n}\n\n/**\n * Remove the default vertical scrollbar in IE 10+.\n */\n\ntextarea {\n overflow: auto;\n}\n\n/**\n * 1. Add the correct box sizing in IE 10.\n * 2. Remove the padding in IE 10.\n */\n\n[type=\"checkbox\"],\n[type=\"radio\"] {\n box-sizing: border-box; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Correct the cursor style of increment and decrement buttons in Chrome.\n */\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n/**\n * 1. Correct the odd appearance in Chrome and Safari.\n * 2. Correct the outline style in Safari.\n */\n\n[type=\"search\"] {\n appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/**\n * Remove the inner padding in Chrome and Safari on macOS.\n */\n\n[type=\"search\"]::-webkit-search-decoration {\n appearance: none;\n}\n\n/**\n * 1. Correct the inability to style clickable types in iOS and Safari.\n * 2. Change font properties to `inherit` in Safari.\n */\n\n::-webkit-file-upload-button {\n appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/* Interactive\n ========================================================================== */\n\n/*\n * Add the correct display in Edge, IE 10+, and Firefox.\n */\n\ndetails {\n display: block;\n}\n\n/*\n * Add the correct display in all browsers.\n */\n\nsummary {\n display: list-item;\n}\n\n/* Misc\n ========================================================================== */\n\n/**\n * Add the correct display in IE 10+.\n */\n\ntemplate {\n display: none;\n}\n\n/**\n * Add the correct display in IE 10.\n */\n\n[hidden] {\n display: none;\n}\n","// Base element style overrides\n// stylelint-disable selector-no-type, selector-max-type, selector-max-specificity, selector-max-id\n\n:root {\n color-scheme: $color-scheme;\n}\n\n* {\n box-sizing: border-box;\n}\n\nhtml {\n scroll-behavior: smooth;\n\n @include fs-4;\n}\n\nbody {\n font-family: $body-font-family;\n font-size: inherit;\n line-height: $body-line-height;\n color: $body-text-color;\n background-color: $body-background-color;\n overflow-wrap: break-word;\n}\n\nol,\nul,\ndl,\npre,\naddress,\nblockquote,\ntable,\ndiv,\nhr,\nform,\nfieldset,\nnoscript .table-wrapper {\n margin-top: 0;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n#toctitle {\n margin-top: 0;\n margin-bottom: 1em;\n font-weight: 500;\n line-height: $body-heading-line-height;\n color: $body-heading-color;\n}\n\np {\n margin-top: 1em;\n margin-bottom: 1em;\n}\n\na {\n color: $link-color;\n text-decoration: none;\n}\n\na:not([class]) {\n text-decoration: underline;\n text-decoration-color: $border-color;\n text-underline-offset: 2px;\n\n &:hover {\n text-decoration-color: rgba($link-color, 0.45);\n }\n}\n\ncode {\n font-family: $mono-font-family;\n font-size: 0.75em;\n line-height: $body-line-height;\n}\n\nfigure,\npre {\n margin: 0;\n}\n\nli {\n margin: 0.25em 0;\n}\n\nimg {\n max-width: 100%;\n height: auto;\n}\n\nhr {\n height: 1px;\n padding: 0;\n margin: $sp-6 0;\n background-color: $border-color;\n border: 0;\n}\n\n// adds a GitHub-style sidebar to blockquotes\nblockquote {\n margin: 10px 0;\n\n // resets user-agent stylesheets for blockquotes\n margin-block-start: 0;\n margin-inline-start: 0;\n padding-left: 1rem;\n border-left: 3px solid $border-color;\n}\n","// Meshtastic Material 3 — Dark color scheme for just-the-docs\n// Source: core/ui/.../Color.kt §8.3 (Dark Scheme)\n//\n// Brand colors:\n// Primary (Dark): #67EA94 (Green 500)\n// Surface (Dark): #1A1B26 (Neutral 900)\n\n$color-scheme: dark;\n\n// Body / page background\n$body-background-color: #1A1B26; // Neutral 900 — surfaceDark\n$sidebar-color: #1A1B26; // Neutral 900\n$body-text-color: #ECEDF3; // Neutral 100 — onSurfaceDark\n$body-heading-color: #ECEDF3; // Neutral 100\n\n// Links\n$link-color: #67EA94; // Green 500 — primaryDark\n$nav-link-color: #67EA94; // Green 500\n\n// Navigation\n$nav-child-link-color: #B8BAC8; // Neutral 300 — secondaryDark\n$search-result-preview-color: #B8BAC8;\n\n// Code\n$code-background-color: #0F1017; // Neutral 950 — surfaceContainerLowestDark\n$code-linenumber-color: #9496A6; // Neutral 400\n\n// Borders\n$border-color: #3D3E50; // Neutral 700 — outlineVariantDark\n$table-background-color: #242533; // Interpolated — surfaceContainerDark\n\n// Buttons\n$btn-primary-color: #67EA94; // Green 500\n$base-button-color: #2C2D3C; // Neutral 800\n\n// Feedback / callouts\n$feedback-color: #242533; // surfaceContainerDark\n\n// Search\n$search-background-color: #242533; // surfaceContainerDark\n","@mixin fs-1 {\n & {\n font-size: $font-size-1 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-1-sm !important;\n }\n}\n\n@mixin fs-2 {\n & {\n font-size: $font-size-2 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-3 !important;\n }\n}\n\n@mixin fs-3 {\n & {\n font-size: $font-size-3 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-4 !important;\n }\n}\n\n@mixin fs-4 {\n & {\n font-size: $font-size-4 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-5 !important;\n }\n}\n\n@mixin fs-5 {\n & {\n font-size: $font-size-5 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-6 !important;\n }\n}\n\n@mixin fs-6 {\n & {\n font-size: $font-size-6 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-7 !important;\n line-height: $body-heading-line-height;\n }\n}\n\n@mixin fs-7 {\n & {\n font-size: $font-size-7 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-8 !important;\n }\n}\n\n@mixin fs-8 {\n & {\n font-size: $font-size-8 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-9 !important;\n }\n}\n\n@mixin fs-9 {\n & {\n font-size: $font-size-9 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-10 !important;\n }\n}\n\n@mixin fs-10 {\n & {\n font-size: $font-size-10 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-10-sm !important;\n }\n}\n","// Media query\n\n// Media query mixin\n// Usage:\n// @include mq(md) {\n// ..medium and up styles\n// }\n@mixin mq($name) {\n // Retrieves the value from the key\n $value: map-get($media-queries, $name);\n\n // If the key exists in the map\n @if $value {\n // Prints a media query based on the value\n @media (min-width: $value) {\n @content;\n }\n } @else {\n @warn \"No value could be retrieved from `#{$media-query}`. Please make sure it is defined in `$media-queries` map.\";\n }\n}\n\n// Responsive container\n\n@mixin container {\n padding-right: $gutter-spacing-sm;\n padding-left: $gutter-spacing-sm;\n\n @include mq(md) {\n padding-right: $gutter-spacing;\n padding-left: $gutter-spacing;\n }\n}\n","// Typography\n\n// prettier-ignore\n$body-font-family: system-ui, -apple-system, blinkmacsystemfont, \"Segoe UI\",\n roboto, \"Helvetica Neue\", arial, sans-serif, \"Segoe UI Emoji\" !default;\n$mono-font-family: \"SFMono-Regular\", menlo, consolas, monospace !default;\n$root-font-size: 16px !default; // DEPRECATED: previously base font-size for rems\n$body-line-height: 1.4 !default;\n$content-line-height: 1.6 !default;\n$body-heading-line-height: 1.25 !default;\n\n// Font size\n// `-sm` suffix is the size at the small (and above) media query\n\n$font-size-1: 0.5625rem !default;\n$font-size-1-sm: 0.625rem !default;\n$font-size-2: 0.6875rem !default; // h4 - uppercased!, h6 not uppercased, text-small\n$font-size-3: 0.75rem !default; // h5\n$font-size-4: 0.875rem !default;\n$font-size-5: 1rem !default; // h3\n$font-size-6: 1.125rem !default; // h2\n$font-size-7: 1.5rem !default;\n$font-size-8: 2rem !default; // h1\n$font-size-9: 2.25rem !default;\n$font-size-10: 2.625rem !default;\n$font-size-10-sm: 3rem !default;\n\n// Colors\n\n$white: #fff !default;\n$grey-dk-000: #959396 !default;\n$grey-dk-100: #5c5962 !default;\n$grey-dk-200: #44434d !default;\n$grey-dk-250: #302d36 !default;\n$grey-dk-300: #27262b !default;\n$grey-lt-000: #f5f6fa !default;\n$grey-lt-100: #eeebee !default;\n$grey-lt-200: #ecebed !default;\n$grey-lt-300: #e6e1e8 !default;\n$purple-000: #7253ed !default;\n$purple-100: #5e41d0 !default;\n$purple-200: #4e26af !default;\n$purple-300: #381885 !default;\n$blue-000: #2c84fa !default;\n$blue-100: #2869e6 !default;\n$blue-200: #264caf !default;\n$blue-300: #183385 !default;\n$green-000: #41d693 !default;\n$green-100: #11b584 !default;\n$green-200: #009c7b !default;\n$green-300: #026e57 !default;\n$yellow-000: #ffeb82 !default;\n$yellow-100: #fadf50 !default;\n$yellow-200: #f7d12e !default;\n$yellow-300: #e7af06 !default;\n$red-000: #f77e7e !default;\n$red-100: #f96e65 !default;\n$red-200: #e94c4c !default;\n$red-300: #dd2e2e !default;\n\n// Spacing\n\n$spacing-unit: 1rem; // 1rem == 16px\n\n$spacers: (\n sp-0: 0,\n sp-1: $spacing-unit * 0.25,\n sp-2: $spacing-unit * 0.5,\n sp-3: $spacing-unit * 0.75,\n sp-4: $spacing-unit,\n sp-5: $spacing-unit * 1.5,\n sp-6: $spacing-unit * 2,\n sp-7: $spacing-unit * 2.5,\n sp-8: $spacing-unit * 3,\n sp-9: $spacing-unit * 3.5,\n sp-10: $spacing-unit * 4,\n) !default;\n$sp-1: map-get($spacers, sp-1) !default; // 0.25 rem == 4px\n$sp-2: map-get($spacers, sp-2) !default; // 0.5 rem == 8px\n$sp-3: map-get($spacers, sp-3) !default; // 0.75 rem == 12px\n$sp-4: map-get($spacers, sp-4) !default; // 1 rem == 16px\n$sp-5: map-get($spacers, sp-5) !default; // 1.5 rem == 24px\n$sp-6: map-get($spacers, sp-6) !default; // 2 rem == 32px\n$sp-7: map-get($spacers, sp-7) !default; // 2.5 rem == 40px\n$sp-8: map-get($spacers, sp-8) !default; // 3 rem == 48px\n$sp-9: map-get($spacers, sp-9) !default; // 3.5 rem == 56px\n$sp-10: map-get($spacers, sp-10) !default; // 4 rem == 64px\n\n// Borders\n\n$border: 1px solid !default;\n$border-radius: 4px !default;\n$border-color: $grey-lt-100 !default;\n\n// Grid system\n\n$gutter-spacing: $sp-6 !default;\n$gutter-spacing-sm: $sp-4 !default;\n$nav-width: 16.5rem !default;\n$nav-width-md: 15.5rem !default;\n$nav-list-item-height: $sp-6 !default;\n$nav-list-item-height-sm: $sp-8 !default;\n$nav-list-expander-right: true;\n$content-width: 50rem !default;\n$header-height: 3.75rem !default;\n$search-results-width: $content-width - $nav-width !default;\n$transition-duration: 400ms;\n\n// Media queries in pixels\n\n$media-queries: (\n xs: 20rem,\n sm: 31.25rem,\n md: $content-width,\n lg: $content-width + $nav-width,\n xl: 87.5rem,\n) !default;\n","// The basic two column layout\n\n.side-bar {\n z-index: 0;\n display: flex;\n flex-wrap: wrap;\n background-color: $sidebar-color;\n\n @include mq(md) {\n flex-flow: column nowrap;\n position: fixed;\n width: $nav-width-md;\n height: 100%;\n border-right: $border $border-color;\n align-items: flex-end;\n }\n\n @include mq(lg) {\n width: calc((100% - #{$nav-width + $content-width}) / 2 + #{$nav-width});\n min-width: $nav-width;\n }\n\n & + .main {\n @include mq(md) {\n margin-left: $nav-width-md;\n }\n\n @include mq(lg) {\n // stylelint-disable function-name-case\n // disable for Max(), we want to use the CSS max() function\n margin-left: Max(\n #{$nav-width},\n calc((100% - #{$nav-width + $content-width}) / 2 + #{$nav-width})\n );\n // stylelint-enable function-name-case\n }\n\n .main-header {\n display: none;\n background-color: $sidebar-color;\n\n @include mq(md) {\n display: flex;\n background-color: $body-background-color;\n }\n\n &.nav-open {\n display: block;\n\n @include mq(md) {\n display: flex;\n }\n }\n }\n }\n}\n\n.main {\n margin: auto;\n\n @include mq(md) {\n position: relative;\n max-width: $content-width;\n }\n}\n\n.main-content-wrap {\n padding-top: $gutter-spacing-sm;\n padding-bottom: $gutter-spacing-sm;\n\n @include container;\n\n @include mq(md) {\n padding-top: $gutter-spacing;\n padding-bottom: $gutter-spacing;\n }\n}\n\n.main-header {\n z-index: 0;\n border-bottom: $border $border-color;\n\n @include mq(md) {\n display: flex;\n justify-content: space-between;\n height: $header-height;\n }\n}\n\n.site-nav,\n.site-header,\n.site-footer {\n width: 100%;\n\n @include mq(lg) {\n width: $nav-width;\n }\n}\n\n.site-nav {\n display: none;\n\n &.nav-open {\n display: block;\n }\n\n @include mq(md) {\n display: block;\n padding-top: $sp-8;\n padding-bottom: $gutter-spacing-sm;\n overflow-y: auto;\n flex: 1 1 auto;\n }\n}\n\n.site-header {\n display: flex;\n min-height: $header-height;\n align-items: center;\n\n @include mq(md) {\n height: $header-height;\n max-height: $header-height;\n border-bottom: $border $border-color;\n }\n}\n\n.site-title {\n flex-grow: 1;\n display: flex;\n height: 100%;\n align-items: center;\n padding-top: $sp-3;\n padding-bottom: $sp-3;\n color: $body-heading-color;\n\n @include container;\n\n @include fs-6;\n\n @include mq(md) {\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n }\n}\n\n@if variable-exists(logo) {\n .site-logo {\n width: 100%;\n height: 100%;\n background-image: url($logo);\n background-repeat: no-repeat;\n background-position: left center;\n background-size: contain;\n }\n}\n\n.site-button {\n display: flex;\n height: 100%;\n padding: $gutter-spacing-sm;\n align-items: center;\n}\n\n@include mq(md) {\n .site-header .site-button {\n display: none;\n }\n}\n\n.site-title:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 80%,\n rgba($feedback-color, 0) 100%\n );\n}\n\n.site-button:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 100%\n );\n}\n\n.site-footer {\n position: absolute;\n bottom: 0;\n left: 0;\n padding-top: $sp-4;\n padding-bottom: $sp-4;\n\n @include container;\n\n @include fs-2;\n\n @include mq(md) {\n position: static;\n justify-self: end;\n }\n}\n\n.icon {\n width: $sp-5;\n height: $sp-5;\n color: $link-color;\n}\n","@charset \"UTF-8\";\n\n// Styles for rendered markdown in the .main-content container\n// stylelint-disable selector-no-type, max-nesting-depth, selector-max-compound-selectors, selector-max-type, selector-max-specificity, selector-max-id\n\n.main-content {\n line-height: $content-line-height;\n\n ol,\n ul,\n dl,\n pre,\n address,\n blockquote,\n .table-wrapper {\n margin-top: 0.5em;\n }\n\n a {\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n ul,\n ol {\n padding-left: 1.5em;\n }\n\n li {\n .highlight {\n margin-top: $sp-1;\n }\n }\n\n ol {\n list-style-type: none;\n counter-reset: step-counter;\n\n > li {\n position: relative;\n\n &::before {\n position: absolute;\n top: 0.2em;\n left: -1.6em;\n color: $grey-dk-000;\n content: counter(step-counter);\n counter-increment: step-counter;\n @include fs-3;\n\n @include mq(sm) {\n top: 0.11em;\n }\n }\n\n ol {\n counter-reset: sub-counter;\n\n > li {\n &::before {\n content: counter(sub-counter, lower-alpha);\n counter-increment: sub-counter;\n }\n }\n }\n }\n }\n\n ul {\n list-style: none;\n\n > li {\n &::before {\n position: absolute;\n margin-left: -1.4em;\n color: $grey-dk-000;\n content: \"•\";\n }\n }\n }\n\n .task-list-item {\n &::before {\n content: \"\";\n }\n }\n\n .task-list-item-checkbox {\n margin-right: 0.6em;\n margin-left: -1.4em;\n\n // The same margin-left is used above for ul > li::before\n }\n\n hr + * {\n margin-top: 0;\n }\n\n h1:first-of-type {\n margin-top: 0.5em;\n }\n\n dl {\n display: grid;\n grid-template: auto / 10em 1fr;\n }\n\n dt,\n dd {\n margin: 0.25em 0;\n }\n\n dt {\n grid-column: 1;\n font-weight: 500;\n text-align: right;\n\n &::after {\n content: \":\";\n }\n }\n\n dd {\n grid-column: 2;\n margin-bottom: 0;\n margin-left: 1em;\n\n blockquote,\n div,\n dl,\n dt,\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n li,\n ol,\n p,\n pre,\n table,\n ul,\n .table-wrapper {\n &:first-child {\n margin-top: 0;\n }\n }\n }\n\n dd,\n ol,\n ul {\n dl:first-child {\n dt:first-child,\n dd:nth-child(2) {\n margin-top: 0;\n }\n }\n }\n\n .anchor-heading {\n position: absolute;\n right: -$sp-4;\n width: $sp-5;\n height: 100%;\n padding-right: $sp-1;\n padding-left: $sp-1;\n overflow: visible;\n\n @include mq(md) {\n right: auto;\n left: -$sp-5;\n }\n\n svg {\n display: inline-block;\n width: 100%;\n height: 100%;\n color: $link-color;\n visibility: hidden;\n }\n }\n\n .anchor-heading:hover,\n .anchor-heading:focus,\n h1:hover > .anchor-heading,\n h2:hover > .anchor-heading,\n h3:hover > .anchor-heading,\n h4:hover > .anchor-heading,\n h5:hover > .anchor-heading,\n h6:hover > .anchor-heading {\n svg {\n visibility: visible;\n }\n }\n\n summary {\n cursor: pointer;\n }\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n #toctitle {\n position: relative;\n margin-top: 1.5em;\n margin-bottom: 0.25em;\n\n + table,\n + .table-wrapper,\n + .code-example,\n + .highlighter-rouge,\n + .sectionbody .listingblock {\n margin-top: 1em;\n }\n\n + p:not(.label) {\n margin-top: 0;\n }\n }\n\n > h1:first-child,\n > h2:first-child,\n > h3:first-child,\n > h4:first-child,\n > h5:first-child,\n > h6:first-child,\n > .sect1:first-child > h2,\n > .sect2:first-child > h3,\n > .sect3:first-child > h4,\n > .sect4:first-child > h5,\n > .sect5:first-child > h6 {\n margin-top: $sp-2;\n }\n}\n","// Main nav, breadcrumb, etc...\n// stylelint-disable selector-no-type, max-nesting-depth, selector-max-compound-selectors, selector-max-type, selector-max-specificity\n\n.nav-list {\n padding: 0;\n margin-top: 0;\n margin-bottom: 0;\n list-style: none;\n\n .nav-list-item {\n position: relative;\n margin: 0;\n\n @include fs-4;\n\n @include mq(md) {\n @include fs-3;\n }\n\n .nav-list-link {\n display: block;\n min-height: $nav-list-item-height-sm;\n padding-top: $sp-1;\n padding-bottom: $sp-1;\n line-height: #{$nav-list-item-height-sm - 2 * $sp-1};\n @if $nav-list-expander-right {\n padding-right: $nav-list-item-height-sm;\n padding-left: $gutter-spacing-sm;\n } @else {\n padding-right: $gutter-spacing-sm;\n padding-left: $nav-list-item-height-sm;\n }\n\n @include mq(md) {\n min-height: $nav-list-item-height;\n line-height: #{$nav-list-item-height - 2 * $sp-1};\n @if $nav-list-expander-right {\n padding-right: $nav-list-item-height;\n padding-left: $gutter-spacing;\n } @else {\n padding-right: $gutter-spacing;\n padding-left: $nav-list-item-height;\n }\n }\n\n &.external > svg {\n width: $sp-4;\n height: $sp-4;\n vertical-align: text-bottom;\n }\n\n &.active {\n font-weight: 600;\n text-decoration: none;\n }\n\n &:hover,\n &.active {\n color: darken($link-color, 5%);\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 80%,\n rgba($feedback-color, 0) 100%\n );\n }\n }\n\n .nav-list-expander {\n position: absolute;\n @if $nav-list-expander-right {\n right: 0;\n }\n\n width: $nav-list-item-height-sm;\n height: $nav-list-item-height-sm;\n padding: #{$nav-list-item-height-sm * 0.25};\n color: $link-color;\n\n @include mq(md) {\n width: $nav-list-item-height;\n height: $nav-list-item-height;\n padding: #{$nav-list-item-height * 0.25};\n }\n\n &:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 100%\n );\n }\n\n @if $nav-list-expander-right {\n svg {\n transform: rotate(90deg);\n }\n }\n }\n\n > .nav-list {\n display: none;\n padding-left: $sp-3;\n list-style: none;\n\n .nav-list-item {\n position: relative;\n\n .nav-list-link {\n color: $nav-child-link-color;\n }\n\n .nav-list-expander {\n color: $nav-child-link-color;\n }\n }\n }\n\n &.active {\n > .nav-list-expander svg {\n @if $nav-list-expander-right {\n transform: rotate(-90deg);\n } @else {\n transform: rotate(90deg);\n }\n }\n\n > .nav-list {\n display: block;\n }\n }\n }\n}\n\n.nav-category {\n padding: $sp-2 $gutter-spacing-sm;\n font-weight: 600;\n text-align: start;\n text-transform: uppercase;\n border-bottom: $border $border-color;\n @include fs-2;\n\n @include mq(md) {\n padding: $sp-2 $gutter-spacing;\n margin-top: $gutter-spacing-sm;\n text-align: start;\n\n &:first-child {\n margin-top: 0;\n }\n }\n}\n\n.nav-list.nav-category-list {\n > .nav-list-item {\n margin: 0;\n\n > .nav-list {\n padding: 0;\n\n > .nav-list-item {\n > .nav-list-link {\n color: $link-color;\n }\n\n > .nav-list-expander {\n color: $link-color;\n }\n }\n }\n }\n}\n\n// Aux nav\n\n.aux-nav {\n height: 100%;\n overflow-x: auto;\n @include fs-2;\n\n .aux-nav-list {\n display: flex;\n height: 100%;\n padding: 0;\n margin: 0;\n list-style: none;\n }\n\n .aux-nav-list-item {\n display: inline-block;\n height: 100%;\n padding: 0;\n margin: 0;\n }\n\n @include mq(md) {\n padding-right: $gutter-spacing-sm;\n }\n}\n\n// Breadcrumb nav\n\n.breadcrumb-nav {\n @include mq(md) {\n margin-top: -$sp-4;\n }\n}\n\n.breadcrumb-nav-list {\n padding-left: 0;\n margin-bottom: $sp-3;\n list-style: none;\n}\n\n.breadcrumb-nav-list-item {\n display: table-cell;\n @include fs-2;\n\n &::before {\n display: none;\n }\n\n &::after {\n display: inline-block;\n margin-right: $sp-2;\n margin-left: $sp-2;\n color: $grey-dk-000;\n content: \"/\";\n }\n\n &:last-child {\n &::after {\n content: \"\";\n }\n }\n}\n","// Typography\n// stylelint-disable selector-no-type, selector-max-type, selector-max-specificity, selector-max-id\n\nh1,\n.text-alpha {\n font-weight: 300;\n\n @include fs-8;\n}\n\nh2,\n.text-beta,\n#toctitle {\n @include fs-6;\n}\n\nh3,\n.text-gamma {\n @include fs-5;\n}\n\nh4,\n.text-delta {\n font-weight: 400;\n text-transform: uppercase;\n letter-spacing: 0.1em;\n\n @include fs-2;\n}\n\nh4 code {\n text-transform: none;\n}\n\nh5,\n.text-epsilon {\n @include fs-3;\n}\n\nh6,\n.text-zeta {\n @include fs-2;\n}\n\n.text-small {\n @include fs-2;\n}\n\n.text-mono {\n font-family: $mono-font-family !important;\n}\n\n.text-left {\n text-align: left !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n.text-right {\n text-align: right !important;\n}\n","// Labels (not the form kind)\n\n// this :not() prevents a style clash with Mermaid.js's\n// diagram labels, which also use .label\n// for more, see https://github.com/just-the-docs/just-the-docs/issues/1272\n// and the accompanying PR\n.label:not(g),\n.label-blue:not(g) {\n display: inline-block;\n padding: 0.16em 0.56em;\n margin-right: $sp-2;\n margin-left: $sp-2;\n color: $white;\n text-transform: uppercase;\n vertical-align: middle;\n background-color: $blue-100;\n border-radius: 12px;\n\n @include fs-2;\n}\n\n.label-green:not(g) {\n background-color: $green-300;\n}\n\n.label-purple:not(g) {\n background-color: $purple-100;\n}\n\n.label-red:not(g) {\n background-color: $red-300;\n}\n\n.label-yellow:not(g) {\n color: $grey-dk-200;\n background-color: $yellow-200;\n}\n","// Buttons and things that look like buttons\n// stylelint-disable color-named\n\n.btn {\n display: inline-block;\n box-sizing: border-box;\n padding: 0.3em 1em;\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n font-weight: 500;\n line-height: 1.5;\n color: $link-color;\n text-decoration: none;\n vertical-align: baseline;\n cursor: pointer;\n background-color: $base-button-color;\n border-width: 0;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n appearance: none;\n\n &:focus {\n text-decoration: none;\n outline: none;\n box-shadow: 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:focus:hover,\n &.selected:focus {\n box-shadow: 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:hover,\n &.zeroclipboard-is-hover {\n color: darken($link-color, 2%);\n }\n\n &:hover,\n &:active,\n &.zeroclipboard-is-hover,\n &.zeroclipboard-is-active {\n text-decoration: none;\n background-color: darken($base-button-color, 1%);\n }\n\n &:active,\n &.selected,\n &.zeroclipboard-is-active {\n background-color: darken($base-button-color, 3%);\n background-image: none;\n box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15);\n }\n\n &.selected:hover {\n background-color: darken(#dcdcdc, 5%);\n }\n\n &:disabled,\n &.disabled {\n &,\n &:hover {\n color: rgba(102, 102, 102, 0.5);\n cursor: default;\n background-color: rgba(229, 229, 229, 0.5);\n background-image: none;\n box-shadow: none;\n }\n }\n}\n\n.btn-outline {\n color: $link-color;\n background: transparent;\n box-shadow: inset 0 0 0 2px $grey-lt-300;\n\n &:hover,\n &:active,\n &.zeroclipboard-is-hover,\n &.zeroclipboard-is-active {\n color: darken($link-color, 4%);\n text-decoration: none;\n background-color: transparent;\n box-shadow: inset 0 0 0 3px $grey-lt-300;\n }\n\n &:focus {\n text-decoration: none;\n outline: none;\n box-shadow:\n inset 0 0 0 2px $grey-dk-100,\n 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:focus:hover,\n &.selected:focus {\n box-shadow: inset 0 0 0 2px $grey-dk-100;\n }\n}\n\n.btn-primary {\n @include btn-color($white, $btn-primary-color);\n}\n\n.btn-purple {\n @include btn-color($white, $purple-100);\n}\n\n.btn-blue {\n @include btn-color($white, $blue-200);\n}\n\n.btn-green {\n @include btn-color($white, $green-300);\n}\n\n.btn-reset {\n background: none;\n border: none;\n margin: 0;\n text-align: inherit;\n font: inherit;\n border-radius: 0;\n appearance: none;\n}\n","// Colored button\n\n@mixin btn-color($fg, $bg) {\n color: $fg;\n background-color: darken($bg, 2%);\n background-image: linear-gradient(lighten($bg, 5%), darken($bg, 2%));\n box-shadow:\n 0 1px 3px rgba(0, 0, 0, 0.25),\n 0 4px 10px rgba(0, 0, 0, 0.12);\n\n &:hover,\n &.zeroclipboard-is-hover {\n color: $fg;\n background-color: darken($bg, 4%);\n background-image: linear-gradient((lighten($bg, 2%), darken($bg, 4%)));\n }\n\n &:active,\n &.selected,\n &.zeroclipboard-is-active {\n background-color: darken($bg, 5%);\n background-image: none;\n box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15);\n }\n\n &.selected:hover {\n background-color: darken($bg, 10%);\n }\n}\n","// Search input and autocomplete\n\n.search {\n position: relative;\n z-index: 2;\n flex-grow: 1;\n height: $sp-10;\n padding: $sp-2;\n transition: padding linear #{$transition-duration * 0.5};\n\n @include mq(md) {\n position: relative !important;\n width: auto !important;\n height: 100% !important;\n padding: 0;\n transition: none;\n }\n}\n\n.search-input-wrap {\n position: relative;\n z-index: 1;\n height: $sp-8;\n overflow: hidden;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n transition: height linear #{$transition-duration * 0.5};\n\n @include mq(md) {\n position: absolute;\n width: 100%;\n max-width: $search-results-width;\n height: 100% !important;\n border-radius: 0;\n box-shadow: none;\n transition: width ease $transition-duration;\n }\n}\n\n.search-input {\n position: absolute;\n width: 100%;\n height: 100%;\n padding: $sp-2 $gutter-spacing-sm $sp-2 #{$gutter-spacing-sm + $sp-5};\n font-size: 1rem;\n color: $body-text-color;\n background-color: $search-background-color;\n border-top: 0;\n border-right: 0;\n border-bottom: 0;\n border-left: 0;\n border-radius: 0;\n\n @include mq(md) {\n padding: $sp-2 $gutter-spacing-sm $sp-2 #{$gutter-spacing + $sp-5};\n font-size: 0.875rem;\n background-color: $body-background-color;\n transition: padding-left linear #{$transition-duration * 0.5};\n }\n\n &:focus {\n outline: 2px solid $link-color;\n outline-offset: -2px;\n\n + .search-label .search-icon {\n color: $link-color;\n }\n }\n}\n\n.search-label {\n position: absolute;\n display: flex;\n height: 100%;\n padding-left: $gutter-spacing-sm;\n\n @include mq(md) {\n padding-left: $gutter-spacing;\n transition: padding-left linear #{$transition-duration * 0.5};\n }\n\n .search-icon {\n width: #{$sp-4 * 1.2};\n height: #{$sp-4 * 1.2};\n align-self: center;\n color: $grey-dk-000;\n }\n}\n\n.search-results {\n position: absolute;\n left: 0;\n display: none;\n width: 100%;\n max-height: calc(100% - #{$sp-10});\n overflow-y: auto;\n background-color: $search-background-color;\n border-bottom-right-radius: $border-radius;\n border-bottom-left-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n\n @include mq(md) {\n top: 100%;\n width: $search-results-width;\n max-height: calc(100vh - 200%) !important;\n }\n}\n\n.search-results-list {\n padding-left: 0;\n margin-bottom: $sp-1;\n list-style: none;\n @include fs-4;\n\n @include mq(md) {\n @include fs-3;\n }\n}\n\n.search-results-list-item {\n padding: 0;\n margin: 0;\n}\n\n.search-result {\n display: block;\n padding: $sp-1 $sp-3;\n\n &:hover,\n &.active {\n background-color: $feedback-color;\n }\n}\n\n.search-result-title {\n display: block;\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n\n @include mq(sm) {\n display: inline-block;\n width: 40%;\n padding-right: $sp-2;\n vertical-align: top;\n }\n}\n\n.search-result-doc {\n display: flex;\n align-items: center;\n word-wrap: break-word;\n\n &.search-result-doc-parent {\n opacity: 0.5;\n @include fs-3;\n\n @include mq(md) {\n @include fs-2;\n }\n }\n\n .search-result-icon {\n width: $sp-4;\n height: $sp-4;\n margin-right: $sp-2;\n color: $link-color;\n flex-shrink: 0;\n }\n\n .search-result-doc-title {\n overflow: auto;\n }\n}\n\n.search-result-section {\n margin-left: #{$sp-4 + $sp-2};\n word-wrap: break-word;\n}\n\n.search-result-rel-url {\n display: block;\n margin-left: #{$sp-4 + $sp-2};\n overflow: hidden;\n color: $search-result-preview-color;\n text-overflow: ellipsis;\n white-space: nowrap;\n @include fs-1;\n}\n\n.search-result-previews {\n display: block;\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n padding-left: $sp-4;\n margin-left: $sp-2;\n color: $search-result-preview-color;\n word-wrap: break-word;\n border-left: $border;\n border-left-color: $border-color;\n @include fs-2;\n\n @include mq(sm) {\n display: inline-block;\n width: 60%;\n padding-left: $sp-2;\n margin-left: 0;\n vertical-align: top;\n }\n}\n\n.search-result-preview + .search-result-preview {\n margin-top: $sp-1;\n}\n\n.search-result-highlight {\n font-weight: bold;\n}\n\n.search-no-result {\n padding: $sp-2 $sp-3;\n @include fs-3;\n}\n\n.search-button {\n position: fixed;\n right: $sp-4;\n bottom: $sp-4;\n display: flex;\n width: $sp-9;\n height: $sp-9;\n background-color: $search-background-color;\n border: 1px solid rgba($link-color, 0.3);\n border-radius: #{$sp-9 * 0.5};\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n align-items: center;\n justify-content: center;\n}\n\n.search-overlay {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1;\n width: 0;\n height: 0;\n background-color: rgba(0, 0, 0, 0.3);\n opacity: 0;\n transition:\n opacity ease $transition-duration,\n width 0s $transition-duration,\n height 0s $transition-duration;\n}\n\n.search-active {\n .search {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n padding: 0;\n }\n\n .search-input-wrap {\n height: $sp-10;\n border-radius: 0;\n\n @include mq(md) {\n width: $search-results-width;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n }\n }\n\n .search-input {\n background-color: $search-background-color;\n\n @include mq(md) {\n padding-left: 2.3rem;\n }\n }\n\n .search-label {\n @include mq(md) {\n padding-left: 0.6rem;\n }\n }\n\n .search-results {\n display: block;\n }\n\n .search-overlay {\n width: 100%;\n height: 100%;\n opacity: 1;\n transition:\n opacity ease $transition-duration,\n width 0s,\n height 0s;\n }\n\n @include mq(md) {\n .main {\n position: fixed;\n right: 0;\n left: 0;\n }\n }\n\n .main-header {\n padding-top: $sp-10;\n\n @include mq(md) {\n padding-top: 0;\n }\n }\n}\n","// Tables\n// stylelint-disable max-nesting-depth, selector-no-type, selector-max-type\n\n.table-wrapper {\n display: block;\n width: 100%;\n max-width: 100%;\n margin-bottom: $sp-5;\n overflow-x: auto;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n}\n\ntable {\n display: table;\n min-width: 100%;\n border-collapse: separate;\n}\n\nth,\ntd {\n min-width: 7.5rem;\n padding: $sp-2 $sp-3;\n background-color: $table-background-color;\n border-bottom: $border rgba($border-color, 0.5);\n border-left: $border $border-color;\n\n @include fs-3;\n\n &:first-of-type {\n border-left: 0;\n }\n}\n\ntbody {\n tr {\n &:last-of-type {\n th,\n td {\n border-bottom: 0;\n }\n\n td {\n padding-bottom: $sp-3;\n }\n }\n }\n}\n\nthead {\n th {\n border-bottom: $border $border-color;\n }\n}\n","// Code and syntax highlighting\n// stylelint-disable selector-no-qualifying-type, declaration-block-semicolon-newline-after,declaration-block-single-line-max-declarations, selector-no-type, selector-max-type, scss/comment-no-empty\n\n// {% raw %}\n\n// This instruction applies to all queues not within 'pre' or 'figure', avoiding 'code' generated by the highlight.\n:not(pre, figure) {\n & > code {\n padding: 0.2em 0.15em;\n font-weight: 400;\n background-color: $code-background-color;\n border: $border $border-color;\n border-radius: $border-radius;\n }\n}\n\n// Avoid appearance of dark border around visited code links in Safari\na:visited code {\n border-color: $border-color;\n}\n\n// Content structure for highlighted code blocks using fences or Liquid\n//\n// ```[LANG]...```, no kramdown line_numbers:\n// div.[language-LANG.]highlighter-rouge > div.highlight > pre.highlight > code\n//\n// ```[LANG]...```, kramdown line_numbers = true:\n// div.[language-LANG.]highlighter-rouge > div.highlight > pre.highlight > code\n// > div.table-wrapper > table.rouge-table > tbody > tr\n// > td.rouge-gutter.gl > pre.lineno\n// | td.rouge-code > pre\n//\n// {% highlight LANG %}...{% endhighlight %}:\n// figure.highlight > pre > code.language-LANG\n//\n// {% highlight LANG linenos %}...{% endhighlight %}:\n// figure.highlight > pre > code.language-LANG\n// > div.table-wrapper > table.rouge-table > tbody > tr\n// > td.gutter.gl > pre.lineno\n// | td.code > pre\n//\n// ----...---- (AsciiDoc)\n// div.listingblock > div.content > pre.rouge.highlight\n//\n// fix_linenos removes the outermost pre when it encloses table.rouge-table\n//\n// See docs/index-test.md for some tests.\n//\n// No kramdown line_numbers: fences and Liquid highlighting look the same.\n// Kramdown line_numbers = true: fences have a wider gutter than with Liquid?\n\n// ```[LANG]...```\n// or in AsciiDoc:\n//\n// ----\n// ...\n// ----\n\n// the code may appear with 3 different types:\n// container \\ case: default case, code with line number, code with html rendering\n// top level: div.highlighter-rouge, figure.highlight, figure.highlight\n// second level: div.highlight, div.table-wrapper, pre.highlight\n// third level: pre.highlight, td.code, absent\n// last level: code, pre, code (optionality)\n// highlighter level: span, span, span\n// the spacing are only in the second level for case 1, 3 and in the third level for case 2\n// in AsciiDoc, there is a parent container that contains optionally a title and the content.\n\n// select top level container\ndiv.highlighter-rouge,\ndiv.listingblock > div.content,\nfigure.highlight {\n margin-top: 0;\n margin-bottom: $sp-3;\n background-color: $code-background-color;\n border-radius: $border-radius;\n box-shadow: none;\n -webkit-overflow-scrolling: touch;\n position: relative;\n padding: 0;\n\n // copy button (or other button)\n // the button appear only when there is a hover on the code or focus on button\n > button {\n width: $sp-3;\n opacity: 0;\n position: absolute;\n top: 0;\n right: 0;\n padding: $sp-3;\n border: none;\n background: none;\n color: $body-text-color;\n box-sizing: content-box;\n\n svg {\n fill: $body-text-color;\n }\n\n &:active {\n text-decoration: none;\n outline: none;\n opacity: 1;\n }\n\n &:focus {\n opacity: 1;\n outline: 2px solid $link-color;\n }\n }\n\n // the button can be seen by doing a simple hover in the code, there is no need to go over the location of the button\n &:hover {\n > button {\n cursor: copy;\n opacity: 1;\n }\n }\n}\n\n// setting the spacing and scrollbar on the second level for the first case\n// remove all space on the second and third level\n// this is a mixin to accommodate for the slightly different structures generated via Markdown vs AsciiDoc\n@mixin scroll-and-spacing($code-div, $pre-select) {\n #{$code-div} {\n overflow-x: auto;\n padding: $sp-3;\n margin: 0;\n border: 1px solid $body-text-color;\n border-radius: $border-radius;\n }\n\n #{$pre-select},\n code {\n padding: 0;\n margin: 0;\n border: 0;\n }\n}\n\n// for Markdown\ndiv.highlighter-rouge {\n @include scroll-and-spacing(\"div.highlight\", \"pre.highlight\");\n}\n\n// for AsciiDoc. we also need to fix the margins for its parent container.\ndiv.listingblock {\n margin-top: 0;\n margin-bottom: $sp-3;\n\n @include scroll-and-spacing(\"div.content\", \"div.content > pre\");\n}\n\n// {% highlight LANG %}...{% endhighlight %},\n// {% highlight LANG linenos %}...{% endhighlight %}:\n\n// setting the spacing and scrollbar on the second level for the thirt case\n// the css rule are apply only to the last code enviroment\n// setting the scroolbar\nfigure.highlight {\n pre,\n :not(pre) > code {\n overflow-x: auto;\n padding: $sp-3;\n margin: 0;\n border: 1px solid $body-text-color;\n border-radius: $border-radius;\n }\n}\n\n// ```[LANG]...```, kramdown line_numbers = true,\n// {% highlight LANG linenos %}...{% endhighlight %}:\n\n// setting the spacing and scrollbar on the thirt level for the second case\n.highlight .table-wrapper {\n padding: $sp-3 0;\n margin: 0;\n border: 0;\n box-shadow: none;\n\n td,\n pre {\n min-width: 0;\n padding: 0;\n background-color: $code-background-color;\n border: 0;\n\n @include fs-2;\n }\n\n td.gl {\n width: 1em;\n padding-right: $sp-3;\n padding-left: $sp-3;\n }\n\n pre {\n margin: 0;\n line-height: 2;\n }\n}\n\n// Code examples: html render of a code\n.code-example,\n.listingblock > .title {\n padding: $sp-3;\n margin-bottom: $sp-3;\n overflow: auto;\n border: 1px solid $border-color;\n border-radius: $border-radius;\n\n + .highlighter-rouge,\n + .sectionbody .listingblock,\n + .content,\n + figure.highlight {\n position: relative;\n margin-top: -$sp-4;\n border-right: 1px solid $border-color;\n border-bottom: 1px solid $border-color;\n border-left: 1px solid $border-color;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n }\n}\n\n// Mermaid diagram code blocks should be left unstyled.\ncode.language-mermaid {\n padding: 0;\n background-color: inherit;\n border: 0;\n}\n\n// Override OneDarkJekyll Colors for Code Blocks\n.highlight,\npre.highlight {\n background: $code-background-color; // Code Background\n // For Backwards Compatibility Before $code-linenumber-color was added\n @if variable-exists(code-linenumber-color) {\n color: $code-linenumber-color; // Code Line Numbers\n } @else {\n color: $body-text-color; // Code Line Numbers\n }\n}\n\n// Override OneDarkJekyll Colors for Code Blocks\n.highlight pre {\n background: $code-background-color; // Code Background\n}\n\n// {% endraw %}\n","// Utility classes for colors\n\n// Text colors\n\n.text-grey-dk-000 {\n color: $grey-dk-000 !important;\n}\n\n.text-grey-dk-100 {\n color: $grey-dk-100 !important;\n}\n\n.text-grey-dk-200 {\n color: $grey-dk-200 !important;\n}\n\n.text-grey-dk-250 {\n color: $grey-dk-250 !important;\n}\n\n.text-grey-dk-300 {\n color: $grey-dk-300 !important;\n}\n\n.text-grey-lt-000 {\n color: $grey-lt-000 !important;\n}\n\n.text-grey-lt-100 {\n color: $grey-lt-100 !important;\n}\n\n.text-grey-lt-200 {\n color: $grey-lt-200 !important;\n}\n\n.text-grey-lt-300 {\n color: $grey-lt-300 !important;\n}\n\n.text-blue-000 {\n color: $blue-000 !important;\n}\n\n.text-blue-100 {\n color: $blue-100 !important;\n}\n\n.text-blue-200 {\n color: $blue-200 !important;\n}\n\n.text-blue-300 {\n color: $blue-300 !important;\n}\n\n.text-green-000 {\n color: $green-000 !important;\n}\n\n.text-green-100 {\n color: $green-100 !important;\n}\n\n.text-green-200 {\n color: $green-200 !important;\n}\n\n.text-green-300 {\n color: $green-300 !important;\n}\n\n.text-purple-000 {\n color: $purple-000 !important;\n}\n\n.text-purple-100 {\n color: $purple-100 !important;\n}\n\n.text-purple-200 {\n color: $purple-200 !important;\n}\n\n.text-purple-300 {\n color: $purple-300 !important;\n}\n\n.text-yellow-000 {\n color: $yellow-000 !important;\n}\n\n.text-yellow-100 {\n color: $yellow-100 !important;\n}\n\n.text-yellow-200 {\n color: $yellow-200 !important;\n}\n\n.text-yellow-300 {\n color: $yellow-300 !important;\n}\n\n.text-red-000 {\n color: $red-000 !important;\n}\n\n.text-red-100 {\n color: $red-100 !important;\n}\n\n.text-red-200 {\n color: $red-200 !important;\n}\n\n.text-red-300 {\n color: $red-300 !important;\n}\n\n// Background colors\n\n.bg-grey-dk-000 {\n background-color: $grey-dk-000 !important;\n}\n\n.bg-grey-dk-100 {\n background-color: $grey-dk-100 !important;\n}\n\n.bg-grey-dk-200 {\n background-color: $grey-dk-200 !important;\n}\n\n.bg-grey-dk-250 {\n background-color: $grey-dk-250 !important;\n}\n\n.bg-grey-dk-300 {\n background-color: $grey-dk-300 !important;\n}\n\n.bg-grey-lt-000 {\n background-color: $grey-lt-000 !important;\n}\n\n.bg-grey-lt-100 {\n background-color: $grey-lt-100 !important;\n}\n\n.bg-grey-lt-200 {\n background-color: $grey-lt-200 !important;\n}\n\n.bg-grey-lt-300 {\n background-color: $grey-lt-300 !important;\n}\n\n.bg-blue-000 {\n background-color: $blue-000 !important;\n}\n\n.bg-blue-100 {\n background-color: $blue-100 !important;\n}\n\n.bg-blue-200 {\n background-color: $blue-200 !important;\n}\n\n.bg-blue-300 {\n background-color: $blue-300 !important;\n}\n\n.bg-green-000 {\n background-color: $green-000 !important;\n}\n\n.bg-green-100 {\n background-color: $green-100 !important;\n}\n\n.bg-green-200 {\n background-color: $green-200 !important;\n}\n\n.bg-green-300 {\n background-color: $green-300 !important;\n}\n\n.bg-purple-000 {\n background-color: $purple-000 !important;\n}\n\n.bg-purple-100 {\n background-color: $purple-100 !important;\n}\n\n.bg-purple-200 {\n background-color: $purple-200 !important;\n}\n\n.bg-purple-300 {\n background-color: $purple-300 !important;\n}\n\n.bg-yellow-000 {\n background-color: $yellow-000 !important;\n}\n\n.bg-yellow-100 {\n background-color: $yellow-100 !important;\n}\n\n.bg-yellow-200 {\n background-color: $yellow-200 !important;\n}\n\n.bg-yellow-300 {\n background-color: $yellow-300 !important;\n}\n\n.bg-red-000 {\n background-color: $red-000 !important;\n}\n\n.bg-red-100 {\n background-color: $red-100 !important;\n}\n\n.bg-red-200 {\n background-color: $red-200 !important;\n}\n\n.bg-red-300 {\n background-color: $red-300 !important;\n}\n","// Utility classes for layout\n\n// Display\n\n.d-block {\n display: block !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-none {\n display: none !important;\n}\n\n// Screenreader-only\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border-width: 0;\n}\n\n@each $media-query in map-keys($media-queries) {\n @for $i from 1 through length($spacers) {\n @include mq($media-query) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .d-sm-block, .d-md-none, .d-lg-inline\n .d-#{$media-query}-block {\n display: block !important;\n }\n .d-#{$media-query}-flex {\n display: flex !important;\n }\n .d-#{$media-query}-inline {\n display: inline !important;\n }\n .d-#{$media-query}-inline-block {\n display: inline-block !important;\n }\n .d-#{$media-query}-none {\n display: none !important;\n }\n }\n }\n}\n\n// Horizontal alignment\n\n.float-left {\n float: left !important;\n}\n\n.float-right {\n float: right !important;\n}\n\n.flex-justify-start {\n justify-content: flex-start !important;\n}\n\n.flex-justify-end {\n justify-content: flex-end !important;\n}\n\n.flex-justify-between {\n justify-content: space-between !important;\n}\n\n.flex-justify-around {\n justify-content: space-around !important;\n}\n\n// Vertical alignment\n\n.v-align-baseline {\n vertical-align: baseline !important;\n}\n\n.v-align-bottom {\n vertical-align: bottom !important;\n}\n\n.v-align-middle {\n vertical-align: middle !important;\n}\n\n.v-align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.v-align-text-top {\n vertical-align: text-top !important;\n}\n\n.v-align-top {\n vertical-align: top !important;\n}\n","// Utility classes for typography\n\n.fs-1 {\n @include fs-1;\n}\n\n.fs-2 {\n @include fs-2;\n}\n\n.fs-3 {\n @include fs-3;\n}\n\n.fs-4 {\n @include fs-4;\n}\n\n.fs-5 {\n @include fs-5;\n}\n\n.fs-6 {\n @include fs-6;\n}\n\n.fs-7 {\n @include fs-7;\n}\n\n.fs-8 {\n @include fs-8;\n}\n\n.fs-9 {\n @include fs-9;\n}\n\n.fs-10 {\n @include fs-10;\n}\n\n.fw-300 {\n font-weight: 300 !important;\n}\n\n.fw-400 {\n font-weight: 400 !important;\n}\n\n.fw-500 {\n font-weight: 500 !important;\n}\n\n.fw-700 {\n font-weight: 700 !important;\n}\n\n.lh-0 {\n line-height: 0 !important;\n}\n\n.lh-default {\n line-height: $body-line-height;\n}\n\n.lh-tight {\n line-height: $body-heading-line-height;\n}\n\n.ls-5 {\n letter-spacing: 0.05em !important;\n}\n\n.ls-10 {\n letter-spacing: 0.1em !important;\n}\n\n.ls-0 {\n letter-spacing: 0 !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n","// Utility classes for lists\n\n// stylelint-disable selector-max-type\n\n.list-style-none {\n padding: 0 !important;\n margin: 0 !important;\n list-style: none !important;\n\n li {\n &::before {\n display: none !important;\n }\n }\n}\n","// Utility classes for margins and padding\n\n// stylelint-disable block-opening-brace-space-after, block-opening-brace-space-before\n\n// Margin spacer utilities\n\n.mx-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n}\n\n@for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .m-0, .m-1, .m-2...\n .m-#{$scale} {\n margin: #{$size} !important;\n }\n .mt-#{$scale} {\n margin-top: #{$size} !important;\n }\n .mr-#{$scale} {\n margin-right: #{$size} !important;\n }\n .mb-#{$scale} {\n margin-bottom: #{$size} !important;\n }\n .ml-#{$scale} {\n margin-left: #{$size} !important;\n }\n\n .mx-#{$scale} {\n margin-right: #{$size} !important;\n margin-left: #{$size} !important;\n }\n\n .my-#{$scale} {\n margin-top: #{$size} !important;\n margin-bottom: #{$size} !important;\n }\n\n .mxn-#{$scale} {\n margin-right: -#{$size} !important;\n margin-left: -#{$size} !important;\n }\n .mx-#{$scale}-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n}\n\n@each $media-query in map-keys($media-queries) {\n @for $i from 1 through length($spacers) {\n @include mq($media-query) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .m-sm-0, .m-md-1, .m-lg-2...\n .m-#{$media-query}-#{$scale} {\n margin: #{$size} !important;\n }\n .mt-#{$media-query}-#{$scale} {\n margin-top: #{$size} !important;\n }\n .mr-#{$media-query}-#{$scale} {\n margin-right: #{$size} !important;\n }\n .mb-#{$media-query}-#{$scale} {\n margin-bottom: #{$size} !important;\n }\n .ml-#{$media-query}-#{$scale} {\n margin-left: #{$size} !important;\n }\n\n .mx-#{$media-query}-#{$scale} {\n margin-right: #{$size} !important;\n margin-left: #{$size} !important;\n }\n\n .my-#{$media-query}-#{$scale} {\n margin-top: #{$size} !important;\n margin-bottom: #{$size} !important;\n }\n\n .mxn-#{$media-query}-#{$scale} {\n margin-right: -#{$size} !important;\n margin-left: -#{$size} !important;\n }\n }\n }\n}\n\n// Padding spacer utilities\n\n@for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .p-0, .p-1, .p-2...\n .p-#{$scale} {\n padding: #{$size} !important;\n }\n .pt-#{$scale} {\n padding-top: #{$size} !important;\n }\n .pr-#{$scale} {\n padding-right: #{$size} !important;\n }\n .pb-#{$scale} {\n padding-bottom: #{$size} !important;\n }\n .pl-#{$scale} {\n padding-left: #{$size} !important;\n }\n\n .px-#{$scale} {\n padding-right: #{$size} !important;\n padding-left: #{$size} !important;\n }\n\n .py-#{$scale} {\n padding-top: #{$size} !important;\n padding-bottom: #{$size} !important;\n }\n}\n\n@each $media-query in map-keys($media-queries) {\n @include mq($media-query) {\n @for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .p-sm-0, .p-md-1, .p-lg-2...\n .p-#{$media-query}-#{$scale} {\n padding: #{$size} !important;\n }\n .pt-#{$media-query}-#{$scale} {\n padding-top: #{$size} !important;\n }\n .pr-#{$media-query}-#{$scale} {\n padding-right: #{$size} !important;\n }\n .pb-#{$media-query}-#{$scale} {\n padding-bottom: #{$size} !important;\n }\n .pl-#{$media-query}-#{$scale} {\n padding-left: #{$size} !important;\n }\n\n .px-#{$media-query}-#{$scale} {\n padding-right: #{$size} !important;\n padding-left: #{$size} !important;\n }\n\n .py-#{$media-query}-#{$scale} {\n padding-top: #{$size} !important;\n padding-bottom: #{$size} !important;\n }\n }\n }\n}\n","// stylelint-disable selector-max-specificity, selector-max-id, selector-max-type, selector-no-qualifying-type\n\n@media print {\n .site-footer,\n .site-button,\n #edit-this-page,\n #back-to-top,\n .site-nav,\n .main-header {\n display: none !important;\n }\n\n hr {\n margin-top: 1rem;\n margin-bottom: 1rem;\n }\n\n .side-bar {\n width: 100%;\n height: auto;\n border-right: 0 !important;\n }\n\n .site-header {\n border-bottom: 1px solid $border-color;\n }\n\n .site-title {\n font-size: 1rem !important;\n font-weight: 700 !important;\n }\n\n .text-small {\n font-size: 8pt !important;\n }\n\n pre.highlight {\n border: 1px solid $border-color;\n }\n\n .main {\n max-width: none;\n margin-left: 0;\n }\n}\n","// Skipnav\n// Skip to main content\n\na.skip-to-main {\n left: -999px;\n position: absolute;\n top: auto;\n width: 1px;\n height: 1px;\n overflow: hidden;\n z-index: -999;\n}\n\na.skip-to-main:focus,\na.skip-to-main:active {\n color: $link-color;\n background-color: $body-background-color;\n left: auto;\n top: auto;\n width: 30%;\n height: auto;\n overflow: auto;\n margin: 10px 35%;\n padding: 5px;\n border-radius: 15px;\n border: 4px solid $btn-primary-color;\n text-align: center;\n font-size: 1.2em;\n z-index: 999;\n}\n","\n@import \"./support/support\";\n@import \"./custom/setup\";\n@import \"./color_schemes/light\";\n\n@import \"./color_schemes/meshtastic-dark\";\n\n@import \"./modules\";\ndiv.opaque {\n background-color: $body-background-color;\n}\n\np.tip, blockquote.tip {\n border: 1px $green-000 solid;\n border-left: $border-radius solid $green-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $green-300;\n content: \"Tip\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .tip-title {\n color: $green-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.tip-title, blockquote.tip-title {\n border: 1px $green-000 solid;\n border-left: $border-radius solid $green-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $green-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.tip {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.tip-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n\np.note, blockquote.note {\n border: 1px $blue-000 solid;\n border-left: $border-radius solid $blue-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $blue-300;\n content: \"Note\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .note-title {\n color: $blue-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.note-title, blockquote.note-title {\n border: 1px $blue-000 solid;\n border-left: $border-radius solid $blue-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $blue-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.note {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.note-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n\np.warning, blockquote.warning {\n border: 1px $yellow-000 solid;\n border-left: $border-radius solid $yellow-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $yellow-300;\n content: \"Warning\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .warning-title {\n color: $yellow-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.warning-title, blockquote.warning-title {\n border: 1px $yellow-000 solid;\n border-left: $border-radius solid $yellow-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $yellow-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.warning {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.warning-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n@import \"./custom/custom\";\n\n\n"],"file":"just-the-docs-meshtastic-dark.css"} \ No newline at end of file diff --git a/main/assets/css/just-the-docs-meshtastic.css.map b/main/assets/css/just-the-docs-meshtastic.css.map index 219fea6a09..a40183846e 100644 --- a/main/assets/css/just-the-docs-meshtastic.css.map +++ b/main/assets/css/just-the-docs-meshtastic.css.map @@ -1 +1 @@ -{"version":3,"sourceRoot":"","sources":["../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/vendor/accessible-pygments/github-light.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/vendor/normalize.scss/normalize.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/base.scss","../../_sass/color_schemes/meshtastic.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/support/mixins/_typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/support/mixins/_layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/support/_variables.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/content.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/navigation.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/labels.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/buttons.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/color_schemes/light.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/support/mixins/_buttons.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/search.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/tables.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/code.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/utilities/_colors.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/utilities/_layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/utilities/_typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/utilities/_lists.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/utilities/_spacing.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/print.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-3017-9xcrsl/_sass/skiptomain.scss","just-the-docs-meshtastic.scss"],"names":[],"mappings":";AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA;EAAkB;;;AAClB;EAAgB;EAAiB;AACjC;EAAkB;EAAiB;AACnC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAkB;EAAiB;AACnC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAqB;AACtC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAoB;AACrC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAgB;EAAiB;AACjC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AChFlC;AAEA;AAAA;AAGA;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAAA;AAKA;EACE;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;EAEE;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;AAAA;EAGE;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;EAEE;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAAA;AAKA;AAAA;AAAA;AAAA;AAAA;EAKE;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;AAEE;EACA;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;AAEE;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;EAIE;;;AAGF;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;EAIE;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;EAIE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;EAEE;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;EAEE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AC1VF;EACE,cCGa;;;ADAf;EACE;;;AAGF;EACE;;AEmBA;EACE;;AClBA;EHHJ;IEyBI;;;;AFnBJ;EACE,aIfiB;EJgBjB;EACA,aIbiB;EJcjB,OCTgB;EDUhB,kBCZsB;EDatB;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAYE;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;EACA;EACA;EACA,aI1CyB;EJ2CzB,OCvCmB;;;AD0CrB;EACE;EACA;;;AAGF;EACE,OC7CW;ED8CX;;;AAGF;EACE;EACA,uBCvCa;EDwCb;;AAEA;EACE;;;AAIJ;EACE,aIvEiB;EJwEjB;EACA,aIvEiB;;;AJ0EnB;AAAA;EAEE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA,kBCvEa;EDwEb;;;AAIF;EACE;EAGA;EACA;EACA;EACA;;;AK7GF;EACE;EACA;EACA;EACA,kBJKc;;AEGZ;EEZJ;IAOI;IACA;IACA,ODwFW;ICvFX;IACA;IACA;;;AFAA;EEZJ;IAgBI;IACA,WD+EQ;;;ADpFR;EEQF;IAEI,aD2ES;;;ADrFX;EEQF;IAQI;;;AAOF;EACE;EACA,kBJ5BU;;AEGZ;EEuBA;IAKI;IACA,kBJjCgB;;;AIoClB;EACE;;AFjCJ;EEgCE;IAII;;;;AAOV;EACE;;AF5CE;EE2CJ;IAII;IACA,WDyCY;;;;ACrChB;EACE,aDaK;ECZL,gBDYK;EDvDL,eCuDK;EDtDL,cCsDK;;ADlEH;EEoDJ;IFrCI,eCqDG;IDpDH,cCoDG;;;ADpEH;EEoDJ;IAOI,aDSG;ICRH,gBDQG;;;;ACJP;EACE;EACA;;AFlEE;EEgEJ;IAKI;IACA;IACA,QDmBY;;;;ACfhB;AAAA;AAAA;EAGE;;AF9EE;EE2EJ;AAAA;AAAA;IAMI,ODGQ;;;;ACCZ;EACE;;AAEA;EACE;;AFzFA;EEqFJ;IAQI;IACA,aDxBG;ICyBH,gBD7BG;IC8BH;IACA;;;;AAIJ;EACE;EACA,YDbc;ECcd;;AFxGE;EEqGJ;IAMI,QDjBY;ICkBZ,YDlBY;ICmBZ;;;;AAIJ;EACE;EACA;EACA;EACA;EACA,aDrDK;ECsDL,gBDtDK;ECuDL,OJzHmB;EEYnB,eCuDK;EDtDL,cCsDK;;ADlEH;EEiHJ;IFlGI,eCqDG;IDpDH,cCoDG;;;AF/BL;EACE;;ACtCA;EEiHJ;IHvEI;IACA,aEhDuB;;;ADKvB;EEiHJ;IAcI,aD/DG;ICgEH,gBDhEG;;;;AC+EP;EACE;EACA;EACA,SDhFK;ECiFL;;;AFnJE;EEuJF;IACE;;;AAIJ;EACE;;;AAQF;EACE;;;AAOF;EACE;EACA;EACA;EACA,aD/GK;ECgHL,gBDhHK;EDvDL,eCuDK;EDtDL,cCsDK;;ADlEH;EE6KJ;IF9JI,eCqDG;IDpDH,cCoDG;;;AFvEL;EACE;;ACEA;EE6KJ;IH3KI;;;ACFA;EE6KJ;IAYI;IACA;;;;AAIJ;EACE,OD5HK;EC6HL,QD7HK;EC8HL,OJ/LW;;;AKXb;EACE,aFEoB;;AEApB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;;AAGF;EACE;EACA;;AAGF;AAAA;EAEE;;AAIA;EACE,YF+CC;;AE3CL;EACE;EACA;;AAEA;EACE;;AAEA;EACE;EACA;EACA;EACA,OFfM;EEgBN;EACA;;AJ1BN;EACE;;ACRA;EG2BE;IJfF;;;ACZA;EG2BE;IAUI;;;AAIJ;EACE;;AAGE;EACE;EACA;;AAOV;EACE;;AAGE;EACE;EACA;EACA,OF7CM;EE8CN;;AAMJ;EACE;;AAIJ;EACE;EACA;;AAKF;EACE;;AAGF;EACE;;AAGF;EACE;EACA;;AAGF;AAAA;EAEE;;AAGF;EACE;EACA;EACA;;AAEA;EACE;;AAIJ;EACE;EACA;EACA;;AAmBE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;;AASF;AAAA;AAAA;AAAA;AAAA;AAAA;EAEE;;AAKN;EACE;EACA;EACA,OFnFG;EEoFH;EACA,eFzFG;EE0FH,cF1FG;EE2FH;;AH1JA;EGmJF;IAUI;IACA;;;AAGF;EACE;EACA;EACA;EACA,OLnKO;EKoKP;;AAYF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;;AAIJ;EACE;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;EACA;EACA;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAKE;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;;AAIJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAWE,YF9JG;;;AG3EP;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;ALoBF;EACE;;AClBA;EILF;IL2BE;;;ACtBA;EDOF;IACE;;;ACRA;EILF;ILiBE;;;AKPA;EACE;EACA,YH+DC;EG9DD,aHuDC;EGtDD,gBHsDC;EGrDD;EAEE,eH0DD;EGzDC,cHqDD;;ADlEH;EIKA;IAeI,YHgDD;IG/CC;IAEE,eH6CH;IG5CG,cH4CH;;;AGrCD;EACE,OHkCD;EGjCC,QHiCD;EGhCC;;AAGF;EACE;EACA;;AAGF;EAEE;EACA;;AASJ;EACE;EAEE;EAGF,OHUC;EGTD,QHSC;EGRD;EACA,ON7DO;;AEFT;EIsDA;IAYI,OHED;IGDC,QHCD;IGAC;;;AAGF;EACE;;AAQA;EACE;;AAKN;EACE;EACA,cHvBC;EGwBD;;AAEA;EACE;;AAEA;EACE,ONzFa;;AM4Ff;EACE,ON7Fa;;AMmGjB;EAEI;;AAMJ;EACE;;;AAMR;EACE;EACA;EACA;EACA;EACA;;ALhIA;EACE;;ACEA;EIwHJ;ILtHI;;;ACFA;EIwHJ;IASI;IACA,YHhEG;IGiEH;;EAEA;IACE;;;;AAMJ;EACE;;AAEA;EACE;;AAGE;EACE,ONlJG;;AMqJL;EACE,ONtJG;;;AM+Jb;EACE;EACA;;ALtKA;EACE;;ACEA;EIiKJ;IL/JI;;;AKoKF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AJlLA;EIiKJ;IAqBI,eHpHG;;;;ADlEH;EI4LJ;IAEI;;;;AAIJ;EACE;EACA,eHnIK;EGoIL;;;AAGF;EACE;;AL5MA;EACE;;ACEA;EIwMJ;ILtMI;;;AK0MF;EACE;;AAGF;EACE;EACA,cHlJG;EGmJH,aHnJG;EGoJH,OHpMU;EGqMV;;AAIA;EACE;;;ACrON;AAAA;EAEE;;ANoEA;AAAA;EACE;EACA,aElEuB;;ADKvB;EKXJ;AAAA;IN4EI;;;;AA5BF;AAAA;AAAA;EACE;;ACtCA;EKJJ;AAAA;AAAA;IN8CI;IACA,aEhDuB;;;;AFgCzB;AAAA;EACE;;AC5BA;EKEJ;AAAA;IN8BI;;;;AMzBJ;AAAA;EAEE;EACA;EACA;;ANdA;AAAA;EACE;;ACEA;EKOJ;AAAA;INLI;;;;AMcJ;EACE;;;ANVA;AAAA;EACE;;ACRA;EKoBJ;AAAA;INRI;;;;AAfF;AAAA;EACE;;ACEA;EKyBJ;AAAA;INvBI;;;;AALF;EACE;;ACEA;EK8BJ;IN5BI;;;;AMgCJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;ACvDF;AAAA;EAEE;EACA;EACA,cLoEK;EKnEL,aLmEK;EKlEL,OLiBM;EKhBN;EACA;EACA,kBL6BS;EK5BT;;APLA;AAAA;EACE;;ACEA;EMRJ;AAAA;IPUI;;;;AOKJ;EACE,kBL4BU;;;AKzBZ;EACE,kBLcW;;;AKXb;EACE,kBL4BQ;;;AKzBV;EACE,OLFY;EKGZ,kBLkBW;;;AMlDb;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,OTIW;ESHX;EACA;EACA;EACA,kBCTkB;EDUlB;EACA,eNyEc;EMxEd,YACE;EAEF;;AAEA;EACE;EACA;EACA;;AAGF;EAEE;;AAGF;EAEE;;AAGF;EAIE;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;AAKA;EAEE;EACA;EACA;EACA;EACA;;;AAKN;EACE,OT1DW;ES2DX;EACA;;AAEA;EAIE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA,YACE;;AAIJ;EAEE;;;AAIJ;EEnGE,OR0BM;EQzBN;EACA;EACA,YACE;;AAGF;EAEE,ORiBI;EQhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;AFgFJ;EEvGE,OR0BM;EQzBN;EACA;EACA,YACE;;AAGF;EAEE,ORiBI;EQhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;AFoFJ;EE3GE,OR0BM;EQzBN;EACA;EACA,YACE;;AAGF;EAEE,ORiBI;EQhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;AFwFJ;EE/GE,OR0BM;EQzBN;EACA;EACA,YACE;;AAGF;EAEE,ORiBI;EQhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;AF4FJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AG3HF;EACE;EACA;EACA;EACA,QTgFM;ES/EN,STuEK;EStEL;;AVME;EUZJ;IASI;IACA;IACA;IACA;IACA;;;;AAIJ;EACE;EACA;EACA,QT8DK;ES7DL;EACA,eTmEc;ESlEd,YACE;EAEF;;AVdE;EUKJ;IAYI;IACA;IACA,WTwEmB;ISvEnB;IACA;IACA;IACA;;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA,OZnCgB;EYoChB,kBZVwB;EYWxB;EACA;EACA;EACA;EACA;;AVvCE;EU2BJ;IAeI;IACA;IACA,kBZhDoB;IYiDpB;;;AAGF;EACE;EACA;;AAEA;EACE,OZnDO;;;AYwDb;EACE;EACA;EACA;EACA,cTIK;;ADlEH;EU0DJ;IAOI,cTGG;ISFH;;;AAGF;EACE;EACA;EACA;EACA,OTzDU;;;AS6Dd;EACE;EACA;EACA;EACA;EACA;EACA;EACA,kBZ5DwB;EY6DxB,4BTRc;ESSd,2BTTc;ESUd,YACE;;AVxFA;EU6EJ;IAeI;IACA,OTFmB;ISGnB;;;;AAIJ;EACE;EACA,eTrCK;ESsCL;;AXpFA;EACE;;AClBA;EUkGJ;IX5EI;;;ACtBA;EDOF;IACE;;;ACRA;EUkGJ;IXtFI;;;;AWiGJ;EACE;EACA;;;AAGF;EACE;EACA;;AAEA;EAEE,kBZnGa;;;AYuGjB;EACE;EACA,aT9DK;ES+DL,gBT/DK;;ADhEH;EU4HJ;IAMI;IACA;IACA,eTpEG;ISqEH;;;;AAIJ;EACE;EACA;EACA;;AAEA;EACE;;AXxIF;EACE;;ACRA;EU8IF;IXlIE;;;ACZA;EDHF;IACE;;;ACEA;EU8IF;IX5IE;;;AWqJF;EACE,OTtFG;ESuFH,QTvFG;ESwFH,cT1FG;ES2FH,OZzJS;EY0JT;;AAGF;EACE;;;AAIJ;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA,OZtK4B;EYuK5B;EACA;;AX5LA;EACE;;ACYA;EUyKJ;IXjLI;;;;AW2LJ;EACE;EACA,aTrHK;ESsHL,gBTtHK;ESuHL,cTrHK;ESsHL,aTxHK;ESyHL,OZlL4B;EYmL5B;EACA,aT/GO;ESgHP,mBZ9Ka;;ACjBb;EACE;;ACEA;EUmLJ;IXjLI;;;ACFA;EUmLJ;IAaI;IACA;IACA,cTlIG;ISmIH;IACA;;;;AAIJ;EACE,YT1IK;;;AS6IP;EACE;;;AAGF;EACE;;AX1MA;EACE;;ACRA;EUgNJ;IXpMI;;;;AWyMJ;EACE;EACA,OTrJK;ESsJL,QTtJK;ESuJL;EACA,OTnJK;ESoJL,QTpJK;ESqJL,kBZpMwB;EYqMxB;EACA;EACA,YACE;EAEF;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YACE;;;AAMF;EACE;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE,QTxLI;ESyLJ;;AVjQA;EU+PF;IAKI,OTzKiB;IS0KjB,YACE;;;AAKN;EACE,kBZpPsB;;AExBtB;EU2QF;IAII;;;AV/QF;EUmRF;IAEI;;;AAIJ;EACE;;AAGF;EACE;EACA;EACA;EACA,YACE;;AVlSF;EUwSA;IACE;IACA;IACA;;;AAIJ;EACE,aTxOI;;ADxEJ;EU+SF;IAII;;;;AC9TN;EACE;EACA;EACA;EACA,eV0EK;EUzEL;EACA,eVkFc;EUjFd,YACE;;;AAIJ;EACE;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA,kBbIuB;EaHvB;EACA;;AZNA;AAAA;EACE;;ACRA;EWOJ;AAAA;IZKI;;;AYKF;AAAA;EACE;;;AAOE;AAAA;EAEE;;AAGF;EACE,gBVkCD;;;AU3BL;EACE;;;AC9CF;EACE;EACA;EACA,kBdcoB;EcbpB;EACA,eX+EY;;;AW1EhB;EACE,cdUa;;;AcyCf;AAAA;AAAA;EAGE;EACA,eXMK;EWLL,kBdlDsB;EcmDtB,eXgBc;EWfd;EACA;EACA;EACA;;AAIA;AAAA;AAAA;EACE,OXLG;EWMH;EACA;EACA;EACA;EACA,SXVG;EWWH;EACA;EACA,OdhFc;EciFd;;AAEA;AAAA;AAAA;EACE,MdpFY;;AcuFd;AAAA;AAAA;EACE;EACA;EACA;;AAGF;AAAA;AAAA;EACE;EACA;;AAMF;AAAA;AAAA;EACE;EACA;;;AASJ;EACE;EACA,SX/CG;EWgDH;EACA;EACA,eXtCY;;AWyCd;AAAA;EAEE;EACA;EACA;;;AAUJ;EACE;EACA,eXrEK;;AW6CL;EACE;EACA,SX/CG;EWgDH;EACA;EACA,eXtCY;;AWyCd;AAAA;EAEE;EACA;EACA;;;AAwBF;AAAA;EAEE;EACA,SXpFG;EWqFH;EACA;EACA,eX3EY;;;AWmFhB;EACE;EACA;EACA;EACA;;AAEA;AAAA;EAEE;EACA;EACA,kBdhKoB;EciKpB;;Ab9KF;AAAA;EACE;;ACEA;EYsKF;AAAA;IbpKE;;;Aa8KF;EACE;EACA,eXjHG;EWkHH,cXlHG;;AWqHL;EACE;EACA;;;AAKJ;AAAA;EAEE,SX9HK;EW+HL,eX/HK;EWgIL;EACA;EACA,eXtHc;;AWwHd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAIE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAKJ;EACE;EACA;EACA;;;AAIF;AAAA;EAEE,YdnNsB;EcsNpB,OdrNoB;;;Ac4NxB;EACE,Yd9NsB;;;AepBxB;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;ACvOF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AdrBE;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;AAQR;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AfhHA;EACE;;ACYA;EeZJ;IhBII;;;;AAKF;EACE;;ACEA;EeRJ;IhBUI;;;;AAKF;EACE;;ACRA;EeJJ;IhBgBI;;;;AAKF;EACE;;AClBA;EeAJ;IhBsBI;;;;AAKF;EACE;;AC5BA;EeIJ;IhB4BI;;;;AAKF;EACE;;ACtCA;EeQJ;IhBkCI;IACA,aEhDuB;;;;AFqDzB;EACE;EACA,aEvDuB;;ADKvB;EeYJ;IhB0CI;;;;AAKF;EACE;EACA,aElEuB;;ADKvB;EegBJ;IhBiDI;;;;AAKF;EACE;EACA,aE7EuB;;ADKvB;EeoBJ;IhBwDI;;;;AAKF;EACE;EACA,aExFuB;;ADKvB;EewBJ;IhB+DI;;;;AgB3DJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE,adxDiB;;;Ac2DnB;EACE,ad1DyB;;;Ac6D3B;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AC/EF;EACE;EACA;EACA;;AAGE;EACE;;;ACLN;EACE;EACA;;;AAQA;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AjBlCA;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAaN;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AjB7GA;EiBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjB/IJ;EiBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjB/IJ;EiBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjB/IJ;EiBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjB/IJ;EiBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AC3JR;EACE;AAAA;AAAA;AAAA;AAAA;AAAA;IAME;;EAGF;IACE;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;IACA;;;ACvCJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE,OrBCW;EqBAX,kBrBNsB;EqBOtB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ACpBF;EACE,kBtBCsB;;;AsBExB;EACI;EACA;EACA,enB4EY;EmB3EZ;EACA;;AAEA;EACI,OnB8BI;EmB7BJ;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OnBoBM;EmBnBN;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,enBiDY;EmBhDZ;EACA;;AACA;EACE;EACA;EACA,OnBEM;EmBDN;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAMJ;EACI;EACA;EACA,enBGY;EmBFZ;EACA;;AAEA;EACI,OnB/CG;EmBgDH;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OnBzDK;EmB0DL;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,enBxBY;EmByBZ;EACA;;AACA;EACE;EACA;EACA,OnB3EK;EmB4EL;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAMJ;EACI;EACA;EACA,enBtEY;EmBuEZ;EACA;;AAEA;EACI,OnBhHK;EmBiHL;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OnB1HO;EmB2HP;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,enBjGY;EmBkGZ;EACA;;AACA;EACE;EACA;EACA,OnB5IO;EmB6IP;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE","sourcesContent":["/*\ngenerated by accessible-pygments \nCopyright (c) 2022, Quansight Labs\nLicensed under the BSD license, see LICENSE for details.\n--\ngenerated by Pygments \nCopyright 2006-2025 by the Pygments team.\nLicensed under the BSD license, see LICENSE for details.\n*/\n\n.highlight .hll { background-color: #0969da4a }\n.highlight .c { color: #6E7781 } /* Comment */\n.highlight .err { color: #CF222E } /* Error */\n.highlight .k { color: #CF222E } /* Keyword */\n.highlight .l { color: #953800 } /* Literal */\n.highlight .n { color: #8250DF } /* Name */\n.highlight .o { color: #116329 } /* Operator */\n.highlight .p { color: #24292F } /* Punctuation */\n.highlight .ch { color: #6E7781 } /* Comment.Hashbang */\n.highlight .cm { color: #6E7781 } /* Comment.Multiline */\n.highlight .cp { color: #6E7781 } /* Comment.Preproc */\n.highlight .cpf { color: #6E7781 } /* Comment.PreprocFile */\n.highlight .c1 { color: #6E7781 } /* Comment.Single */\n.highlight .cs { color: #6E7781 } /* Comment.Special */\n.highlight .gd { color: #0550AE } /* Generic.Deleted */\n.highlight .ge { font-style: italic } /* Generic.Emph */\n.highlight .gr { color: #CF222E } /* Generic.Error */\n.highlight .gh { color: #0550AE } /* Generic.Heading */\n.highlight .gs { font-weight: bold } /* Generic.Strong */\n.highlight .gu { color: #0550AE } /* Generic.Subheading */\n.highlight .kc { color: #0550AE } /* Keyword.Constant */\n.highlight .kd { color: #CF222E } /* Keyword.Declaration */\n.highlight .kn { color: #CF222E } /* Keyword.Namespace */\n.highlight .kp { color: #CF222E } /* Keyword.Pseudo */\n.highlight .kr { color: #CF222E } /* Keyword.Reserved */\n.highlight .kt { color: #CF222E } /* Keyword.Type */\n.highlight .ld { color: #953800 } /* Literal.Date */\n.highlight .m { color: #953800 } /* Literal.Number */\n.highlight .s { color: #0550AE } /* Literal.String */\n.highlight .na { color: #953800 } /* Name.Attribute */\n.highlight .nb { color: #953800 } /* Name.Builtin */\n.highlight .nc { color: #0550AE } /* Name.Class */\n.highlight .no { color: #0550AE } /* Name.Constant */\n.highlight .nd { color: #953800 } /* Name.Decorator */\n.highlight .ni { color: #116329 } /* Name.Entity */\n.highlight .ne { color: #8250DF } /* Name.Exception */\n.highlight .nf { color: #0550AE } /* Name.Function */\n.highlight .nl { color: #953800 } /* Name.Label */\n.highlight .nn { color: #24292F } /* Name.Namespace */\n.highlight .nx { color: #8250DF } /* Name.Other */\n.highlight .py { color: #0550AE } /* Name.Property */\n.highlight .nt { color: #116329 } /* Name.Tag */\n.highlight .nv { color: #953800 } /* Name.Variable */\n.highlight .ow { color: #8250DF } /* Operator.Word */\n.highlight .pm { color: #24292F } /* Punctuation.Marker */\n.highlight .w { color: #24292F } /* Text.Whitespace */\n.highlight .mb { color: #953800 } /* Literal.Number.Bin */\n.highlight .mf { color: #953800 } /* Literal.Number.Float */\n.highlight .mh { color: #953800 } /* Literal.Number.Hex */\n.highlight .mi { color: #953800 } /* Literal.Number.Integer */\n.highlight .mo { color: #953800 } /* Literal.Number.Oct */\n.highlight .sa { color: #0550AE } /* Literal.String.Affix */\n.highlight .sb { color: #0550AE } /* Literal.String.Backtick */\n.highlight .sc { color: #0550AE } /* Literal.String.Char */\n.highlight .dl { color: #0550AE } /* Literal.String.Delimiter */\n.highlight .sd { color: #0550AE } /* Literal.String.Doc */\n.highlight .s2 { color: #0550AE } /* Literal.String.Double */\n.highlight .se { color: #0550AE } /* Literal.String.Escape */\n.highlight .sh { color: #0550AE } /* Literal.String.Heredoc */\n.highlight .si { color: #0550AE } /* Literal.String.Interpol */\n.highlight .sx { color: #0550AE } /* Literal.String.Other */\n.highlight .sr { color: #0550AE } /* Literal.String.Regex */\n.highlight .s1 { color: #0550AE } /* Literal.String.Single */\n.highlight .ss { color: #0550AE } /* Literal.String.Symbol */\n.highlight .bp { color: #953800 } /* Name.Builtin.Pseudo */\n.highlight .fm { color: #0550AE } /* Name.Function.Magic */\n.highlight .vc { color: #953800 } /* Name.Variable.Class */\n.highlight .vg { color: #953800 } /* Name.Variable.Global */\n.highlight .vi { color: #953800 } /* Name.Variable.Instance */\n.highlight .vm { color: #953800 } /* Name.Variable.Magic */\n.highlight .il { color: #953800 } /* Literal.Number.Integer.Long */\n","/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */\n\n/* Document\n ========================================================================== */\n\n/**\n * 1. Correct the line height in all browsers.\n * 2. Prevent adjustments of font size after orientation changes in iOS.\n */\n\nhtml {\n line-height: 1.15; /* 1 */\n text-size-adjust: 100%; /* 2 */\n}\n\n/* Sections\n ========================================================================== */\n\n/**\n * Remove the margin in all browsers.\n */\n\nbody {\n margin: 0;\n}\n\n/**\n * Render the `main` element consistently in IE.\n */\n\nmain {\n display: block;\n}\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n/* Grouping content\n ========================================================================== */\n\n/**\n * 1. Add the correct box sizing in Firefox.\n * 2. Show the overflow in Edge and IE.\n */\n\nhr {\n box-sizing: content-box; /* 1 */\n height: 0; /* 1 */\n overflow: visible; /* 2 */\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\npre {\n font-family: monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/* Text-level semantics\n ========================================================================== */\n\n/**\n * Remove the gray background on active links in IE 10.\n */\n\na {\n background-color: transparent;\n}\n\n/**\n * 1. Remove the bottom border in Chrome 57-\n * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n */\n\nabbr[title] {\n border-bottom: none; /* 1 */\n text-decoration: underline; /* 2 */\n text-decoration: underline dotted; /* 2 */\n}\n\n/**\n * Add the correct font weight in Chrome, Edge, and Safari.\n */\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\ncode,\nkbd,\nsamp {\n font-family: monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/**\n * Add the correct font size in all browsers.\n */\n\nsmall {\n font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` elements from affecting the line height in\n * all browsers.\n */\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/* Embedded content\n ========================================================================== */\n\n/**\n * Remove the border on images inside links in IE 10.\n */\n\nimg {\n border-style: none;\n}\n\n/* Forms\n ========================================================================== */\n\n/**\n * 1. Change the font styles in all browsers.\n * 2. Remove the margin in Firefox and Safari.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-size: 100%; /* 1 */\n line-height: 1.15; /* 1 */\n margin: 0; /* 2 */\n}\n\n/**\n * Show the overflow in IE.\n * 1. Show the overflow in Edge.\n */\n\nbutton,\ninput {\n /* 1 */\n overflow: visible;\n}\n\n/**\n * Remove the inheritance of text transform in Edge, Firefox, and IE.\n * 1. Remove the inheritance of text transform in Firefox.\n */\n\nbutton,\nselect {\n /* 1 */\n text-transform: none;\n}\n\n/**\n * Correct the inability to style clickable types in iOS and Safari.\n */\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n appearance: button;\n}\n\n/**\n * Remove the inner border and padding in Firefox.\n */\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n border-style: none;\n padding: 0;\n}\n\n/**\n * Restore the focus styles unset by the previous rule.\n */\n\nbutton:-moz-focusring,\n[type=\"button\"]:-moz-focusring,\n[type=\"reset\"]:-moz-focusring,\n[type=\"submit\"]:-moz-focusring {\n outline: 1px dotted ButtonText;\n}\n\n/**\n * Correct the padding in Firefox.\n */\n\nfieldset {\n padding: 0.35em 0.75em 0.625em;\n}\n\n/**\n * 1. Correct the text wrapping in Edge and IE.\n * 2. Correct the color inheritance from `fieldset` elements in IE.\n * 3. Remove the padding so developers are not caught out when they zero out\n * `fieldset` elements in all browsers.\n */\n\nlegend {\n box-sizing: border-box; /* 1 */\n color: inherit; /* 2 */\n display: table; /* 1 */\n max-width: 100%; /* 1 */\n padding: 0; /* 3 */\n white-space: normal; /* 1 */\n}\n\n/**\n * Add the correct vertical alignment in Chrome, Firefox, and Opera.\n */\n\nprogress {\n vertical-align: baseline;\n}\n\n/**\n * Remove the default vertical scrollbar in IE 10+.\n */\n\ntextarea {\n overflow: auto;\n}\n\n/**\n * 1. Add the correct box sizing in IE 10.\n * 2. Remove the padding in IE 10.\n */\n\n[type=\"checkbox\"],\n[type=\"radio\"] {\n box-sizing: border-box; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Correct the cursor style of increment and decrement buttons in Chrome.\n */\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n/**\n * 1. Correct the odd appearance in Chrome and Safari.\n * 2. Correct the outline style in Safari.\n */\n\n[type=\"search\"] {\n appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/**\n * Remove the inner padding in Chrome and Safari on macOS.\n */\n\n[type=\"search\"]::-webkit-search-decoration {\n appearance: none;\n}\n\n/**\n * 1. Correct the inability to style clickable types in iOS and Safari.\n * 2. Change font properties to `inherit` in Safari.\n */\n\n::-webkit-file-upload-button {\n appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/* Interactive\n ========================================================================== */\n\n/*\n * Add the correct display in Edge, IE 10+, and Firefox.\n */\n\ndetails {\n display: block;\n}\n\n/*\n * Add the correct display in all browsers.\n */\n\nsummary {\n display: list-item;\n}\n\n/* Misc\n ========================================================================== */\n\n/**\n * Add the correct display in IE 10+.\n */\n\ntemplate {\n display: none;\n}\n\n/**\n * Add the correct display in IE 10.\n */\n\n[hidden] {\n display: none;\n}\n","// Base element style overrides\n// stylelint-disable selector-no-type, selector-max-type, selector-max-specificity, selector-max-id\n\n:root {\n color-scheme: $color-scheme;\n}\n\n* {\n box-sizing: border-box;\n}\n\nhtml {\n scroll-behavior: smooth;\n\n @include fs-4;\n}\n\nbody {\n font-family: $body-font-family;\n font-size: inherit;\n line-height: $body-line-height;\n color: $body-text-color;\n background-color: $body-background-color;\n overflow-wrap: break-word;\n}\n\nol,\nul,\ndl,\npre,\naddress,\nblockquote,\ntable,\ndiv,\nhr,\nform,\nfieldset,\nnoscript .table-wrapper {\n margin-top: 0;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n#toctitle {\n margin-top: 0;\n margin-bottom: 1em;\n font-weight: 500;\n line-height: $body-heading-line-height;\n color: $body-heading-color;\n}\n\np {\n margin-top: 1em;\n margin-bottom: 1em;\n}\n\na {\n color: $link-color;\n text-decoration: none;\n}\n\na:not([class]) {\n text-decoration: underline;\n text-decoration-color: $border-color;\n text-underline-offset: 2px;\n\n &:hover {\n text-decoration-color: rgba($link-color, 0.45);\n }\n}\n\ncode {\n font-family: $mono-font-family;\n font-size: 0.75em;\n line-height: $body-line-height;\n}\n\nfigure,\npre {\n margin: 0;\n}\n\nli {\n margin: 0.25em 0;\n}\n\nimg {\n max-width: 100%;\n height: auto;\n}\n\nhr {\n height: 1px;\n padding: 0;\n margin: $sp-6 0;\n background-color: $border-color;\n border: 0;\n}\n\n// adds a GitHub-style sidebar to blockquotes\nblockquote {\n margin: 10px 0;\n\n // resets user-agent stylesheets for blockquotes\n margin-block-start: 0;\n margin-inline-start: 0;\n padding-left: 1rem;\n border-left: 3px solid $border-color;\n}\n","// Meshtastic Material 3 — Light color scheme for just-the-docs\n// Source: core/ui/.../Color.kt §8.2 (Light Scheme)\n//\n// Brand colors:\n// Primary (Light): #2D8F52 (Green 700)\n// Surface (Light): #F5F6FA (Neutral 50)\n\n$color-scheme: light;\n\n// Body / page background\n$body-background-color: #F5F6FA; // Neutral 50 — surfaceLight\n$sidebar-color: #ECEDF3; // Neutral 100 — surfaceContainerLight\n$body-text-color: #2C2D3C; // Neutral 800 — onSurfaceLight\n$body-heading-color: #2C2D3C; // Neutral 800\n\n// Links\n$link-color: #2D8F52; // Green 700 — primaryLight\n$nav-link-color: #2D8F52; // Green 700\n\n// Navigation\n$nav-child-link-color: #555668; // Neutral 600 — secondaryLight\n$search-result-preview-color: #555668;\n\n// Code\n$code-background-color: #ECEDF3; // Neutral 100\n$code-linenumber-color: #9496A6; // Neutral 400\n\n// Borders\n$border-color: #D5D6E0; // Neutral 200 — outlineVariantLight\n$table-background-color: #F5F6FA; // Neutral 50\n\n// Buttons\n$btn-primary-color: #2D8F52; // Green 700\n\n// Feedback / callouts\n$feedback-color: #E0E1EB; // surfaceContainerHighLight\n\n// Search\n$search-background-color: #FFFFFF; // surfaceContainerLowestLight\n","@mixin fs-1 {\n & {\n font-size: $font-size-1 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-1-sm !important;\n }\n}\n\n@mixin fs-2 {\n & {\n font-size: $font-size-2 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-3 !important;\n }\n}\n\n@mixin fs-3 {\n & {\n font-size: $font-size-3 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-4 !important;\n }\n}\n\n@mixin fs-4 {\n & {\n font-size: $font-size-4 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-5 !important;\n }\n}\n\n@mixin fs-5 {\n & {\n font-size: $font-size-5 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-6 !important;\n }\n}\n\n@mixin fs-6 {\n & {\n font-size: $font-size-6 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-7 !important;\n line-height: $body-heading-line-height;\n }\n}\n\n@mixin fs-7 {\n & {\n font-size: $font-size-7 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-8 !important;\n }\n}\n\n@mixin fs-8 {\n & {\n font-size: $font-size-8 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-9 !important;\n }\n}\n\n@mixin fs-9 {\n & {\n font-size: $font-size-9 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-10 !important;\n }\n}\n\n@mixin fs-10 {\n & {\n font-size: $font-size-10 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-10-sm !important;\n }\n}\n","// Media query\n\n// Media query mixin\n// Usage:\n// @include mq(md) {\n// ..medium and up styles\n// }\n@mixin mq($name) {\n // Retrieves the value from the key\n $value: map-get($media-queries, $name);\n\n // If the key exists in the map\n @if $value {\n // Prints a media query based on the value\n @media (min-width: $value) {\n @content;\n }\n } @else {\n @warn \"No value could be retrieved from `#{$media-query}`. Please make sure it is defined in `$media-queries` map.\";\n }\n}\n\n// Responsive container\n\n@mixin container {\n padding-right: $gutter-spacing-sm;\n padding-left: $gutter-spacing-sm;\n\n @include mq(md) {\n padding-right: $gutter-spacing;\n padding-left: $gutter-spacing;\n }\n}\n","// Typography\n\n// prettier-ignore\n$body-font-family: system-ui, -apple-system, blinkmacsystemfont, \"Segoe UI\",\n roboto, \"Helvetica Neue\", arial, sans-serif, \"Segoe UI Emoji\" !default;\n$mono-font-family: \"SFMono-Regular\", menlo, consolas, monospace !default;\n$root-font-size: 16px !default; // DEPRECATED: previously base font-size for rems\n$body-line-height: 1.4 !default;\n$content-line-height: 1.6 !default;\n$body-heading-line-height: 1.25 !default;\n\n// Font size\n// `-sm` suffix is the size at the small (and above) media query\n\n$font-size-1: 0.5625rem !default;\n$font-size-1-sm: 0.625rem !default;\n$font-size-2: 0.6875rem !default; // h4 - uppercased!, h6 not uppercased, text-small\n$font-size-3: 0.75rem !default; // h5\n$font-size-4: 0.875rem !default;\n$font-size-5: 1rem !default; // h3\n$font-size-6: 1.125rem !default; // h2\n$font-size-7: 1.5rem !default;\n$font-size-8: 2rem !default; // h1\n$font-size-9: 2.25rem !default;\n$font-size-10: 2.625rem !default;\n$font-size-10-sm: 3rem !default;\n\n// Colors\n\n$white: #fff !default;\n$grey-dk-000: #959396 !default;\n$grey-dk-100: #5c5962 !default;\n$grey-dk-200: #44434d !default;\n$grey-dk-250: #302d36 !default;\n$grey-dk-300: #27262b !default;\n$grey-lt-000: #f5f6fa !default;\n$grey-lt-100: #eeebee !default;\n$grey-lt-200: #ecebed !default;\n$grey-lt-300: #e6e1e8 !default;\n$purple-000: #7253ed !default;\n$purple-100: #5e41d0 !default;\n$purple-200: #4e26af !default;\n$purple-300: #381885 !default;\n$blue-000: #2c84fa !default;\n$blue-100: #2869e6 !default;\n$blue-200: #264caf !default;\n$blue-300: #183385 !default;\n$green-000: #41d693 !default;\n$green-100: #11b584 !default;\n$green-200: #009c7b !default;\n$green-300: #026e57 !default;\n$yellow-000: #ffeb82 !default;\n$yellow-100: #fadf50 !default;\n$yellow-200: #f7d12e !default;\n$yellow-300: #e7af06 !default;\n$red-000: #f77e7e !default;\n$red-100: #f96e65 !default;\n$red-200: #e94c4c !default;\n$red-300: #dd2e2e !default;\n\n// Spacing\n\n$spacing-unit: 1rem; // 1rem == 16px\n\n$spacers: (\n sp-0: 0,\n sp-1: $spacing-unit * 0.25,\n sp-2: $spacing-unit * 0.5,\n sp-3: $spacing-unit * 0.75,\n sp-4: $spacing-unit,\n sp-5: $spacing-unit * 1.5,\n sp-6: $spacing-unit * 2,\n sp-7: $spacing-unit * 2.5,\n sp-8: $spacing-unit * 3,\n sp-9: $spacing-unit * 3.5,\n sp-10: $spacing-unit * 4,\n) !default;\n$sp-1: map-get($spacers, sp-1) !default; // 0.25 rem == 4px\n$sp-2: map-get($spacers, sp-2) !default; // 0.5 rem == 8px\n$sp-3: map-get($spacers, sp-3) !default; // 0.75 rem == 12px\n$sp-4: map-get($spacers, sp-4) !default; // 1 rem == 16px\n$sp-5: map-get($spacers, sp-5) !default; // 1.5 rem == 24px\n$sp-6: map-get($spacers, sp-6) !default; // 2 rem == 32px\n$sp-7: map-get($spacers, sp-7) !default; // 2.5 rem == 40px\n$sp-8: map-get($spacers, sp-8) !default; // 3 rem == 48px\n$sp-9: map-get($spacers, sp-9) !default; // 3.5 rem == 56px\n$sp-10: map-get($spacers, sp-10) !default; // 4 rem == 64px\n\n// Borders\n\n$border: 1px solid !default;\n$border-radius: 4px !default;\n$border-color: $grey-lt-100 !default;\n\n// Grid system\n\n$gutter-spacing: $sp-6 !default;\n$gutter-spacing-sm: $sp-4 !default;\n$nav-width: 16.5rem !default;\n$nav-width-md: 15.5rem !default;\n$nav-list-item-height: $sp-6 !default;\n$nav-list-item-height-sm: $sp-8 !default;\n$nav-list-expander-right: true;\n$content-width: 50rem !default;\n$header-height: 3.75rem !default;\n$search-results-width: $content-width - $nav-width !default;\n$transition-duration: 400ms;\n\n// Media queries in pixels\n\n$media-queries: (\n xs: 20rem,\n sm: 31.25rem,\n md: $content-width,\n lg: $content-width + $nav-width,\n xl: 87.5rem,\n) !default;\n","// The basic two column layout\n\n.side-bar {\n z-index: 0;\n display: flex;\n flex-wrap: wrap;\n background-color: $sidebar-color;\n\n @include mq(md) {\n flex-flow: column nowrap;\n position: fixed;\n width: $nav-width-md;\n height: 100%;\n border-right: $border $border-color;\n align-items: flex-end;\n }\n\n @include mq(lg) {\n width: calc((100% - #{$nav-width + $content-width}) / 2 + #{$nav-width});\n min-width: $nav-width;\n }\n\n & + .main {\n @include mq(md) {\n margin-left: $nav-width-md;\n }\n\n @include mq(lg) {\n // stylelint-disable function-name-case\n // disable for Max(), we want to use the CSS max() function\n margin-left: Max(\n #{$nav-width},\n calc((100% - #{$nav-width + $content-width}) / 2 + #{$nav-width})\n );\n // stylelint-enable function-name-case\n }\n\n .main-header {\n display: none;\n background-color: $sidebar-color;\n\n @include mq(md) {\n display: flex;\n background-color: $body-background-color;\n }\n\n &.nav-open {\n display: block;\n\n @include mq(md) {\n display: flex;\n }\n }\n }\n }\n}\n\n.main {\n margin: auto;\n\n @include mq(md) {\n position: relative;\n max-width: $content-width;\n }\n}\n\n.main-content-wrap {\n padding-top: $gutter-spacing-sm;\n padding-bottom: $gutter-spacing-sm;\n\n @include container;\n\n @include mq(md) {\n padding-top: $gutter-spacing;\n padding-bottom: $gutter-spacing;\n }\n}\n\n.main-header {\n z-index: 0;\n border-bottom: $border $border-color;\n\n @include mq(md) {\n display: flex;\n justify-content: space-between;\n height: $header-height;\n }\n}\n\n.site-nav,\n.site-header,\n.site-footer {\n width: 100%;\n\n @include mq(lg) {\n width: $nav-width;\n }\n}\n\n.site-nav {\n display: none;\n\n &.nav-open {\n display: block;\n }\n\n @include mq(md) {\n display: block;\n padding-top: $sp-8;\n padding-bottom: $gutter-spacing-sm;\n overflow-y: auto;\n flex: 1 1 auto;\n }\n}\n\n.site-header {\n display: flex;\n min-height: $header-height;\n align-items: center;\n\n @include mq(md) {\n height: $header-height;\n max-height: $header-height;\n border-bottom: $border $border-color;\n }\n}\n\n.site-title {\n flex-grow: 1;\n display: flex;\n height: 100%;\n align-items: center;\n padding-top: $sp-3;\n padding-bottom: $sp-3;\n color: $body-heading-color;\n\n @include container;\n\n @include fs-6;\n\n @include mq(md) {\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n }\n}\n\n@if variable-exists(logo) {\n .site-logo {\n width: 100%;\n height: 100%;\n background-image: url($logo);\n background-repeat: no-repeat;\n background-position: left center;\n background-size: contain;\n }\n}\n\n.site-button {\n display: flex;\n height: 100%;\n padding: $gutter-spacing-sm;\n align-items: center;\n}\n\n@include mq(md) {\n .site-header .site-button {\n display: none;\n }\n}\n\n.site-title:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 80%,\n rgba($feedback-color, 0) 100%\n );\n}\n\n.site-button:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 100%\n );\n}\n\n.site-footer {\n position: absolute;\n bottom: 0;\n left: 0;\n padding-top: $sp-4;\n padding-bottom: $sp-4;\n\n @include container;\n\n @include fs-2;\n\n @include mq(md) {\n position: static;\n justify-self: end;\n }\n}\n\n.icon {\n width: $sp-5;\n height: $sp-5;\n color: $link-color;\n}\n","@charset \"UTF-8\";\n\n// Styles for rendered markdown in the .main-content container\n// stylelint-disable selector-no-type, max-nesting-depth, selector-max-compound-selectors, selector-max-type, selector-max-specificity, selector-max-id\n\n.main-content {\n line-height: $content-line-height;\n\n ol,\n ul,\n dl,\n pre,\n address,\n blockquote,\n .table-wrapper {\n margin-top: 0.5em;\n }\n\n a {\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n ul,\n ol {\n padding-left: 1.5em;\n }\n\n li {\n .highlight {\n margin-top: $sp-1;\n }\n }\n\n ol {\n list-style-type: none;\n counter-reset: step-counter;\n\n > li {\n position: relative;\n\n &::before {\n position: absolute;\n top: 0.2em;\n left: -1.6em;\n color: $grey-dk-000;\n content: counter(step-counter);\n counter-increment: step-counter;\n @include fs-3;\n\n @include mq(sm) {\n top: 0.11em;\n }\n }\n\n ol {\n counter-reset: sub-counter;\n\n > li {\n &::before {\n content: counter(sub-counter, lower-alpha);\n counter-increment: sub-counter;\n }\n }\n }\n }\n }\n\n ul {\n list-style: none;\n\n > li {\n &::before {\n position: absolute;\n margin-left: -1.4em;\n color: $grey-dk-000;\n content: \"•\";\n }\n }\n }\n\n .task-list-item {\n &::before {\n content: \"\";\n }\n }\n\n .task-list-item-checkbox {\n margin-right: 0.6em;\n margin-left: -1.4em;\n\n // The same margin-left is used above for ul > li::before\n }\n\n hr + * {\n margin-top: 0;\n }\n\n h1:first-of-type {\n margin-top: 0.5em;\n }\n\n dl {\n display: grid;\n grid-template: auto / 10em 1fr;\n }\n\n dt,\n dd {\n margin: 0.25em 0;\n }\n\n dt {\n grid-column: 1;\n font-weight: 500;\n text-align: right;\n\n &::after {\n content: \":\";\n }\n }\n\n dd {\n grid-column: 2;\n margin-bottom: 0;\n margin-left: 1em;\n\n blockquote,\n div,\n dl,\n dt,\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n li,\n ol,\n p,\n pre,\n table,\n ul,\n .table-wrapper {\n &:first-child {\n margin-top: 0;\n }\n }\n }\n\n dd,\n ol,\n ul {\n dl:first-child {\n dt:first-child,\n dd:nth-child(2) {\n margin-top: 0;\n }\n }\n }\n\n .anchor-heading {\n position: absolute;\n right: -$sp-4;\n width: $sp-5;\n height: 100%;\n padding-right: $sp-1;\n padding-left: $sp-1;\n overflow: visible;\n\n @include mq(md) {\n right: auto;\n left: -$sp-5;\n }\n\n svg {\n display: inline-block;\n width: 100%;\n height: 100%;\n color: $link-color;\n visibility: hidden;\n }\n }\n\n .anchor-heading:hover,\n .anchor-heading:focus,\n h1:hover > .anchor-heading,\n h2:hover > .anchor-heading,\n h3:hover > .anchor-heading,\n h4:hover > .anchor-heading,\n h5:hover > .anchor-heading,\n h6:hover > .anchor-heading {\n svg {\n visibility: visible;\n }\n }\n\n summary {\n cursor: pointer;\n }\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n #toctitle {\n position: relative;\n margin-top: 1.5em;\n margin-bottom: 0.25em;\n\n + table,\n + .table-wrapper,\n + .code-example,\n + .highlighter-rouge,\n + .sectionbody .listingblock {\n margin-top: 1em;\n }\n\n + p:not(.label) {\n margin-top: 0;\n }\n }\n\n > h1:first-child,\n > h2:first-child,\n > h3:first-child,\n > h4:first-child,\n > h5:first-child,\n > h6:first-child,\n > .sect1:first-child > h2,\n > .sect2:first-child > h3,\n > .sect3:first-child > h4,\n > .sect4:first-child > h5,\n > .sect5:first-child > h6 {\n margin-top: $sp-2;\n }\n}\n","// Main nav, breadcrumb, etc...\n// stylelint-disable selector-no-type, max-nesting-depth, selector-max-compound-selectors, selector-max-type, selector-max-specificity\n\n.nav-list {\n padding: 0;\n margin-top: 0;\n margin-bottom: 0;\n list-style: none;\n\n .nav-list-item {\n position: relative;\n margin: 0;\n\n @include fs-4;\n\n @include mq(md) {\n @include fs-3;\n }\n\n .nav-list-link {\n display: block;\n min-height: $nav-list-item-height-sm;\n padding-top: $sp-1;\n padding-bottom: $sp-1;\n line-height: #{$nav-list-item-height-sm - 2 * $sp-1};\n @if $nav-list-expander-right {\n padding-right: $nav-list-item-height-sm;\n padding-left: $gutter-spacing-sm;\n } @else {\n padding-right: $gutter-spacing-sm;\n padding-left: $nav-list-item-height-sm;\n }\n\n @include mq(md) {\n min-height: $nav-list-item-height;\n line-height: #{$nav-list-item-height - 2 * $sp-1};\n @if $nav-list-expander-right {\n padding-right: $nav-list-item-height;\n padding-left: $gutter-spacing;\n } @else {\n padding-right: $gutter-spacing;\n padding-left: $nav-list-item-height;\n }\n }\n\n &.external > svg {\n width: $sp-4;\n height: $sp-4;\n vertical-align: text-bottom;\n }\n\n &.active {\n font-weight: 600;\n text-decoration: none;\n }\n\n &:hover,\n &.active {\n color: darken($link-color, 5%);\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 80%,\n rgba($feedback-color, 0) 100%\n );\n }\n }\n\n .nav-list-expander {\n position: absolute;\n @if $nav-list-expander-right {\n right: 0;\n }\n\n width: $nav-list-item-height-sm;\n height: $nav-list-item-height-sm;\n padding: #{$nav-list-item-height-sm * 0.25};\n color: $link-color;\n\n @include mq(md) {\n width: $nav-list-item-height;\n height: $nav-list-item-height;\n padding: #{$nav-list-item-height * 0.25};\n }\n\n &:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 100%\n );\n }\n\n @if $nav-list-expander-right {\n svg {\n transform: rotate(90deg);\n }\n }\n }\n\n > .nav-list {\n display: none;\n padding-left: $sp-3;\n list-style: none;\n\n .nav-list-item {\n position: relative;\n\n .nav-list-link {\n color: $nav-child-link-color;\n }\n\n .nav-list-expander {\n color: $nav-child-link-color;\n }\n }\n }\n\n &.active {\n > .nav-list-expander svg {\n @if $nav-list-expander-right {\n transform: rotate(-90deg);\n } @else {\n transform: rotate(90deg);\n }\n }\n\n > .nav-list {\n display: block;\n }\n }\n }\n}\n\n.nav-category {\n padding: $sp-2 $gutter-spacing-sm;\n font-weight: 600;\n text-align: start;\n text-transform: uppercase;\n border-bottom: $border $border-color;\n @include fs-2;\n\n @include mq(md) {\n padding: $sp-2 $gutter-spacing;\n margin-top: $gutter-spacing-sm;\n text-align: start;\n\n &:first-child {\n margin-top: 0;\n }\n }\n}\n\n.nav-list.nav-category-list {\n > .nav-list-item {\n margin: 0;\n\n > .nav-list {\n padding: 0;\n\n > .nav-list-item {\n > .nav-list-link {\n color: $link-color;\n }\n\n > .nav-list-expander {\n color: $link-color;\n }\n }\n }\n }\n}\n\n// Aux nav\n\n.aux-nav {\n height: 100%;\n overflow-x: auto;\n @include fs-2;\n\n .aux-nav-list {\n display: flex;\n height: 100%;\n padding: 0;\n margin: 0;\n list-style: none;\n }\n\n .aux-nav-list-item {\n display: inline-block;\n height: 100%;\n padding: 0;\n margin: 0;\n }\n\n @include mq(md) {\n padding-right: $gutter-spacing-sm;\n }\n}\n\n// Breadcrumb nav\n\n.breadcrumb-nav {\n @include mq(md) {\n margin-top: -$sp-4;\n }\n}\n\n.breadcrumb-nav-list {\n padding-left: 0;\n margin-bottom: $sp-3;\n list-style: none;\n}\n\n.breadcrumb-nav-list-item {\n display: table-cell;\n @include fs-2;\n\n &::before {\n display: none;\n }\n\n &::after {\n display: inline-block;\n margin-right: $sp-2;\n margin-left: $sp-2;\n color: $grey-dk-000;\n content: \"/\";\n }\n\n &:last-child {\n &::after {\n content: \"\";\n }\n }\n}\n","// Typography\n// stylelint-disable selector-no-type, selector-max-type, selector-max-specificity, selector-max-id\n\nh1,\n.text-alpha {\n font-weight: 300;\n\n @include fs-8;\n}\n\nh2,\n.text-beta,\n#toctitle {\n @include fs-6;\n}\n\nh3,\n.text-gamma {\n @include fs-5;\n}\n\nh4,\n.text-delta {\n font-weight: 400;\n text-transform: uppercase;\n letter-spacing: 0.1em;\n\n @include fs-2;\n}\n\nh4 code {\n text-transform: none;\n}\n\nh5,\n.text-epsilon {\n @include fs-3;\n}\n\nh6,\n.text-zeta {\n @include fs-2;\n}\n\n.text-small {\n @include fs-2;\n}\n\n.text-mono {\n font-family: $mono-font-family !important;\n}\n\n.text-left {\n text-align: left !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n.text-right {\n text-align: right !important;\n}\n","// Labels (not the form kind)\n\n// this :not() prevents a style clash with Mermaid.js's\n// diagram labels, which also use .label\n// for more, see https://github.com/just-the-docs/just-the-docs/issues/1272\n// and the accompanying PR\n.label:not(g),\n.label-blue:not(g) {\n display: inline-block;\n padding: 0.16em 0.56em;\n margin-right: $sp-2;\n margin-left: $sp-2;\n color: $white;\n text-transform: uppercase;\n vertical-align: middle;\n background-color: $blue-100;\n border-radius: 12px;\n\n @include fs-2;\n}\n\n.label-green:not(g) {\n background-color: $green-300;\n}\n\n.label-purple:not(g) {\n background-color: $purple-100;\n}\n\n.label-red:not(g) {\n background-color: $red-300;\n}\n\n.label-yellow:not(g) {\n color: $grey-dk-200;\n background-color: $yellow-200;\n}\n","// Buttons and things that look like buttons\n// stylelint-disable color-named\n\n.btn {\n display: inline-block;\n box-sizing: border-box;\n padding: 0.3em 1em;\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n font-weight: 500;\n line-height: 1.5;\n color: $link-color;\n text-decoration: none;\n vertical-align: baseline;\n cursor: pointer;\n background-color: $base-button-color;\n border-width: 0;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n appearance: none;\n\n &:focus {\n text-decoration: none;\n outline: none;\n box-shadow: 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:focus:hover,\n &.selected:focus {\n box-shadow: 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:hover,\n &.zeroclipboard-is-hover {\n color: darken($link-color, 2%);\n }\n\n &:hover,\n &:active,\n &.zeroclipboard-is-hover,\n &.zeroclipboard-is-active {\n text-decoration: none;\n background-color: darken($base-button-color, 1%);\n }\n\n &:active,\n &.selected,\n &.zeroclipboard-is-active {\n background-color: darken($base-button-color, 3%);\n background-image: none;\n box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15);\n }\n\n &.selected:hover {\n background-color: darken(#dcdcdc, 5%);\n }\n\n &:disabled,\n &.disabled {\n &,\n &:hover {\n color: rgba(102, 102, 102, 0.5);\n cursor: default;\n background-color: rgba(229, 229, 229, 0.5);\n background-image: none;\n box-shadow: none;\n }\n }\n}\n\n.btn-outline {\n color: $link-color;\n background: transparent;\n box-shadow: inset 0 0 0 2px $grey-lt-300;\n\n &:hover,\n &:active,\n &.zeroclipboard-is-hover,\n &.zeroclipboard-is-active {\n color: darken($link-color, 4%);\n text-decoration: none;\n background-color: transparent;\n box-shadow: inset 0 0 0 3px $grey-lt-300;\n }\n\n &:focus {\n text-decoration: none;\n outline: none;\n box-shadow:\n inset 0 0 0 2px $grey-dk-100,\n 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:focus:hover,\n &.selected:focus {\n box-shadow: inset 0 0 0 2px $grey-dk-100;\n }\n}\n\n.btn-primary {\n @include btn-color($white, $btn-primary-color);\n}\n\n.btn-purple {\n @include btn-color($white, $purple-100);\n}\n\n.btn-blue {\n @include btn-color($white, $blue-200);\n}\n\n.btn-green {\n @include btn-color($white, $green-300);\n}\n\n.btn-reset {\n background: none;\n border: none;\n margin: 0;\n text-align: inherit;\n font: inherit;\n border-radius: 0;\n appearance: none;\n}\n","$color-scheme: light !default;\n$body-background-color: $white !default;\n$body-heading-color: $grey-dk-300 !default;\n$body-text-color: $grey-dk-100 !default;\n$link-color: $purple-000 !default;\n$nav-child-link-color: $grey-dk-100 !default;\n$sidebar-color: $grey-lt-000 !default;\n$base-button-color: #f7f7f7 !default;\n$btn-primary-color: $purple-100 !default;\n$code-background-color: $white !default;\n$feedback-color: darken($sidebar-color, 3%) !default;\n$table-background-color: $white !default;\n$search-background-color: $white !default;\n$search-result-preview-color: $grey-dk-100 !default;\n\n@import \"./vendor/accessible-pygments/github-light\";\n","// Colored button\n\n@mixin btn-color($fg, $bg) {\n color: $fg;\n background-color: darken($bg, 2%);\n background-image: linear-gradient(lighten($bg, 5%), darken($bg, 2%));\n box-shadow:\n 0 1px 3px rgba(0, 0, 0, 0.25),\n 0 4px 10px rgba(0, 0, 0, 0.12);\n\n &:hover,\n &.zeroclipboard-is-hover {\n color: $fg;\n background-color: darken($bg, 4%);\n background-image: linear-gradient((lighten($bg, 2%), darken($bg, 4%)));\n }\n\n &:active,\n &.selected,\n &.zeroclipboard-is-active {\n background-color: darken($bg, 5%);\n background-image: none;\n box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15);\n }\n\n &.selected:hover {\n background-color: darken($bg, 10%);\n }\n}\n","// Search input and autocomplete\n\n.search {\n position: relative;\n z-index: 2;\n flex-grow: 1;\n height: $sp-10;\n padding: $sp-2;\n transition: padding linear #{$transition-duration * 0.5};\n\n @include mq(md) {\n position: relative !important;\n width: auto !important;\n height: 100% !important;\n padding: 0;\n transition: none;\n }\n}\n\n.search-input-wrap {\n position: relative;\n z-index: 1;\n height: $sp-8;\n overflow: hidden;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n transition: height linear #{$transition-duration * 0.5};\n\n @include mq(md) {\n position: absolute;\n width: 100%;\n max-width: $search-results-width;\n height: 100% !important;\n border-radius: 0;\n box-shadow: none;\n transition: width ease $transition-duration;\n }\n}\n\n.search-input {\n position: absolute;\n width: 100%;\n height: 100%;\n padding: $sp-2 $gutter-spacing-sm $sp-2 #{$gutter-spacing-sm + $sp-5};\n font-size: 1rem;\n color: $body-text-color;\n background-color: $search-background-color;\n border-top: 0;\n border-right: 0;\n border-bottom: 0;\n border-left: 0;\n border-radius: 0;\n\n @include mq(md) {\n padding: $sp-2 $gutter-spacing-sm $sp-2 #{$gutter-spacing + $sp-5};\n font-size: 0.875rem;\n background-color: $body-background-color;\n transition: padding-left linear #{$transition-duration * 0.5};\n }\n\n &:focus {\n outline: 2px solid $link-color;\n outline-offset: -2px;\n\n + .search-label .search-icon {\n color: $link-color;\n }\n }\n}\n\n.search-label {\n position: absolute;\n display: flex;\n height: 100%;\n padding-left: $gutter-spacing-sm;\n\n @include mq(md) {\n padding-left: $gutter-spacing;\n transition: padding-left linear #{$transition-duration * 0.5};\n }\n\n .search-icon {\n width: #{$sp-4 * 1.2};\n height: #{$sp-4 * 1.2};\n align-self: center;\n color: $grey-dk-000;\n }\n}\n\n.search-results {\n position: absolute;\n left: 0;\n display: none;\n width: 100%;\n max-height: calc(100% - #{$sp-10});\n overflow-y: auto;\n background-color: $search-background-color;\n border-bottom-right-radius: $border-radius;\n border-bottom-left-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n\n @include mq(md) {\n top: 100%;\n width: $search-results-width;\n max-height: calc(100vh - 200%) !important;\n }\n}\n\n.search-results-list {\n padding-left: 0;\n margin-bottom: $sp-1;\n list-style: none;\n @include fs-4;\n\n @include mq(md) {\n @include fs-3;\n }\n}\n\n.search-results-list-item {\n padding: 0;\n margin: 0;\n}\n\n.search-result {\n display: block;\n padding: $sp-1 $sp-3;\n\n &:hover,\n &.active {\n background-color: $feedback-color;\n }\n}\n\n.search-result-title {\n display: block;\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n\n @include mq(sm) {\n display: inline-block;\n width: 40%;\n padding-right: $sp-2;\n vertical-align: top;\n }\n}\n\n.search-result-doc {\n display: flex;\n align-items: center;\n word-wrap: break-word;\n\n &.search-result-doc-parent {\n opacity: 0.5;\n @include fs-3;\n\n @include mq(md) {\n @include fs-2;\n }\n }\n\n .search-result-icon {\n width: $sp-4;\n height: $sp-4;\n margin-right: $sp-2;\n color: $link-color;\n flex-shrink: 0;\n }\n\n .search-result-doc-title {\n overflow: auto;\n }\n}\n\n.search-result-section {\n margin-left: #{$sp-4 + $sp-2};\n word-wrap: break-word;\n}\n\n.search-result-rel-url {\n display: block;\n margin-left: #{$sp-4 + $sp-2};\n overflow: hidden;\n color: $search-result-preview-color;\n text-overflow: ellipsis;\n white-space: nowrap;\n @include fs-1;\n}\n\n.search-result-previews {\n display: block;\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n padding-left: $sp-4;\n margin-left: $sp-2;\n color: $search-result-preview-color;\n word-wrap: break-word;\n border-left: $border;\n border-left-color: $border-color;\n @include fs-2;\n\n @include mq(sm) {\n display: inline-block;\n width: 60%;\n padding-left: $sp-2;\n margin-left: 0;\n vertical-align: top;\n }\n}\n\n.search-result-preview + .search-result-preview {\n margin-top: $sp-1;\n}\n\n.search-result-highlight {\n font-weight: bold;\n}\n\n.search-no-result {\n padding: $sp-2 $sp-3;\n @include fs-3;\n}\n\n.search-button {\n position: fixed;\n right: $sp-4;\n bottom: $sp-4;\n display: flex;\n width: $sp-9;\n height: $sp-9;\n background-color: $search-background-color;\n border: 1px solid rgba($link-color, 0.3);\n border-radius: #{$sp-9 * 0.5};\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n align-items: center;\n justify-content: center;\n}\n\n.search-overlay {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1;\n width: 0;\n height: 0;\n background-color: rgba(0, 0, 0, 0.3);\n opacity: 0;\n transition:\n opacity ease $transition-duration,\n width 0s $transition-duration,\n height 0s $transition-duration;\n}\n\n.search-active {\n .search {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n padding: 0;\n }\n\n .search-input-wrap {\n height: $sp-10;\n border-radius: 0;\n\n @include mq(md) {\n width: $search-results-width;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n }\n }\n\n .search-input {\n background-color: $search-background-color;\n\n @include mq(md) {\n padding-left: 2.3rem;\n }\n }\n\n .search-label {\n @include mq(md) {\n padding-left: 0.6rem;\n }\n }\n\n .search-results {\n display: block;\n }\n\n .search-overlay {\n width: 100%;\n height: 100%;\n opacity: 1;\n transition:\n opacity ease $transition-duration,\n width 0s,\n height 0s;\n }\n\n @include mq(md) {\n .main {\n position: fixed;\n right: 0;\n left: 0;\n }\n }\n\n .main-header {\n padding-top: $sp-10;\n\n @include mq(md) {\n padding-top: 0;\n }\n }\n}\n","// Tables\n// stylelint-disable max-nesting-depth, selector-no-type, selector-max-type\n\n.table-wrapper {\n display: block;\n width: 100%;\n max-width: 100%;\n margin-bottom: $sp-5;\n overflow-x: auto;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n}\n\ntable {\n display: table;\n min-width: 100%;\n border-collapse: separate;\n}\n\nth,\ntd {\n min-width: 7.5rem;\n padding: $sp-2 $sp-3;\n background-color: $table-background-color;\n border-bottom: $border rgba($border-color, 0.5);\n border-left: $border $border-color;\n\n @include fs-3;\n\n &:first-of-type {\n border-left: 0;\n }\n}\n\ntbody {\n tr {\n &:last-of-type {\n th,\n td {\n border-bottom: 0;\n }\n\n td {\n padding-bottom: $sp-3;\n }\n }\n }\n}\n\nthead {\n th {\n border-bottom: $border $border-color;\n }\n}\n","// Code and syntax highlighting\n// stylelint-disable selector-no-qualifying-type, declaration-block-semicolon-newline-after,declaration-block-single-line-max-declarations, selector-no-type, selector-max-type, scss/comment-no-empty\n\n// {% raw %}\n\n// This instruction applies to all queues not within 'pre' or 'figure', avoiding 'code' generated by the highlight.\n:not(pre, figure) {\n & > code {\n padding: 0.2em 0.15em;\n font-weight: 400;\n background-color: $code-background-color;\n border: $border $border-color;\n border-radius: $border-radius;\n }\n}\n\n// Avoid appearance of dark border around visited code links in Safari\na:visited code {\n border-color: $border-color;\n}\n\n// Content structure for highlighted code blocks using fences or Liquid\n//\n// ```[LANG]...```, no kramdown line_numbers:\n// div.[language-LANG.]highlighter-rouge > div.highlight > pre.highlight > code\n//\n// ```[LANG]...```, kramdown line_numbers = true:\n// div.[language-LANG.]highlighter-rouge > div.highlight > pre.highlight > code\n// > div.table-wrapper > table.rouge-table > tbody > tr\n// > td.rouge-gutter.gl > pre.lineno\n// | td.rouge-code > pre\n//\n// {% highlight LANG %}...{% endhighlight %}:\n// figure.highlight > pre > code.language-LANG\n//\n// {% highlight LANG linenos %}...{% endhighlight %}:\n// figure.highlight > pre > code.language-LANG\n// > div.table-wrapper > table.rouge-table > tbody > tr\n// > td.gutter.gl > pre.lineno\n// | td.code > pre\n//\n// ----...---- (AsciiDoc)\n// div.listingblock > div.content > pre.rouge.highlight\n//\n// fix_linenos removes the outermost pre when it encloses table.rouge-table\n//\n// See docs/index-test.md for some tests.\n//\n// No kramdown line_numbers: fences and Liquid highlighting look the same.\n// Kramdown line_numbers = true: fences have a wider gutter than with Liquid?\n\n// ```[LANG]...```\n// or in AsciiDoc:\n//\n// ----\n// ...\n// ----\n\n// the code may appear with 3 different types:\n// container \\ case: default case, code with line number, code with html rendering\n// top level: div.highlighter-rouge, figure.highlight, figure.highlight\n// second level: div.highlight, div.table-wrapper, pre.highlight\n// third level: pre.highlight, td.code, absent\n// last level: code, pre, code (optionality)\n// highlighter level: span, span, span\n// the spacing are only in the second level for case 1, 3 and in the third level for case 2\n// in AsciiDoc, there is a parent container that contains optionally a title and the content.\n\n// select top level container\ndiv.highlighter-rouge,\ndiv.listingblock > div.content,\nfigure.highlight {\n margin-top: 0;\n margin-bottom: $sp-3;\n background-color: $code-background-color;\n border-radius: $border-radius;\n box-shadow: none;\n -webkit-overflow-scrolling: touch;\n position: relative;\n padding: 0;\n\n // copy button (or other button)\n // the button appear only when there is a hover on the code or focus on button\n > button {\n width: $sp-3;\n opacity: 0;\n position: absolute;\n top: 0;\n right: 0;\n padding: $sp-3;\n border: none;\n background: none;\n color: $body-text-color;\n box-sizing: content-box;\n\n svg {\n fill: $body-text-color;\n }\n\n &:active {\n text-decoration: none;\n outline: none;\n opacity: 1;\n }\n\n &:focus {\n opacity: 1;\n outline: 2px solid $link-color;\n }\n }\n\n // the button can be seen by doing a simple hover in the code, there is no need to go over the location of the button\n &:hover {\n > button {\n cursor: copy;\n opacity: 1;\n }\n }\n}\n\n// setting the spacing and scrollbar on the second level for the first case\n// remove all space on the second and third level\n// this is a mixin to accommodate for the slightly different structures generated via Markdown vs AsciiDoc\n@mixin scroll-and-spacing($code-div, $pre-select) {\n #{$code-div} {\n overflow-x: auto;\n padding: $sp-3;\n margin: 0;\n border: 1px solid $body-text-color;\n border-radius: $border-radius;\n }\n\n #{$pre-select},\n code {\n padding: 0;\n margin: 0;\n border: 0;\n }\n}\n\n// for Markdown\ndiv.highlighter-rouge {\n @include scroll-and-spacing(\"div.highlight\", \"pre.highlight\");\n}\n\n// for AsciiDoc. we also need to fix the margins for its parent container.\ndiv.listingblock {\n margin-top: 0;\n margin-bottom: $sp-3;\n\n @include scroll-and-spacing(\"div.content\", \"div.content > pre\");\n}\n\n// {% highlight LANG %}...{% endhighlight %},\n// {% highlight LANG linenos %}...{% endhighlight %}:\n\n// setting the spacing and scrollbar on the second level for the thirt case\n// the css rule are apply only to the last code enviroment\n// setting the scroolbar\nfigure.highlight {\n pre,\n :not(pre) > code {\n overflow-x: auto;\n padding: $sp-3;\n margin: 0;\n border: 1px solid $body-text-color;\n border-radius: $border-radius;\n }\n}\n\n// ```[LANG]...```, kramdown line_numbers = true,\n// {% highlight LANG linenos %}...{% endhighlight %}:\n\n// setting the spacing and scrollbar on the thirt level for the second case\n.highlight .table-wrapper {\n padding: $sp-3 0;\n margin: 0;\n border: 0;\n box-shadow: none;\n\n td,\n pre {\n min-width: 0;\n padding: 0;\n background-color: $code-background-color;\n border: 0;\n\n @include fs-2;\n }\n\n td.gl {\n width: 1em;\n padding-right: $sp-3;\n padding-left: $sp-3;\n }\n\n pre {\n margin: 0;\n line-height: 2;\n }\n}\n\n// Code examples: html render of a code\n.code-example,\n.listingblock > .title {\n padding: $sp-3;\n margin-bottom: $sp-3;\n overflow: auto;\n border: 1px solid $border-color;\n border-radius: $border-radius;\n\n + .highlighter-rouge,\n + .sectionbody .listingblock,\n + .content,\n + figure.highlight {\n position: relative;\n margin-top: -$sp-4;\n border-right: 1px solid $border-color;\n border-bottom: 1px solid $border-color;\n border-left: 1px solid $border-color;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n }\n}\n\n// Mermaid diagram code blocks should be left unstyled.\ncode.language-mermaid {\n padding: 0;\n background-color: inherit;\n border: 0;\n}\n\n// Override OneDarkJekyll Colors for Code Blocks\n.highlight,\npre.highlight {\n background: $code-background-color; // Code Background\n // For Backwards Compatibility Before $code-linenumber-color was added\n @if variable-exists(code-linenumber-color) {\n color: $code-linenumber-color; // Code Line Numbers\n } @else {\n color: $body-text-color; // Code Line Numbers\n }\n}\n\n// Override OneDarkJekyll Colors for Code Blocks\n.highlight pre {\n background: $code-background-color; // Code Background\n}\n\n// {% endraw %}\n","// Utility classes for colors\n\n// Text colors\n\n.text-grey-dk-000 {\n color: $grey-dk-000 !important;\n}\n\n.text-grey-dk-100 {\n color: $grey-dk-100 !important;\n}\n\n.text-grey-dk-200 {\n color: $grey-dk-200 !important;\n}\n\n.text-grey-dk-250 {\n color: $grey-dk-250 !important;\n}\n\n.text-grey-dk-300 {\n color: $grey-dk-300 !important;\n}\n\n.text-grey-lt-000 {\n color: $grey-lt-000 !important;\n}\n\n.text-grey-lt-100 {\n color: $grey-lt-100 !important;\n}\n\n.text-grey-lt-200 {\n color: $grey-lt-200 !important;\n}\n\n.text-grey-lt-300 {\n color: $grey-lt-300 !important;\n}\n\n.text-blue-000 {\n color: $blue-000 !important;\n}\n\n.text-blue-100 {\n color: $blue-100 !important;\n}\n\n.text-blue-200 {\n color: $blue-200 !important;\n}\n\n.text-blue-300 {\n color: $blue-300 !important;\n}\n\n.text-green-000 {\n color: $green-000 !important;\n}\n\n.text-green-100 {\n color: $green-100 !important;\n}\n\n.text-green-200 {\n color: $green-200 !important;\n}\n\n.text-green-300 {\n color: $green-300 !important;\n}\n\n.text-purple-000 {\n color: $purple-000 !important;\n}\n\n.text-purple-100 {\n color: $purple-100 !important;\n}\n\n.text-purple-200 {\n color: $purple-200 !important;\n}\n\n.text-purple-300 {\n color: $purple-300 !important;\n}\n\n.text-yellow-000 {\n color: $yellow-000 !important;\n}\n\n.text-yellow-100 {\n color: $yellow-100 !important;\n}\n\n.text-yellow-200 {\n color: $yellow-200 !important;\n}\n\n.text-yellow-300 {\n color: $yellow-300 !important;\n}\n\n.text-red-000 {\n color: $red-000 !important;\n}\n\n.text-red-100 {\n color: $red-100 !important;\n}\n\n.text-red-200 {\n color: $red-200 !important;\n}\n\n.text-red-300 {\n color: $red-300 !important;\n}\n\n// Background colors\n\n.bg-grey-dk-000 {\n background-color: $grey-dk-000 !important;\n}\n\n.bg-grey-dk-100 {\n background-color: $grey-dk-100 !important;\n}\n\n.bg-grey-dk-200 {\n background-color: $grey-dk-200 !important;\n}\n\n.bg-grey-dk-250 {\n background-color: $grey-dk-250 !important;\n}\n\n.bg-grey-dk-300 {\n background-color: $grey-dk-300 !important;\n}\n\n.bg-grey-lt-000 {\n background-color: $grey-lt-000 !important;\n}\n\n.bg-grey-lt-100 {\n background-color: $grey-lt-100 !important;\n}\n\n.bg-grey-lt-200 {\n background-color: $grey-lt-200 !important;\n}\n\n.bg-grey-lt-300 {\n background-color: $grey-lt-300 !important;\n}\n\n.bg-blue-000 {\n background-color: $blue-000 !important;\n}\n\n.bg-blue-100 {\n background-color: $blue-100 !important;\n}\n\n.bg-blue-200 {\n background-color: $blue-200 !important;\n}\n\n.bg-blue-300 {\n background-color: $blue-300 !important;\n}\n\n.bg-green-000 {\n background-color: $green-000 !important;\n}\n\n.bg-green-100 {\n background-color: $green-100 !important;\n}\n\n.bg-green-200 {\n background-color: $green-200 !important;\n}\n\n.bg-green-300 {\n background-color: $green-300 !important;\n}\n\n.bg-purple-000 {\n background-color: $purple-000 !important;\n}\n\n.bg-purple-100 {\n background-color: $purple-100 !important;\n}\n\n.bg-purple-200 {\n background-color: $purple-200 !important;\n}\n\n.bg-purple-300 {\n background-color: $purple-300 !important;\n}\n\n.bg-yellow-000 {\n background-color: $yellow-000 !important;\n}\n\n.bg-yellow-100 {\n background-color: $yellow-100 !important;\n}\n\n.bg-yellow-200 {\n background-color: $yellow-200 !important;\n}\n\n.bg-yellow-300 {\n background-color: $yellow-300 !important;\n}\n\n.bg-red-000 {\n background-color: $red-000 !important;\n}\n\n.bg-red-100 {\n background-color: $red-100 !important;\n}\n\n.bg-red-200 {\n background-color: $red-200 !important;\n}\n\n.bg-red-300 {\n background-color: $red-300 !important;\n}\n","// Utility classes for layout\n\n// Display\n\n.d-block {\n display: block !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-none {\n display: none !important;\n}\n\n// Screenreader-only\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border-width: 0;\n}\n\n@each $media-query in map-keys($media-queries) {\n @for $i from 1 through length($spacers) {\n @include mq($media-query) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .d-sm-block, .d-md-none, .d-lg-inline\n .d-#{$media-query}-block {\n display: block !important;\n }\n .d-#{$media-query}-flex {\n display: flex !important;\n }\n .d-#{$media-query}-inline {\n display: inline !important;\n }\n .d-#{$media-query}-inline-block {\n display: inline-block !important;\n }\n .d-#{$media-query}-none {\n display: none !important;\n }\n }\n }\n}\n\n// Horizontal alignment\n\n.float-left {\n float: left !important;\n}\n\n.float-right {\n float: right !important;\n}\n\n.flex-justify-start {\n justify-content: flex-start !important;\n}\n\n.flex-justify-end {\n justify-content: flex-end !important;\n}\n\n.flex-justify-between {\n justify-content: space-between !important;\n}\n\n.flex-justify-around {\n justify-content: space-around !important;\n}\n\n// Vertical alignment\n\n.v-align-baseline {\n vertical-align: baseline !important;\n}\n\n.v-align-bottom {\n vertical-align: bottom !important;\n}\n\n.v-align-middle {\n vertical-align: middle !important;\n}\n\n.v-align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.v-align-text-top {\n vertical-align: text-top !important;\n}\n\n.v-align-top {\n vertical-align: top !important;\n}\n","// Utility classes for typography\n\n.fs-1 {\n @include fs-1;\n}\n\n.fs-2 {\n @include fs-2;\n}\n\n.fs-3 {\n @include fs-3;\n}\n\n.fs-4 {\n @include fs-4;\n}\n\n.fs-5 {\n @include fs-5;\n}\n\n.fs-6 {\n @include fs-6;\n}\n\n.fs-7 {\n @include fs-7;\n}\n\n.fs-8 {\n @include fs-8;\n}\n\n.fs-9 {\n @include fs-9;\n}\n\n.fs-10 {\n @include fs-10;\n}\n\n.fw-300 {\n font-weight: 300 !important;\n}\n\n.fw-400 {\n font-weight: 400 !important;\n}\n\n.fw-500 {\n font-weight: 500 !important;\n}\n\n.fw-700 {\n font-weight: 700 !important;\n}\n\n.lh-0 {\n line-height: 0 !important;\n}\n\n.lh-default {\n line-height: $body-line-height;\n}\n\n.lh-tight {\n line-height: $body-heading-line-height;\n}\n\n.ls-5 {\n letter-spacing: 0.05em !important;\n}\n\n.ls-10 {\n letter-spacing: 0.1em !important;\n}\n\n.ls-0 {\n letter-spacing: 0 !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n","// Utility classes for lists\n\n// stylelint-disable selector-max-type\n\n.list-style-none {\n padding: 0 !important;\n margin: 0 !important;\n list-style: none !important;\n\n li {\n &::before {\n display: none !important;\n }\n }\n}\n","// Utility classes for margins and padding\n\n// stylelint-disable block-opening-brace-space-after, block-opening-brace-space-before\n\n// Margin spacer utilities\n\n.mx-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n}\n\n@for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .m-0, .m-1, .m-2...\n .m-#{$scale} {\n margin: #{$size} !important;\n }\n .mt-#{$scale} {\n margin-top: #{$size} !important;\n }\n .mr-#{$scale} {\n margin-right: #{$size} !important;\n }\n .mb-#{$scale} {\n margin-bottom: #{$size} !important;\n }\n .ml-#{$scale} {\n margin-left: #{$size} !important;\n }\n\n .mx-#{$scale} {\n margin-right: #{$size} !important;\n margin-left: #{$size} !important;\n }\n\n .my-#{$scale} {\n margin-top: #{$size} !important;\n margin-bottom: #{$size} !important;\n }\n\n .mxn-#{$scale} {\n margin-right: -#{$size} !important;\n margin-left: -#{$size} !important;\n }\n .mx-#{$scale}-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n}\n\n@each $media-query in map-keys($media-queries) {\n @for $i from 1 through length($spacers) {\n @include mq($media-query) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .m-sm-0, .m-md-1, .m-lg-2...\n .m-#{$media-query}-#{$scale} {\n margin: #{$size} !important;\n }\n .mt-#{$media-query}-#{$scale} {\n margin-top: #{$size} !important;\n }\n .mr-#{$media-query}-#{$scale} {\n margin-right: #{$size} !important;\n }\n .mb-#{$media-query}-#{$scale} {\n margin-bottom: #{$size} !important;\n }\n .ml-#{$media-query}-#{$scale} {\n margin-left: #{$size} !important;\n }\n\n .mx-#{$media-query}-#{$scale} {\n margin-right: #{$size} !important;\n margin-left: #{$size} !important;\n }\n\n .my-#{$media-query}-#{$scale} {\n margin-top: #{$size} !important;\n margin-bottom: #{$size} !important;\n }\n\n .mxn-#{$media-query}-#{$scale} {\n margin-right: -#{$size} !important;\n margin-left: -#{$size} !important;\n }\n }\n }\n}\n\n// Padding spacer utilities\n\n@for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .p-0, .p-1, .p-2...\n .p-#{$scale} {\n padding: #{$size} !important;\n }\n .pt-#{$scale} {\n padding-top: #{$size} !important;\n }\n .pr-#{$scale} {\n padding-right: #{$size} !important;\n }\n .pb-#{$scale} {\n padding-bottom: #{$size} !important;\n }\n .pl-#{$scale} {\n padding-left: #{$size} !important;\n }\n\n .px-#{$scale} {\n padding-right: #{$size} !important;\n padding-left: #{$size} !important;\n }\n\n .py-#{$scale} {\n padding-top: #{$size} !important;\n padding-bottom: #{$size} !important;\n }\n}\n\n@each $media-query in map-keys($media-queries) {\n @include mq($media-query) {\n @for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .p-sm-0, .p-md-1, .p-lg-2...\n .p-#{$media-query}-#{$scale} {\n padding: #{$size} !important;\n }\n .pt-#{$media-query}-#{$scale} {\n padding-top: #{$size} !important;\n }\n .pr-#{$media-query}-#{$scale} {\n padding-right: #{$size} !important;\n }\n .pb-#{$media-query}-#{$scale} {\n padding-bottom: #{$size} !important;\n }\n .pl-#{$media-query}-#{$scale} {\n padding-left: #{$size} !important;\n }\n\n .px-#{$media-query}-#{$scale} {\n padding-right: #{$size} !important;\n padding-left: #{$size} !important;\n }\n\n .py-#{$media-query}-#{$scale} {\n padding-top: #{$size} !important;\n padding-bottom: #{$size} !important;\n }\n }\n }\n}\n","// stylelint-disable selector-max-specificity, selector-max-id, selector-max-type, selector-no-qualifying-type\n\n@media print {\n .site-footer,\n .site-button,\n #edit-this-page,\n #back-to-top,\n .site-nav,\n .main-header {\n display: none !important;\n }\n\n hr {\n margin-top: 1rem;\n margin-bottom: 1rem;\n }\n\n .side-bar {\n width: 100%;\n height: auto;\n border-right: 0 !important;\n }\n\n .site-header {\n border-bottom: 1px solid $border-color;\n }\n\n .site-title {\n font-size: 1rem !important;\n font-weight: 700 !important;\n }\n\n .text-small {\n font-size: 8pt !important;\n }\n\n pre.highlight {\n border: 1px solid $border-color;\n }\n\n .main {\n max-width: none;\n margin-left: 0;\n }\n}\n","// Skipnav\n// Skip to main content\n\na.skip-to-main {\n left: -999px;\n position: absolute;\n top: auto;\n width: 1px;\n height: 1px;\n overflow: hidden;\n z-index: -999;\n}\n\na.skip-to-main:focus,\na.skip-to-main:active {\n color: $link-color;\n background-color: $body-background-color;\n left: auto;\n top: auto;\n width: 30%;\n height: auto;\n overflow: auto;\n margin: 10px 35%;\n padding: 5px;\n border-radius: 15px;\n border: 4px solid $btn-primary-color;\n text-align: center;\n font-size: 1.2em;\n z-index: 999;\n}\n","\n@import \"./support/support\";\n@import \"./custom/setup\";\n@import \"./color_schemes/light\";\n\n@import \"./color_schemes/meshtastic\";\n\n@import \"./modules\";\ndiv.opaque {\n background-color: $body-background-color;\n}\n\np.tip, blockquote.tip {\n border: 1px $green-000 solid;\n border-left: $border-radius solid $green-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $green-300;\n content: \"Tip\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .tip-title {\n color: $green-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.tip-title, blockquote.tip-title {\n border: 1px $green-000 solid;\n border-left: $border-radius solid $green-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $green-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.tip {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.tip-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n\np.note, blockquote.note {\n border: 1px $blue-000 solid;\n border-left: $border-radius solid $blue-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $blue-300;\n content: \"Note\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .note-title {\n color: $blue-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.note-title, blockquote.note-title {\n border: 1px $blue-000 solid;\n border-left: $border-radius solid $blue-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $blue-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.note {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.note-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n\np.warning, blockquote.warning {\n border: 1px $yellow-000 solid;\n border-left: $border-radius solid $yellow-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $yellow-300;\n content: \"Warning\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .warning-title {\n color: $yellow-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.warning-title, blockquote.warning-title {\n border: 1px $yellow-000 solid;\n border-left: $border-radius solid $yellow-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $yellow-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.warning {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.warning-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n@import \"./custom/custom\";\n\n\n"],"file":"just-the-docs-meshtastic.css"} \ No newline at end of file +{"version":3,"sourceRoot":"","sources":["../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/vendor/accessible-pygments/github-light.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/vendor/normalize.scss/normalize.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/base.scss","../../_sass/color_schemes/meshtastic.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/support/mixins/_typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/support/mixins/_layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/support/_variables.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/content.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/navigation.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/labels.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/buttons.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/color_schemes/light.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/support/mixins/_buttons.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/search.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/tables.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/code.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/utilities/_colors.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/utilities/_layout.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/utilities/_typography.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/utilities/_lists.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/utilities/_spacing.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/print.scss","../../../../../../../../../../tmp/jekyll-remote-theme-20260826-4071-yo2abw/_sass/skiptomain.scss","just-the-docs-meshtastic.scss"],"names":[],"mappings":";AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA;EAAkB;;;AAClB;EAAgB;EAAiB;AACjC;EAAkB;EAAiB;AACnC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAkB;EAAiB;AACnC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAqB;AACtC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAoB;AACrC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAgB;EAAiB;AACjC;EAAgB;EAAiB;AACjC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAgB;EAAiB;AACjC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AAClC;EAAiB;EAAiB;AChFlC;AAEA;AAAA;AAGA;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAAA;AAKA;EACE;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;EAEE;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;AAAA;EAGE;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;EAEE;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAAA;AAKA;AAAA;AAAA;AAAA;AAAA;EAKE;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;AAEE;EACA;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;AAEE;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;EAIE;;;AAGF;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;EAIE;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;EAIE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;AAAA;EAEE;EACA;;;AAGF;AAAA;AAAA;AAIA;AAAA;EAEE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAAA;AAKA;EACE;EACA;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAGA;AAAA;AAAA;AAIA;EACE;;;AAGF;AAAA;AAAA;AAIA;EACE;;;AC1VF;EACE,cCGa;;;ADAf;EACE;;;AAGF;EACE;;AEmBA;EACE;;AClBA;EHHJ;IEyBI;;;;AFnBJ;EACE,aIfiB;EJgBjB;EACA,aIbiB;EJcjB,OCTgB;EDUhB,kBCZsB;EDatB;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAYE;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;EACA;EACA;EACA,aI1CyB;EJ2CzB,OCvCmB;;;AD0CrB;EACE;EACA;;;AAGF;EACE,OC7CW;ED8CX;;;AAGF;EACE;EACA,uBCvCa;EDwCb;;AAEA;EACE;;;AAIJ;EACE,aIvEiB;EJwEjB;EACA,aIvEiB;;;AJ0EnB;AAAA;EAEE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA,kBCvEa;EDwEb;;;AAIF;EACE;EAGA;EACA;EACA;EACA;;;AK7GF;EACE;EACA;EACA;EACA,kBJKc;;AEGZ;EEZJ;IAOI;IACA;IACA,ODwFW;ICvFX;IACA;IACA;;;AFAA;EEZJ;IAgBI;IACA,WD+EQ;;;ADpFR;EEQF;IAEI,aD2ES;;;ADrFX;EEQF;IAQI;;;AAOF;EACE;EACA,kBJ5BU;;AEGZ;EEuBA;IAKI;IACA,kBJjCgB;;;AIoClB;EACE;;AFjCJ;EEgCE;IAII;;;;AAOV;EACE;;AF5CE;EE2CJ;IAII;IACA,WDyCY;;;;ACrChB;EACE,aDaK;ECZL,gBDYK;EDvDL,eCuDK;EDtDL,cCsDK;;ADlEH;EEoDJ;IFrCI,eCqDG;IDpDH,cCoDG;;;ADpEH;EEoDJ;IAOI,aDSG;ICRH,gBDQG;;;;ACJP;EACE;EACA;;AFlEE;EEgEJ;IAKI;IACA;IACA,QDmBY;;;;ACfhB;AAAA;AAAA;EAGE;;AF9EE;EE2EJ;AAAA;AAAA;IAMI,ODGQ;;;;ACCZ;EACE;;AAEA;EACE;;AFzFA;EEqFJ;IAQI;IACA,aDxBG;ICyBH,gBD7BG;IC8BH;IACA;;;;AAIJ;EACE;EACA,YDbc;ECcd;;AFxGE;EEqGJ;IAMI,QDjBY;ICkBZ,YDlBY;ICmBZ;;;;AAIJ;EACE;EACA;EACA;EACA;EACA,aDrDK;ECsDL,gBDtDK;ECuDL,OJzHmB;EEYnB,eCuDK;EDtDL,cCsDK;;ADlEH;EEiHJ;IFlGI,eCqDG;IDpDH,cCoDG;;;AF/BL;EACE;;ACtCA;EEiHJ;IHvEI;IACA,aEhDuB;;;ADKvB;EEiHJ;IAcI,aD/DG;ICgEH,gBDhEG;;;;AC+EP;EACE;EACA;EACA,SDhFK;ECiFL;;;AFnJE;EEuJF;IACE;;;AAIJ;EACE;;;AAQF;EACE;;;AAOF;EACE;EACA;EACA;EACA,aD/GK;ECgHL,gBDhHK;EDvDL,eCuDK;EDtDL,cCsDK;;ADlEH;EE6KJ;IF9JI,eCqDG;IDpDH,cCoDG;;;AFvEL;EACE;;ACEA;EE6KJ;IH3KI;;;ACFA;EE6KJ;IAYI;IACA;;;;AAIJ;EACE,OD5HK;EC6HL,QD7HK;EC8HL,OJ/LW;;;AKXb;EACE,aFEoB;;AEApB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;;AAGF;EACE;EACA;;AAGF;AAAA;EAEE;;AAIA;EACE,YF+CC;;AE3CL;EACE;EACA;;AAEA;EACE;;AAEA;EACE;EACA;EACA;EACA,OFfM;EEgBN;EACA;;AJ1BN;EACE;;ACRA;EG2BE;IJfF;;;ACZA;EG2BE;IAUI;;;AAIJ;EACE;;AAGE;EACE;EACA;;AAOV;EACE;;AAGE;EACE;EACA;EACA,OF7CM;EE8CN;;AAMJ;EACE;;AAIJ;EACE;EACA;;AAKF;EACE;;AAGF;EACE;;AAGF;EACE;EACA;;AAGF;AAAA;EAEE;;AAGF;EACE;EACA;EACA;;AAEA;EACE;;AAIJ;EACE;EACA;EACA;;AAmBE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;;AASF;AAAA;AAAA;AAAA;AAAA;AAAA;EAEE;;AAKN;EACE;EACA;EACA,OFnFG;EEoFH;EACA,eFzFG;EE0FH,cF1FG;EE2FH;;AH1JA;EGmJF;IAUI;IACA;;;AAGF;EACE;EACA;EACA;EACA,OLnKO;EKoKP;;AAYF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;;AAIJ;EACE;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAOE;EACA;EACA;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAKE;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;;AAIJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAWE,YF9JG;;;AG3EP;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;;ALoBF;EACE;;AClBA;EILF;IL2BE;;;ACtBA;EDOF;IACE;;;ACRA;EILF;ILiBE;;;AKPA;EACE;EACA,YH+DC;EG9DD,aHuDC;EGtDD,gBHsDC;EGrDD;EAEE,eH0DD;EGzDC,cHqDD;;ADlEH;EIKA;IAeI,YHgDD;IG/CC;IAEE,eH6CH;IG5CG,cH4CH;;;AGrCD;EACE,OHkCD;EGjCC,QHiCD;EGhCC;;AAGF;EACE;EACA;;AAGF;EAEE;EACA;;AASJ;EACE;EAEE;EAGF,OHUC;EGTD,QHSC;EGRD;EACA,ON7DO;;AEFT;EIsDA;IAYI,OHED;IGDC,QHCD;IGAC;;;AAGF;EACE;;AAQA;EACE;;AAKN;EACE;EACA,cHvBC;EGwBD;;AAEA;EACE;;AAEA;EACE,ONzFa;;AM4Ff;EACE,ON7Fa;;AMmGjB;EAEI;;AAMJ;EACE;;;AAMR;EACE;EACA;EACA;EACA;EACA;;ALhIA;EACE;;ACEA;EIwHJ;ILtHI;;;ACFA;EIwHJ;IASI;IACA,YHhEG;IGiEH;;EAEA;IACE;;;;AAMJ;EACE;;AAEA;EACE;;AAGE;EACE,ONlJG;;AMqJL;EACE,ONtJG;;;AM+Jb;EACE;EACA;;ALtKA;EACE;;ACEA;EIiKJ;IL/JI;;;AKoKF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AJlLA;EIiKJ;IAqBI,eHpHG;;;;ADlEH;EI4LJ;IAEI;;;;AAIJ;EACE;EACA,eHnIK;EGoIL;;;AAGF;EACE;;AL5MA;EACE;;ACEA;EIwMJ;ILtMI;;;AK0MF;EACE;;AAGF;EACE;EACA,cHlJG;EGmJH,aHnJG;EGoJH,OHpMU;EGqMV;;AAIA;EACE;;;ACrON;AAAA;EAEE;;ANoEA;AAAA;EACE;EACA,aElEuB;;ADKvB;EKXJ;AAAA;IN4EI;;;;AA5BF;AAAA;AAAA;EACE;;ACtCA;EKJJ;AAAA;AAAA;IN8CI;IACA,aEhDuB;;;;AFgCzB;AAAA;EACE;;AC5BA;EKEJ;AAAA;IN8BI;;;;AMzBJ;AAAA;EAEE;EACA;EACA;;ANdA;AAAA;EACE;;ACEA;EKOJ;AAAA;INLI;;;;AMcJ;EACE;;;ANVA;AAAA;EACE;;ACRA;EKoBJ;AAAA;INRI;;;;AAfF;AAAA;EACE;;ACEA;EKyBJ;AAAA;INvBI;;;;AALF;EACE;;ACEA;EK8BJ;IN5BI;;;;AMgCJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;ACvDF;AAAA;EAEE;EACA;EACA,cLoEK;EKnEL,aLmEK;EKlEL,OLiBM;EKhBN;EACA;EACA,kBL6BS;EK5BT;;APLA;AAAA;EACE;;ACEA;EMRJ;AAAA;IPUI;;;;AOKJ;EACE,kBL4BU;;;AKzBZ;EACE,kBLcW;;;AKXb;EACE,kBL4BQ;;;AKzBV;EACE,OLFY;EKGZ,kBLkBW;;;AMlDb;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,OTIW;ESHX;EACA;EACA;EACA,kBCTkB;EDUlB;EACA,eNyEc;EMxEd,YACE;EAEF;;AAEA;EACE;EACA;EACA;;AAGF;EAEE;;AAGF;EAEE;;AAGF;EAIE;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;AAKA;EAEE;EACA;EACA;EACA;EACA;;;AAKN;EACE,OT1DW;ES2DX;EACA;;AAEA;EAIE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA,YACE;;AAIJ;EAEE;;;AAIJ;EEnGE,OR0BM;EQzBN;EACA;EACA,YACE;;AAGF;EAEE,ORiBI;EQhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;AFgFJ;EEvGE,OR0BM;EQzBN;EACA;EACA,YACE;;AAGF;EAEE,ORiBI;EQhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;AFoFJ;EE3GE,OR0BM;EQzBN;EACA;EACA,YACE;;AAGF;EAEE,ORiBI;EQhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;AFwFJ;EE/GE,OR0BM;EQzBN;EACA;EACA,YACE;;AAGF;EAEE,ORiBI;EQhBJ;EACA;;AAGF;EAGE;EACA;EACA;;AAGF;EACE;;;AF4FJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AG3HF;EACE;EACA;EACA;EACA,QTgFM;ES/EN,STuEK;EStEL;;AVME;EUZJ;IASI;IACA;IACA;IACA;IACA;;;;AAIJ;EACE;EACA;EACA,QT8DK;ES7DL;EACA,eTmEc;ESlEd,YACE;EAEF;;AVdE;EUKJ;IAYI;IACA;IACA,WTwEmB;ISvEnB;IACA;IACA;IACA;;;;AAIJ;EACE;EACA;EACA;EACA;EACA;EACA,OZnCgB;EYoChB,kBZVwB;EYWxB;EACA;EACA;EACA;EACA;;AVvCE;EU2BJ;IAeI;IACA;IACA,kBZhDoB;IYiDpB;;;AAGF;EACE;EACA;;AAEA;EACE,OZnDO;;;AYwDb;EACE;EACA;EACA;EACA,cTIK;;ADlEH;EU0DJ;IAOI,cTGG;ISFH;;;AAGF;EACE;EACA;EACA;EACA,OTzDU;;;AS6Dd;EACE;EACA;EACA;EACA;EACA;EACA;EACA,kBZ5DwB;EY6DxB,4BTRc;ESSd,2BTTc;ESUd,YACE;;AVxFA;EU6EJ;IAeI;IACA,OTFmB;ISGnB;;;;AAIJ;EACE;EACA,eTrCK;ESsCL;;AXpFA;EACE;;AClBA;EUkGJ;IX5EI;;;ACtBA;EDOF;IACE;;;ACRA;EUkGJ;IXtFI;;;;AWiGJ;EACE;EACA;;;AAGF;EACE;EACA;;AAEA;EAEE,kBZnGa;;;AYuGjB;EACE;EACA,aT9DK;ES+DL,gBT/DK;;ADhEH;EU4HJ;IAMI;IACA;IACA,eTpEG;ISqEH;;;;AAIJ;EACE;EACA;EACA;;AAEA;EACE;;AXxIF;EACE;;ACRA;EU8IF;IXlIE;;;ACZA;EDHF;IACE;;;ACEA;EU8IF;IX5IE;;;AWqJF;EACE,OTtFG;ESuFH,QTvFG;ESwFH,cT1FG;ES2FH,OZzJS;EY0JT;;AAGF;EACE;;;AAIJ;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA,OZtK4B;EYuK5B;EACA;;AX5LA;EACE;;ACYA;EUyKJ;IXjLI;;;;AW2LJ;EACE;EACA,aTrHK;ESsHL,gBTtHK;ESuHL,cTrHK;ESsHL,aTxHK;ESyHL,OZlL4B;EYmL5B;EACA,aT/GO;ESgHP,mBZ9Ka;;ACjBb;EACE;;ACEA;EUmLJ;IXjLI;;;ACFA;EUmLJ;IAaI;IACA;IACA,cTlIG;ISmIH;IACA;;;;AAIJ;EACE,YT1IK;;;AS6IP;EACE;;;AAGF;EACE;;AX1MA;EACE;;ACRA;EUgNJ;IXpMI;;;;AWyMJ;EACE;EACA,OTrJK;ESsJL,QTtJK;ESuJL;EACA,OTnJK;ESoJL,QTpJK;ESqJL,kBZpMwB;EYqMxB;EACA;EACA,YACE;EAEF;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YACE;;;AAMF;EACE;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE,QTxLI;ESyLJ;;AVjQA;EU+PF;IAKI,OTzKiB;IS0KjB,YACE;;;AAKN;EACE,kBZpPsB;;AExBtB;EU2QF;IAII;;;AV/QF;EUmRF;IAEI;;;AAIJ;EACE;;AAGF;EACE;EACA;EACA;EACA,YACE;;AVlSF;EUwSA;IACE;IACA;IACA;;;AAIJ;EACE,aTxOI;;ADxEJ;EU+SF;IAII;;;;AC9TN;EACE;EACA;EACA;EACA,eV0EK;EUzEL;EACA,eVkFc;EUjFd,YACE;;;AAIJ;EACE;EACA;EACA;;;AAGF;AAAA;EAEE;EACA;EACA,kBbIuB;EaHvB;EACA;;AZNA;AAAA;EACE;;ACRA;EWOJ;AAAA;IZKI;;;AYKF;AAAA;EACE;;;AAOE;AAAA;EAEE;;AAGF;EACE,gBVkCD;;;AU3BL;EACE;;;AC9CF;EACE;EACA;EACA,kBdcoB;EcbpB;EACA,eX+EY;;;AW1EhB;EACE,cdUa;;;AcyCf;AAAA;AAAA;EAGE;EACA,eXMK;EWLL,kBdlDsB;EcmDtB,eXgBc;EWfd;EACA;EACA;EACA;;AAIA;AAAA;AAAA;EACE,OXLG;EWMH;EACA;EACA;EACA;EACA,SXVG;EWWH;EACA;EACA,OdhFc;EciFd;;AAEA;AAAA;AAAA;EACE,MdpFY;;AcuFd;AAAA;AAAA;EACE;EACA;EACA;;AAGF;AAAA;AAAA;EACE;EACA;;AAMF;AAAA;AAAA;EACE;EACA;;;AASJ;EACE;EACA,SX/CG;EWgDH;EACA;EACA,eXtCY;;AWyCd;AAAA;EAEE;EACA;EACA;;;AAUJ;EACE;EACA,eXrEK;;AW6CL;EACE;EACA,SX/CG;EWgDH;EACA;EACA,eXtCY;;AWyCd;AAAA;EAEE;EACA;EACA;;;AAwBF;AAAA;EAEE;EACA,SXpFG;EWqFH;EACA;EACA,eX3EY;;;AWmFhB;EACE;EACA;EACA;EACA;;AAEA;AAAA;EAEE;EACA;EACA,kBdhKoB;EciKpB;;Ab9KF;AAAA;EACE;;ACEA;EYsKF;AAAA;IbpKE;;;Aa8KF;EACE;EACA,eXjHG;EWkHH,cXlHG;;AWqHL;EACE;EACA;;;AAKJ;AAAA;EAEE,SX9HK;EW+HL,eX/HK;EWgIL;EACA;EACA,eXtHc;;AWwHd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAIE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAKJ;EACE;EACA;EACA;;;AAIF;AAAA;EAEE,YdnNsB;EcsNpB,OdrNoB;;;Ac4NxB;EACE,Yd9NsB;;;AepBxB;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;ACvOF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AdrBE;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;Ad5CJ;Ec+BE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;;AAQR;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AfhHA;EACE;;ACYA;EeZJ;IhBII;;;;AAKF;EACE;;ACEA;EeRJ;IhBUI;;;;AAKF;EACE;;ACRA;EeJJ;IhBgBI;;;;AAKF;EACE;;AClBA;EeAJ;IhBsBI;;;;AAKF;EACE;;AC5BA;EeIJ;IhB4BI;;;;AAKF;EACE;;ACtCA;EeQJ;IhBkCI;IACA,aEhDuB;;;;AFqDzB;EACE;EACA,aEvDuB;;ADKvB;EeYJ;IhB0CI;;;;AAKF;EACE;EACA,aElEuB;;ADKvB;EegBJ;IhBiDI;;;;AAKF;EACE;EACA,aE7EuB;;ADKvB;EeoBJ;IhBwDI;;;;AAKF;EACE;EACA,aExFuB;;ADKvB;EewBJ;IhB+DI;;;;AgB3DJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE,adxDiB;;;Ac2DnB;EACE,ad1DyB;;;Ac6D3B;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AC/EF;EACE;EACA;EACA;;AAGE;EACE;;;ACLN;EACE;EACA;;;AAQA;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AAhCF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAEF;EACE;EACA;;;AjBlCA;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjBzEJ;EiB6CE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAaN;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AAvBF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAEF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;EACA;;;AjB7GA;EiBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjB/IJ;EiBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjB/IJ;EiBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjB/IJ;EiBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AjB/IJ;EiBwHE;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;EAvBF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAEF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AC3JR;EACE;AAAA;AAAA;AAAA;AAAA;AAAA;IAME;;EAGF;IACE;IACA;;EAGF;IACE;IACA;IACA;;EAGF;IACE;;EAGF;IACE;IACA;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;IACA;;;ACvCJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;EAEE,OrBCW;EqBAX,kBrBNsB;EqBOtB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ACpBF;EACE,kBtBCsB;;;AsBExB;EACI;EACA;EACA,enB4EY;EmB3EZ;EACA;;AAEA;EACI,OnB8BI;EmB7BJ;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OnBoBM;EmBnBN;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,enBiDY;EmBhDZ;EACA;;AACA;EACE;EACA;EACA,OnBEM;EmBDN;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAMJ;EACI;EACA;EACA,enBGY;EmBFZ;EACA;;AAEA;EACI,OnB/CG;EmBgDH;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OnBzDK;EmB0DL;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,enBxBY;EmByBZ;EACA;;AACA;EACE;EACA;EACA,OnB3EK;EmB4EL;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAMJ;EACI;EACA;EACA,enBtEY;EmBuEZ;EACA;;AAEA;EACI,OnBhHK;EmBiHL;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE,OnB1HO;EmB2HP;EACA;EACA;EACA;EACA;;;AAIN;EACI;EACA;EACA,enBjGY;EmBkGZ;EACA;;AACA;EACE;EACA;EACA,OnB5IO;EmB6IP;EACA;EACA;EACA;EACA;;;AAIN;EACE;EACA;;AAEA;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAEA;EACE;;AAGF;EACE","sourcesContent":["/*\ngenerated by accessible-pygments \nCopyright (c) 2022, Quansight Labs\nLicensed under the BSD license, see LICENSE for details.\n--\ngenerated by Pygments \nCopyright 2006-2025 by the Pygments team.\nLicensed under the BSD license, see LICENSE for details.\n*/\n\n.highlight .hll { background-color: #0969da4a }\n.highlight .c { color: #6E7781 } /* Comment */\n.highlight .err { color: #CF222E } /* Error */\n.highlight .k { color: #CF222E } /* Keyword */\n.highlight .l { color: #953800 } /* Literal */\n.highlight .n { color: #8250DF } /* Name */\n.highlight .o { color: #116329 } /* Operator */\n.highlight .p { color: #24292F } /* Punctuation */\n.highlight .ch { color: #6E7781 } /* Comment.Hashbang */\n.highlight .cm { color: #6E7781 } /* Comment.Multiline */\n.highlight .cp { color: #6E7781 } /* Comment.Preproc */\n.highlight .cpf { color: #6E7781 } /* Comment.PreprocFile */\n.highlight .c1 { color: #6E7781 } /* Comment.Single */\n.highlight .cs { color: #6E7781 } /* Comment.Special */\n.highlight .gd { color: #0550AE } /* Generic.Deleted */\n.highlight .ge { font-style: italic } /* Generic.Emph */\n.highlight .gr { color: #CF222E } /* Generic.Error */\n.highlight .gh { color: #0550AE } /* Generic.Heading */\n.highlight .gs { font-weight: bold } /* Generic.Strong */\n.highlight .gu { color: #0550AE } /* Generic.Subheading */\n.highlight .kc { color: #0550AE } /* Keyword.Constant */\n.highlight .kd { color: #CF222E } /* Keyword.Declaration */\n.highlight .kn { color: #CF222E } /* Keyword.Namespace */\n.highlight .kp { color: #CF222E } /* Keyword.Pseudo */\n.highlight .kr { color: #CF222E } /* Keyword.Reserved */\n.highlight .kt { color: #CF222E } /* Keyword.Type */\n.highlight .ld { color: #953800 } /* Literal.Date */\n.highlight .m { color: #953800 } /* Literal.Number */\n.highlight .s { color: #0550AE } /* Literal.String */\n.highlight .na { color: #953800 } /* Name.Attribute */\n.highlight .nb { color: #953800 } /* Name.Builtin */\n.highlight .nc { color: #0550AE } /* Name.Class */\n.highlight .no { color: #0550AE } /* Name.Constant */\n.highlight .nd { color: #953800 } /* Name.Decorator */\n.highlight .ni { color: #116329 } /* Name.Entity */\n.highlight .ne { color: #8250DF } /* Name.Exception */\n.highlight .nf { color: #0550AE } /* Name.Function */\n.highlight .nl { color: #953800 } /* Name.Label */\n.highlight .nn { color: #24292F } /* Name.Namespace */\n.highlight .nx { color: #8250DF } /* Name.Other */\n.highlight .py { color: #0550AE } /* Name.Property */\n.highlight .nt { color: #116329 } /* Name.Tag */\n.highlight .nv { color: #953800 } /* Name.Variable */\n.highlight .ow { color: #8250DF } /* Operator.Word */\n.highlight .pm { color: #24292F } /* Punctuation.Marker */\n.highlight .w { color: #24292F } /* Text.Whitespace */\n.highlight .mb { color: #953800 } /* Literal.Number.Bin */\n.highlight .mf { color: #953800 } /* Literal.Number.Float */\n.highlight .mh { color: #953800 } /* Literal.Number.Hex */\n.highlight .mi { color: #953800 } /* Literal.Number.Integer */\n.highlight .mo { color: #953800 } /* Literal.Number.Oct */\n.highlight .sa { color: #0550AE } /* Literal.String.Affix */\n.highlight .sb { color: #0550AE } /* Literal.String.Backtick */\n.highlight .sc { color: #0550AE } /* Literal.String.Char */\n.highlight .dl { color: #0550AE } /* Literal.String.Delimiter */\n.highlight .sd { color: #0550AE } /* Literal.String.Doc */\n.highlight .s2 { color: #0550AE } /* Literal.String.Double */\n.highlight .se { color: #0550AE } /* Literal.String.Escape */\n.highlight .sh { color: #0550AE } /* Literal.String.Heredoc */\n.highlight .si { color: #0550AE } /* Literal.String.Interpol */\n.highlight .sx { color: #0550AE } /* Literal.String.Other */\n.highlight .sr { color: #0550AE } /* Literal.String.Regex */\n.highlight .s1 { color: #0550AE } /* Literal.String.Single */\n.highlight .ss { color: #0550AE } /* Literal.String.Symbol */\n.highlight .bp { color: #953800 } /* Name.Builtin.Pseudo */\n.highlight .fm { color: #0550AE } /* Name.Function.Magic */\n.highlight .vc { color: #953800 } /* Name.Variable.Class */\n.highlight .vg { color: #953800 } /* Name.Variable.Global */\n.highlight .vi { color: #953800 } /* Name.Variable.Instance */\n.highlight .vm { color: #953800 } /* Name.Variable.Magic */\n.highlight .il { color: #953800 } /* Literal.Number.Integer.Long */\n","/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */\n\n/* Document\n ========================================================================== */\n\n/**\n * 1. Correct the line height in all browsers.\n * 2. Prevent adjustments of font size after orientation changes in iOS.\n */\n\nhtml {\n line-height: 1.15; /* 1 */\n text-size-adjust: 100%; /* 2 */\n}\n\n/* Sections\n ========================================================================== */\n\n/**\n * Remove the margin in all browsers.\n */\n\nbody {\n margin: 0;\n}\n\n/**\n * Render the `main` element consistently in IE.\n */\n\nmain {\n display: block;\n}\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n/* Grouping content\n ========================================================================== */\n\n/**\n * 1. Add the correct box sizing in Firefox.\n * 2. Show the overflow in Edge and IE.\n */\n\nhr {\n box-sizing: content-box; /* 1 */\n height: 0; /* 1 */\n overflow: visible; /* 2 */\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\npre {\n font-family: monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/* Text-level semantics\n ========================================================================== */\n\n/**\n * Remove the gray background on active links in IE 10.\n */\n\na {\n background-color: transparent;\n}\n\n/**\n * 1. Remove the bottom border in Chrome 57-\n * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n */\n\nabbr[title] {\n border-bottom: none; /* 1 */\n text-decoration: underline; /* 2 */\n text-decoration: underline dotted; /* 2 */\n}\n\n/**\n * Add the correct font weight in Chrome, Edge, and Safari.\n */\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\ncode,\nkbd,\nsamp {\n font-family: monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/**\n * Add the correct font size in all browsers.\n */\n\nsmall {\n font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` elements from affecting the line height in\n * all browsers.\n */\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/* Embedded content\n ========================================================================== */\n\n/**\n * Remove the border on images inside links in IE 10.\n */\n\nimg {\n border-style: none;\n}\n\n/* Forms\n ========================================================================== */\n\n/**\n * 1. Change the font styles in all browsers.\n * 2. Remove the margin in Firefox and Safari.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-size: 100%; /* 1 */\n line-height: 1.15; /* 1 */\n margin: 0; /* 2 */\n}\n\n/**\n * Show the overflow in IE.\n * 1. Show the overflow in Edge.\n */\n\nbutton,\ninput {\n /* 1 */\n overflow: visible;\n}\n\n/**\n * Remove the inheritance of text transform in Edge, Firefox, and IE.\n * 1. Remove the inheritance of text transform in Firefox.\n */\n\nbutton,\nselect {\n /* 1 */\n text-transform: none;\n}\n\n/**\n * Correct the inability to style clickable types in iOS and Safari.\n */\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n appearance: button;\n}\n\n/**\n * Remove the inner border and padding in Firefox.\n */\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n border-style: none;\n padding: 0;\n}\n\n/**\n * Restore the focus styles unset by the previous rule.\n */\n\nbutton:-moz-focusring,\n[type=\"button\"]:-moz-focusring,\n[type=\"reset\"]:-moz-focusring,\n[type=\"submit\"]:-moz-focusring {\n outline: 1px dotted ButtonText;\n}\n\n/**\n * Correct the padding in Firefox.\n */\n\nfieldset {\n padding: 0.35em 0.75em 0.625em;\n}\n\n/**\n * 1. Correct the text wrapping in Edge and IE.\n * 2. Correct the color inheritance from `fieldset` elements in IE.\n * 3. Remove the padding so developers are not caught out when they zero out\n * `fieldset` elements in all browsers.\n */\n\nlegend {\n box-sizing: border-box; /* 1 */\n color: inherit; /* 2 */\n display: table; /* 1 */\n max-width: 100%; /* 1 */\n padding: 0; /* 3 */\n white-space: normal; /* 1 */\n}\n\n/**\n * Add the correct vertical alignment in Chrome, Firefox, and Opera.\n */\n\nprogress {\n vertical-align: baseline;\n}\n\n/**\n * Remove the default vertical scrollbar in IE 10+.\n */\n\ntextarea {\n overflow: auto;\n}\n\n/**\n * 1. Add the correct box sizing in IE 10.\n * 2. Remove the padding in IE 10.\n */\n\n[type=\"checkbox\"],\n[type=\"radio\"] {\n box-sizing: border-box; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Correct the cursor style of increment and decrement buttons in Chrome.\n */\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n/**\n * 1. Correct the odd appearance in Chrome and Safari.\n * 2. Correct the outline style in Safari.\n */\n\n[type=\"search\"] {\n appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/**\n * Remove the inner padding in Chrome and Safari on macOS.\n */\n\n[type=\"search\"]::-webkit-search-decoration {\n appearance: none;\n}\n\n/**\n * 1. Correct the inability to style clickable types in iOS and Safari.\n * 2. Change font properties to `inherit` in Safari.\n */\n\n::-webkit-file-upload-button {\n appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/* Interactive\n ========================================================================== */\n\n/*\n * Add the correct display in Edge, IE 10+, and Firefox.\n */\n\ndetails {\n display: block;\n}\n\n/*\n * Add the correct display in all browsers.\n */\n\nsummary {\n display: list-item;\n}\n\n/* Misc\n ========================================================================== */\n\n/**\n * Add the correct display in IE 10+.\n */\n\ntemplate {\n display: none;\n}\n\n/**\n * Add the correct display in IE 10.\n */\n\n[hidden] {\n display: none;\n}\n","// Base element style overrides\n// stylelint-disable selector-no-type, selector-max-type, selector-max-specificity, selector-max-id\n\n:root {\n color-scheme: $color-scheme;\n}\n\n* {\n box-sizing: border-box;\n}\n\nhtml {\n scroll-behavior: smooth;\n\n @include fs-4;\n}\n\nbody {\n font-family: $body-font-family;\n font-size: inherit;\n line-height: $body-line-height;\n color: $body-text-color;\n background-color: $body-background-color;\n overflow-wrap: break-word;\n}\n\nol,\nul,\ndl,\npre,\naddress,\nblockquote,\ntable,\ndiv,\nhr,\nform,\nfieldset,\nnoscript .table-wrapper {\n margin-top: 0;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n#toctitle {\n margin-top: 0;\n margin-bottom: 1em;\n font-weight: 500;\n line-height: $body-heading-line-height;\n color: $body-heading-color;\n}\n\np {\n margin-top: 1em;\n margin-bottom: 1em;\n}\n\na {\n color: $link-color;\n text-decoration: none;\n}\n\na:not([class]) {\n text-decoration: underline;\n text-decoration-color: $border-color;\n text-underline-offset: 2px;\n\n &:hover {\n text-decoration-color: rgba($link-color, 0.45);\n }\n}\n\ncode {\n font-family: $mono-font-family;\n font-size: 0.75em;\n line-height: $body-line-height;\n}\n\nfigure,\npre {\n margin: 0;\n}\n\nli {\n margin: 0.25em 0;\n}\n\nimg {\n max-width: 100%;\n height: auto;\n}\n\nhr {\n height: 1px;\n padding: 0;\n margin: $sp-6 0;\n background-color: $border-color;\n border: 0;\n}\n\n// adds a GitHub-style sidebar to blockquotes\nblockquote {\n margin: 10px 0;\n\n // resets user-agent stylesheets for blockquotes\n margin-block-start: 0;\n margin-inline-start: 0;\n padding-left: 1rem;\n border-left: 3px solid $border-color;\n}\n","// Meshtastic Material 3 — Light color scheme for just-the-docs\n// Source: core/ui/.../Color.kt §8.2 (Light Scheme)\n//\n// Brand colors:\n// Primary (Light): #2D8F52 (Green 700)\n// Surface (Light): #F5F6FA (Neutral 50)\n\n$color-scheme: light;\n\n// Body / page background\n$body-background-color: #F5F6FA; // Neutral 50 — surfaceLight\n$sidebar-color: #ECEDF3; // Neutral 100 — surfaceContainerLight\n$body-text-color: #2C2D3C; // Neutral 800 — onSurfaceLight\n$body-heading-color: #2C2D3C; // Neutral 800\n\n// Links\n$link-color: #2D8F52; // Green 700 — primaryLight\n$nav-link-color: #2D8F52; // Green 700\n\n// Navigation\n$nav-child-link-color: #555668; // Neutral 600 — secondaryLight\n$search-result-preview-color: #555668;\n\n// Code\n$code-background-color: #ECEDF3; // Neutral 100\n$code-linenumber-color: #9496A6; // Neutral 400\n\n// Borders\n$border-color: #D5D6E0; // Neutral 200 — outlineVariantLight\n$table-background-color: #F5F6FA; // Neutral 50\n\n// Buttons\n$btn-primary-color: #2D8F52; // Green 700\n\n// Feedback / callouts\n$feedback-color: #E0E1EB; // surfaceContainerHighLight\n\n// Search\n$search-background-color: #FFFFFF; // surfaceContainerLowestLight\n","@mixin fs-1 {\n & {\n font-size: $font-size-1 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-1-sm !important;\n }\n}\n\n@mixin fs-2 {\n & {\n font-size: $font-size-2 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-3 !important;\n }\n}\n\n@mixin fs-3 {\n & {\n font-size: $font-size-3 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-4 !important;\n }\n}\n\n@mixin fs-4 {\n & {\n font-size: $font-size-4 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-5 !important;\n }\n}\n\n@mixin fs-5 {\n & {\n font-size: $font-size-5 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-6 !important;\n }\n}\n\n@mixin fs-6 {\n & {\n font-size: $font-size-6 !important;\n }\n\n @include mq(sm) {\n font-size: $font-size-7 !important;\n line-height: $body-heading-line-height;\n }\n}\n\n@mixin fs-7 {\n & {\n font-size: $font-size-7 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-8 !important;\n }\n}\n\n@mixin fs-8 {\n & {\n font-size: $font-size-8 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-9 !important;\n }\n}\n\n@mixin fs-9 {\n & {\n font-size: $font-size-9 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-10 !important;\n }\n}\n\n@mixin fs-10 {\n & {\n font-size: $font-size-10 !important;\n line-height: $body-heading-line-height;\n }\n\n @include mq(sm) {\n font-size: $font-size-10-sm !important;\n }\n}\n","// Media query\n\n// Media query mixin\n// Usage:\n// @include mq(md) {\n// ..medium and up styles\n// }\n@mixin mq($name) {\n // Retrieves the value from the key\n $value: map-get($media-queries, $name);\n\n // If the key exists in the map\n @if $value {\n // Prints a media query based on the value\n @media (min-width: $value) {\n @content;\n }\n } @else {\n @warn \"No value could be retrieved from `#{$media-query}`. Please make sure it is defined in `$media-queries` map.\";\n }\n}\n\n// Responsive container\n\n@mixin container {\n padding-right: $gutter-spacing-sm;\n padding-left: $gutter-spacing-sm;\n\n @include mq(md) {\n padding-right: $gutter-spacing;\n padding-left: $gutter-spacing;\n }\n}\n","// Typography\n\n// prettier-ignore\n$body-font-family: system-ui, -apple-system, blinkmacsystemfont, \"Segoe UI\",\n roboto, \"Helvetica Neue\", arial, sans-serif, \"Segoe UI Emoji\" !default;\n$mono-font-family: \"SFMono-Regular\", menlo, consolas, monospace !default;\n$root-font-size: 16px !default; // DEPRECATED: previously base font-size for rems\n$body-line-height: 1.4 !default;\n$content-line-height: 1.6 !default;\n$body-heading-line-height: 1.25 !default;\n\n// Font size\n// `-sm` suffix is the size at the small (and above) media query\n\n$font-size-1: 0.5625rem !default;\n$font-size-1-sm: 0.625rem !default;\n$font-size-2: 0.6875rem !default; // h4 - uppercased!, h6 not uppercased, text-small\n$font-size-3: 0.75rem !default; // h5\n$font-size-4: 0.875rem !default;\n$font-size-5: 1rem !default; // h3\n$font-size-6: 1.125rem !default; // h2\n$font-size-7: 1.5rem !default;\n$font-size-8: 2rem !default; // h1\n$font-size-9: 2.25rem !default;\n$font-size-10: 2.625rem !default;\n$font-size-10-sm: 3rem !default;\n\n// Colors\n\n$white: #fff !default;\n$grey-dk-000: #959396 !default;\n$grey-dk-100: #5c5962 !default;\n$grey-dk-200: #44434d !default;\n$grey-dk-250: #302d36 !default;\n$grey-dk-300: #27262b !default;\n$grey-lt-000: #f5f6fa !default;\n$grey-lt-100: #eeebee !default;\n$grey-lt-200: #ecebed !default;\n$grey-lt-300: #e6e1e8 !default;\n$purple-000: #7253ed !default;\n$purple-100: #5e41d0 !default;\n$purple-200: #4e26af !default;\n$purple-300: #381885 !default;\n$blue-000: #2c84fa !default;\n$blue-100: #2869e6 !default;\n$blue-200: #264caf !default;\n$blue-300: #183385 !default;\n$green-000: #41d693 !default;\n$green-100: #11b584 !default;\n$green-200: #009c7b !default;\n$green-300: #026e57 !default;\n$yellow-000: #ffeb82 !default;\n$yellow-100: #fadf50 !default;\n$yellow-200: #f7d12e !default;\n$yellow-300: #e7af06 !default;\n$red-000: #f77e7e !default;\n$red-100: #f96e65 !default;\n$red-200: #e94c4c !default;\n$red-300: #dd2e2e !default;\n\n// Spacing\n\n$spacing-unit: 1rem; // 1rem == 16px\n\n$spacers: (\n sp-0: 0,\n sp-1: $spacing-unit * 0.25,\n sp-2: $spacing-unit * 0.5,\n sp-3: $spacing-unit * 0.75,\n sp-4: $spacing-unit,\n sp-5: $spacing-unit * 1.5,\n sp-6: $spacing-unit * 2,\n sp-7: $spacing-unit * 2.5,\n sp-8: $spacing-unit * 3,\n sp-9: $spacing-unit * 3.5,\n sp-10: $spacing-unit * 4,\n) !default;\n$sp-1: map-get($spacers, sp-1) !default; // 0.25 rem == 4px\n$sp-2: map-get($spacers, sp-2) !default; // 0.5 rem == 8px\n$sp-3: map-get($spacers, sp-3) !default; // 0.75 rem == 12px\n$sp-4: map-get($spacers, sp-4) !default; // 1 rem == 16px\n$sp-5: map-get($spacers, sp-5) !default; // 1.5 rem == 24px\n$sp-6: map-get($spacers, sp-6) !default; // 2 rem == 32px\n$sp-7: map-get($spacers, sp-7) !default; // 2.5 rem == 40px\n$sp-8: map-get($spacers, sp-8) !default; // 3 rem == 48px\n$sp-9: map-get($spacers, sp-9) !default; // 3.5 rem == 56px\n$sp-10: map-get($spacers, sp-10) !default; // 4 rem == 64px\n\n// Borders\n\n$border: 1px solid !default;\n$border-radius: 4px !default;\n$border-color: $grey-lt-100 !default;\n\n// Grid system\n\n$gutter-spacing: $sp-6 !default;\n$gutter-spacing-sm: $sp-4 !default;\n$nav-width: 16.5rem !default;\n$nav-width-md: 15.5rem !default;\n$nav-list-item-height: $sp-6 !default;\n$nav-list-item-height-sm: $sp-8 !default;\n$nav-list-expander-right: true;\n$content-width: 50rem !default;\n$header-height: 3.75rem !default;\n$search-results-width: $content-width - $nav-width !default;\n$transition-duration: 400ms;\n\n// Media queries in pixels\n\n$media-queries: (\n xs: 20rem,\n sm: 31.25rem,\n md: $content-width,\n lg: $content-width + $nav-width,\n xl: 87.5rem,\n) !default;\n","// The basic two column layout\n\n.side-bar {\n z-index: 0;\n display: flex;\n flex-wrap: wrap;\n background-color: $sidebar-color;\n\n @include mq(md) {\n flex-flow: column nowrap;\n position: fixed;\n width: $nav-width-md;\n height: 100%;\n border-right: $border $border-color;\n align-items: flex-end;\n }\n\n @include mq(lg) {\n width: calc((100% - #{$nav-width + $content-width}) / 2 + #{$nav-width});\n min-width: $nav-width;\n }\n\n & + .main {\n @include mq(md) {\n margin-left: $nav-width-md;\n }\n\n @include mq(lg) {\n // stylelint-disable function-name-case\n // disable for Max(), we want to use the CSS max() function\n margin-left: Max(\n #{$nav-width},\n calc((100% - #{$nav-width + $content-width}) / 2 + #{$nav-width})\n );\n // stylelint-enable function-name-case\n }\n\n .main-header {\n display: none;\n background-color: $sidebar-color;\n\n @include mq(md) {\n display: flex;\n background-color: $body-background-color;\n }\n\n &.nav-open {\n display: block;\n\n @include mq(md) {\n display: flex;\n }\n }\n }\n }\n}\n\n.main {\n margin: auto;\n\n @include mq(md) {\n position: relative;\n max-width: $content-width;\n }\n}\n\n.main-content-wrap {\n padding-top: $gutter-spacing-sm;\n padding-bottom: $gutter-spacing-sm;\n\n @include container;\n\n @include mq(md) {\n padding-top: $gutter-spacing;\n padding-bottom: $gutter-spacing;\n }\n}\n\n.main-header {\n z-index: 0;\n border-bottom: $border $border-color;\n\n @include mq(md) {\n display: flex;\n justify-content: space-between;\n height: $header-height;\n }\n}\n\n.site-nav,\n.site-header,\n.site-footer {\n width: 100%;\n\n @include mq(lg) {\n width: $nav-width;\n }\n}\n\n.site-nav {\n display: none;\n\n &.nav-open {\n display: block;\n }\n\n @include mq(md) {\n display: block;\n padding-top: $sp-8;\n padding-bottom: $gutter-spacing-sm;\n overflow-y: auto;\n flex: 1 1 auto;\n }\n}\n\n.site-header {\n display: flex;\n min-height: $header-height;\n align-items: center;\n\n @include mq(md) {\n height: $header-height;\n max-height: $header-height;\n border-bottom: $border $border-color;\n }\n}\n\n.site-title {\n flex-grow: 1;\n display: flex;\n height: 100%;\n align-items: center;\n padding-top: $sp-3;\n padding-bottom: $sp-3;\n color: $body-heading-color;\n\n @include container;\n\n @include fs-6;\n\n @include mq(md) {\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n }\n}\n\n@if variable-exists(logo) {\n .site-logo {\n width: 100%;\n height: 100%;\n background-image: url($logo);\n background-repeat: no-repeat;\n background-position: left center;\n background-size: contain;\n }\n}\n\n.site-button {\n display: flex;\n height: 100%;\n padding: $gutter-spacing-sm;\n align-items: center;\n}\n\n@include mq(md) {\n .site-header .site-button {\n display: none;\n }\n}\n\n.site-title:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 80%,\n rgba($feedback-color, 0) 100%\n );\n}\n\n.site-button:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 100%\n );\n}\n\n.site-footer {\n position: absolute;\n bottom: 0;\n left: 0;\n padding-top: $sp-4;\n padding-bottom: $sp-4;\n\n @include container;\n\n @include fs-2;\n\n @include mq(md) {\n position: static;\n justify-self: end;\n }\n}\n\n.icon {\n width: $sp-5;\n height: $sp-5;\n color: $link-color;\n}\n","@charset \"UTF-8\";\n\n// Styles for rendered markdown in the .main-content container\n// stylelint-disable selector-no-type, max-nesting-depth, selector-max-compound-selectors, selector-max-type, selector-max-specificity, selector-max-id\n\n.main-content {\n line-height: $content-line-height;\n\n ol,\n ul,\n dl,\n pre,\n address,\n blockquote,\n .table-wrapper {\n margin-top: 0.5em;\n }\n\n a {\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n ul,\n ol {\n padding-left: 1.5em;\n }\n\n li {\n .highlight {\n margin-top: $sp-1;\n }\n }\n\n ol {\n list-style-type: none;\n counter-reset: step-counter;\n\n > li {\n position: relative;\n\n &::before {\n position: absolute;\n top: 0.2em;\n left: -1.6em;\n color: $grey-dk-000;\n content: counter(step-counter);\n counter-increment: step-counter;\n @include fs-3;\n\n @include mq(sm) {\n top: 0.11em;\n }\n }\n\n ol {\n counter-reset: sub-counter;\n\n > li {\n &::before {\n content: counter(sub-counter, lower-alpha);\n counter-increment: sub-counter;\n }\n }\n }\n }\n }\n\n ul {\n list-style: none;\n\n > li {\n &::before {\n position: absolute;\n margin-left: -1.4em;\n color: $grey-dk-000;\n content: \"•\";\n }\n }\n }\n\n .task-list-item {\n &::before {\n content: \"\";\n }\n }\n\n .task-list-item-checkbox {\n margin-right: 0.6em;\n margin-left: -1.4em;\n\n // The same margin-left is used above for ul > li::before\n }\n\n hr + * {\n margin-top: 0;\n }\n\n h1:first-of-type {\n margin-top: 0.5em;\n }\n\n dl {\n display: grid;\n grid-template: auto / 10em 1fr;\n }\n\n dt,\n dd {\n margin: 0.25em 0;\n }\n\n dt {\n grid-column: 1;\n font-weight: 500;\n text-align: right;\n\n &::after {\n content: \":\";\n }\n }\n\n dd {\n grid-column: 2;\n margin-bottom: 0;\n margin-left: 1em;\n\n blockquote,\n div,\n dl,\n dt,\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n li,\n ol,\n p,\n pre,\n table,\n ul,\n .table-wrapper {\n &:first-child {\n margin-top: 0;\n }\n }\n }\n\n dd,\n ol,\n ul {\n dl:first-child {\n dt:first-child,\n dd:nth-child(2) {\n margin-top: 0;\n }\n }\n }\n\n .anchor-heading {\n position: absolute;\n right: -$sp-4;\n width: $sp-5;\n height: 100%;\n padding-right: $sp-1;\n padding-left: $sp-1;\n overflow: visible;\n\n @include mq(md) {\n right: auto;\n left: -$sp-5;\n }\n\n svg {\n display: inline-block;\n width: 100%;\n height: 100%;\n color: $link-color;\n visibility: hidden;\n }\n }\n\n .anchor-heading:hover,\n .anchor-heading:focus,\n h1:hover > .anchor-heading,\n h2:hover > .anchor-heading,\n h3:hover > .anchor-heading,\n h4:hover > .anchor-heading,\n h5:hover > .anchor-heading,\n h6:hover > .anchor-heading {\n svg {\n visibility: visible;\n }\n }\n\n summary {\n cursor: pointer;\n }\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6,\n #toctitle {\n position: relative;\n margin-top: 1.5em;\n margin-bottom: 0.25em;\n\n + table,\n + .table-wrapper,\n + .code-example,\n + .highlighter-rouge,\n + .sectionbody .listingblock {\n margin-top: 1em;\n }\n\n + p:not(.label) {\n margin-top: 0;\n }\n }\n\n > h1:first-child,\n > h2:first-child,\n > h3:first-child,\n > h4:first-child,\n > h5:first-child,\n > h6:first-child,\n > .sect1:first-child > h2,\n > .sect2:first-child > h3,\n > .sect3:first-child > h4,\n > .sect4:first-child > h5,\n > .sect5:first-child > h6 {\n margin-top: $sp-2;\n }\n}\n","// Main nav, breadcrumb, etc...\n// stylelint-disable selector-no-type, max-nesting-depth, selector-max-compound-selectors, selector-max-type, selector-max-specificity\n\n.nav-list {\n padding: 0;\n margin-top: 0;\n margin-bottom: 0;\n list-style: none;\n\n .nav-list-item {\n position: relative;\n margin: 0;\n\n @include fs-4;\n\n @include mq(md) {\n @include fs-3;\n }\n\n .nav-list-link {\n display: block;\n min-height: $nav-list-item-height-sm;\n padding-top: $sp-1;\n padding-bottom: $sp-1;\n line-height: #{$nav-list-item-height-sm - 2 * $sp-1};\n @if $nav-list-expander-right {\n padding-right: $nav-list-item-height-sm;\n padding-left: $gutter-spacing-sm;\n } @else {\n padding-right: $gutter-spacing-sm;\n padding-left: $nav-list-item-height-sm;\n }\n\n @include mq(md) {\n min-height: $nav-list-item-height;\n line-height: #{$nav-list-item-height - 2 * $sp-1};\n @if $nav-list-expander-right {\n padding-right: $nav-list-item-height;\n padding-left: $gutter-spacing;\n } @else {\n padding-right: $gutter-spacing;\n padding-left: $nav-list-item-height;\n }\n }\n\n &.external > svg {\n width: $sp-4;\n height: $sp-4;\n vertical-align: text-bottom;\n }\n\n &.active {\n font-weight: 600;\n text-decoration: none;\n }\n\n &:hover,\n &.active {\n color: darken($link-color, 5%);\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 80%,\n rgba($feedback-color, 0) 100%\n );\n }\n }\n\n .nav-list-expander {\n position: absolute;\n @if $nav-list-expander-right {\n right: 0;\n }\n\n width: $nav-list-item-height-sm;\n height: $nav-list-item-height-sm;\n padding: #{$nav-list-item-height-sm * 0.25};\n color: $link-color;\n\n @include mq(md) {\n width: $nav-list-item-height;\n height: $nav-list-item-height;\n padding: #{$nav-list-item-height * 0.25};\n }\n\n &:hover {\n background-image: linear-gradient(\n -90deg,\n rgba($feedback-color, 1) 0%,\n rgba($feedback-color, 0.8) 100%\n );\n }\n\n @if $nav-list-expander-right {\n svg {\n transform: rotate(90deg);\n }\n }\n }\n\n > .nav-list {\n display: none;\n padding-left: $sp-3;\n list-style: none;\n\n .nav-list-item {\n position: relative;\n\n .nav-list-link {\n color: $nav-child-link-color;\n }\n\n .nav-list-expander {\n color: $nav-child-link-color;\n }\n }\n }\n\n &.active {\n > .nav-list-expander svg {\n @if $nav-list-expander-right {\n transform: rotate(-90deg);\n } @else {\n transform: rotate(90deg);\n }\n }\n\n > .nav-list {\n display: block;\n }\n }\n }\n}\n\n.nav-category {\n padding: $sp-2 $gutter-spacing-sm;\n font-weight: 600;\n text-align: start;\n text-transform: uppercase;\n border-bottom: $border $border-color;\n @include fs-2;\n\n @include mq(md) {\n padding: $sp-2 $gutter-spacing;\n margin-top: $gutter-spacing-sm;\n text-align: start;\n\n &:first-child {\n margin-top: 0;\n }\n }\n}\n\n.nav-list.nav-category-list {\n > .nav-list-item {\n margin: 0;\n\n > .nav-list {\n padding: 0;\n\n > .nav-list-item {\n > .nav-list-link {\n color: $link-color;\n }\n\n > .nav-list-expander {\n color: $link-color;\n }\n }\n }\n }\n}\n\n// Aux nav\n\n.aux-nav {\n height: 100%;\n overflow-x: auto;\n @include fs-2;\n\n .aux-nav-list {\n display: flex;\n height: 100%;\n padding: 0;\n margin: 0;\n list-style: none;\n }\n\n .aux-nav-list-item {\n display: inline-block;\n height: 100%;\n padding: 0;\n margin: 0;\n }\n\n @include mq(md) {\n padding-right: $gutter-spacing-sm;\n }\n}\n\n// Breadcrumb nav\n\n.breadcrumb-nav {\n @include mq(md) {\n margin-top: -$sp-4;\n }\n}\n\n.breadcrumb-nav-list {\n padding-left: 0;\n margin-bottom: $sp-3;\n list-style: none;\n}\n\n.breadcrumb-nav-list-item {\n display: table-cell;\n @include fs-2;\n\n &::before {\n display: none;\n }\n\n &::after {\n display: inline-block;\n margin-right: $sp-2;\n margin-left: $sp-2;\n color: $grey-dk-000;\n content: \"/\";\n }\n\n &:last-child {\n &::after {\n content: \"\";\n }\n }\n}\n","// Typography\n// stylelint-disable selector-no-type, selector-max-type, selector-max-specificity, selector-max-id\n\nh1,\n.text-alpha {\n font-weight: 300;\n\n @include fs-8;\n}\n\nh2,\n.text-beta,\n#toctitle {\n @include fs-6;\n}\n\nh3,\n.text-gamma {\n @include fs-5;\n}\n\nh4,\n.text-delta {\n font-weight: 400;\n text-transform: uppercase;\n letter-spacing: 0.1em;\n\n @include fs-2;\n}\n\nh4 code {\n text-transform: none;\n}\n\nh5,\n.text-epsilon {\n @include fs-3;\n}\n\nh6,\n.text-zeta {\n @include fs-2;\n}\n\n.text-small {\n @include fs-2;\n}\n\n.text-mono {\n font-family: $mono-font-family !important;\n}\n\n.text-left {\n text-align: left !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n.text-right {\n text-align: right !important;\n}\n","// Labels (not the form kind)\n\n// this :not() prevents a style clash with Mermaid.js's\n// diagram labels, which also use .label\n// for more, see https://github.com/just-the-docs/just-the-docs/issues/1272\n// and the accompanying PR\n.label:not(g),\n.label-blue:not(g) {\n display: inline-block;\n padding: 0.16em 0.56em;\n margin-right: $sp-2;\n margin-left: $sp-2;\n color: $white;\n text-transform: uppercase;\n vertical-align: middle;\n background-color: $blue-100;\n border-radius: 12px;\n\n @include fs-2;\n}\n\n.label-green:not(g) {\n background-color: $green-300;\n}\n\n.label-purple:not(g) {\n background-color: $purple-100;\n}\n\n.label-red:not(g) {\n background-color: $red-300;\n}\n\n.label-yellow:not(g) {\n color: $grey-dk-200;\n background-color: $yellow-200;\n}\n","// Buttons and things that look like buttons\n// stylelint-disable color-named\n\n.btn {\n display: inline-block;\n box-sizing: border-box;\n padding: 0.3em 1em;\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n font-weight: 500;\n line-height: 1.5;\n color: $link-color;\n text-decoration: none;\n vertical-align: baseline;\n cursor: pointer;\n background-color: $base-button-color;\n border-width: 0;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n appearance: none;\n\n &:focus {\n text-decoration: none;\n outline: none;\n box-shadow: 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:focus:hover,\n &.selected:focus {\n box-shadow: 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:hover,\n &.zeroclipboard-is-hover {\n color: darken($link-color, 2%);\n }\n\n &:hover,\n &:active,\n &.zeroclipboard-is-hover,\n &.zeroclipboard-is-active {\n text-decoration: none;\n background-color: darken($base-button-color, 1%);\n }\n\n &:active,\n &.selected,\n &.zeroclipboard-is-active {\n background-color: darken($base-button-color, 3%);\n background-image: none;\n box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15);\n }\n\n &.selected:hover {\n background-color: darken(#dcdcdc, 5%);\n }\n\n &:disabled,\n &.disabled {\n &,\n &:hover {\n color: rgba(102, 102, 102, 0.5);\n cursor: default;\n background-color: rgba(229, 229, 229, 0.5);\n background-image: none;\n box-shadow: none;\n }\n }\n}\n\n.btn-outline {\n color: $link-color;\n background: transparent;\n box-shadow: inset 0 0 0 2px $grey-lt-300;\n\n &:hover,\n &:active,\n &.zeroclipboard-is-hover,\n &.zeroclipboard-is-active {\n color: darken($link-color, 4%);\n text-decoration: none;\n background-color: transparent;\n box-shadow: inset 0 0 0 3px $grey-lt-300;\n }\n\n &:focus {\n text-decoration: none;\n outline: none;\n box-shadow:\n inset 0 0 0 2px $grey-dk-100,\n 0 0 0 3px rgba(blue, 0.25);\n }\n\n &:focus:hover,\n &.selected:focus {\n box-shadow: inset 0 0 0 2px $grey-dk-100;\n }\n}\n\n.btn-primary {\n @include btn-color($white, $btn-primary-color);\n}\n\n.btn-purple {\n @include btn-color($white, $purple-100);\n}\n\n.btn-blue {\n @include btn-color($white, $blue-200);\n}\n\n.btn-green {\n @include btn-color($white, $green-300);\n}\n\n.btn-reset {\n background: none;\n border: none;\n margin: 0;\n text-align: inherit;\n font: inherit;\n border-radius: 0;\n appearance: none;\n}\n","$color-scheme: light !default;\n$body-background-color: $white !default;\n$body-heading-color: $grey-dk-300 !default;\n$body-text-color: $grey-dk-100 !default;\n$link-color: $purple-000 !default;\n$nav-child-link-color: $grey-dk-100 !default;\n$sidebar-color: $grey-lt-000 !default;\n$base-button-color: #f7f7f7 !default;\n$btn-primary-color: $purple-100 !default;\n$code-background-color: $white !default;\n$feedback-color: darken($sidebar-color, 3%) !default;\n$table-background-color: $white !default;\n$search-background-color: $white !default;\n$search-result-preview-color: $grey-dk-100 !default;\n\n@import \"./vendor/accessible-pygments/github-light\";\n","// Colored button\n\n@mixin btn-color($fg, $bg) {\n color: $fg;\n background-color: darken($bg, 2%);\n background-image: linear-gradient(lighten($bg, 5%), darken($bg, 2%));\n box-shadow:\n 0 1px 3px rgba(0, 0, 0, 0.25),\n 0 4px 10px rgba(0, 0, 0, 0.12);\n\n &:hover,\n &.zeroclipboard-is-hover {\n color: $fg;\n background-color: darken($bg, 4%);\n background-image: linear-gradient((lighten($bg, 2%), darken($bg, 4%)));\n }\n\n &:active,\n &.selected,\n &.zeroclipboard-is-active {\n background-color: darken($bg, 5%);\n background-image: none;\n box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15);\n }\n\n &.selected:hover {\n background-color: darken($bg, 10%);\n }\n}\n","// Search input and autocomplete\n\n.search {\n position: relative;\n z-index: 2;\n flex-grow: 1;\n height: $sp-10;\n padding: $sp-2;\n transition: padding linear #{$transition-duration * 0.5};\n\n @include mq(md) {\n position: relative !important;\n width: auto !important;\n height: 100% !important;\n padding: 0;\n transition: none;\n }\n}\n\n.search-input-wrap {\n position: relative;\n z-index: 1;\n height: $sp-8;\n overflow: hidden;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n transition: height linear #{$transition-duration * 0.5};\n\n @include mq(md) {\n position: absolute;\n width: 100%;\n max-width: $search-results-width;\n height: 100% !important;\n border-radius: 0;\n box-shadow: none;\n transition: width ease $transition-duration;\n }\n}\n\n.search-input {\n position: absolute;\n width: 100%;\n height: 100%;\n padding: $sp-2 $gutter-spacing-sm $sp-2 #{$gutter-spacing-sm + $sp-5};\n font-size: 1rem;\n color: $body-text-color;\n background-color: $search-background-color;\n border-top: 0;\n border-right: 0;\n border-bottom: 0;\n border-left: 0;\n border-radius: 0;\n\n @include mq(md) {\n padding: $sp-2 $gutter-spacing-sm $sp-2 #{$gutter-spacing + $sp-5};\n font-size: 0.875rem;\n background-color: $body-background-color;\n transition: padding-left linear #{$transition-duration * 0.5};\n }\n\n &:focus {\n outline: 2px solid $link-color;\n outline-offset: -2px;\n\n + .search-label .search-icon {\n color: $link-color;\n }\n }\n}\n\n.search-label {\n position: absolute;\n display: flex;\n height: 100%;\n padding-left: $gutter-spacing-sm;\n\n @include mq(md) {\n padding-left: $gutter-spacing;\n transition: padding-left linear #{$transition-duration * 0.5};\n }\n\n .search-icon {\n width: #{$sp-4 * 1.2};\n height: #{$sp-4 * 1.2};\n align-self: center;\n color: $grey-dk-000;\n }\n}\n\n.search-results {\n position: absolute;\n left: 0;\n display: none;\n width: 100%;\n max-height: calc(100% - #{$sp-10});\n overflow-y: auto;\n background-color: $search-background-color;\n border-bottom-right-radius: $border-radius;\n border-bottom-left-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n\n @include mq(md) {\n top: 100%;\n width: $search-results-width;\n max-height: calc(100vh - 200%) !important;\n }\n}\n\n.search-results-list {\n padding-left: 0;\n margin-bottom: $sp-1;\n list-style: none;\n @include fs-4;\n\n @include mq(md) {\n @include fs-3;\n }\n}\n\n.search-results-list-item {\n padding: 0;\n margin: 0;\n}\n\n.search-result {\n display: block;\n padding: $sp-1 $sp-3;\n\n &:hover,\n &.active {\n background-color: $feedback-color;\n }\n}\n\n.search-result-title {\n display: block;\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n\n @include mq(sm) {\n display: inline-block;\n width: 40%;\n padding-right: $sp-2;\n vertical-align: top;\n }\n}\n\n.search-result-doc {\n display: flex;\n align-items: center;\n word-wrap: break-word;\n\n &.search-result-doc-parent {\n opacity: 0.5;\n @include fs-3;\n\n @include mq(md) {\n @include fs-2;\n }\n }\n\n .search-result-icon {\n width: $sp-4;\n height: $sp-4;\n margin-right: $sp-2;\n color: $link-color;\n flex-shrink: 0;\n }\n\n .search-result-doc-title {\n overflow: auto;\n }\n}\n\n.search-result-section {\n margin-left: #{$sp-4 + $sp-2};\n word-wrap: break-word;\n}\n\n.search-result-rel-url {\n display: block;\n margin-left: #{$sp-4 + $sp-2};\n overflow: hidden;\n color: $search-result-preview-color;\n text-overflow: ellipsis;\n white-space: nowrap;\n @include fs-1;\n}\n\n.search-result-previews {\n display: block;\n padding-top: $sp-2;\n padding-bottom: $sp-2;\n padding-left: $sp-4;\n margin-left: $sp-2;\n color: $search-result-preview-color;\n word-wrap: break-word;\n border-left: $border;\n border-left-color: $border-color;\n @include fs-2;\n\n @include mq(sm) {\n display: inline-block;\n width: 60%;\n padding-left: $sp-2;\n margin-left: 0;\n vertical-align: top;\n }\n}\n\n.search-result-preview + .search-result-preview {\n margin-top: $sp-1;\n}\n\n.search-result-highlight {\n font-weight: bold;\n}\n\n.search-no-result {\n padding: $sp-2 $sp-3;\n @include fs-3;\n}\n\n.search-button {\n position: fixed;\n right: $sp-4;\n bottom: $sp-4;\n display: flex;\n width: $sp-9;\n height: $sp-9;\n background-color: $search-background-color;\n border: 1px solid rgba($link-color, 0.3);\n border-radius: #{$sp-9 * 0.5};\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n align-items: center;\n justify-content: center;\n}\n\n.search-overlay {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1;\n width: 0;\n height: 0;\n background-color: rgba(0, 0, 0, 0.3);\n opacity: 0;\n transition:\n opacity ease $transition-duration,\n width 0s $transition-duration,\n height 0s $transition-duration;\n}\n\n.search-active {\n .search {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n padding: 0;\n }\n\n .search-input-wrap {\n height: $sp-10;\n border-radius: 0;\n\n @include mq(md) {\n width: $search-results-width;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n }\n }\n\n .search-input {\n background-color: $search-background-color;\n\n @include mq(md) {\n padding-left: 2.3rem;\n }\n }\n\n .search-label {\n @include mq(md) {\n padding-left: 0.6rem;\n }\n }\n\n .search-results {\n display: block;\n }\n\n .search-overlay {\n width: 100%;\n height: 100%;\n opacity: 1;\n transition:\n opacity ease $transition-duration,\n width 0s,\n height 0s;\n }\n\n @include mq(md) {\n .main {\n position: fixed;\n right: 0;\n left: 0;\n }\n }\n\n .main-header {\n padding-top: $sp-10;\n\n @include mq(md) {\n padding-top: 0;\n }\n }\n}\n","// Tables\n// stylelint-disable max-nesting-depth, selector-no-type, selector-max-type\n\n.table-wrapper {\n display: block;\n width: 100%;\n max-width: 100%;\n margin-bottom: $sp-5;\n overflow-x: auto;\n border-radius: $border-radius;\n box-shadow:\n 0 1px 2px rgba(0, 0, 0, 0.12),\n 0 3px 10px rgba(0, 0, 0, 0.08);\n}\n\ntable {\n display: table;\n min-width: 100%;\n border-collapse: separate;\n}\n\nth,\ntd {\n min-width: 7.5rem;\n padding: $sp-2 $sp-3;\n background-color: $table-background-color;\n border-bottom: $border rgba($border-color, 0.5);\n border-left: $border $border-color;\n\n @include fs-3;\n\n &:first-of-type {\n border-left: 0;\n }\n}\n\ntbody {\n tr {\n &:last-of-type {\n th,\n td {\n border-bottom: 0;\n }\n\n td {\n padding-bottom: $sp-3;\n }\n }\n }\n}\n\nthead {\n th {\n border-bottom: $border $border-color;\n }\n}\n","// Code and syntax highlighting\n// stylelint-disable selector-no-qualifying-type, declaration-block-semicolon-newline-after,declaration-block-single-line-max-declarations, selector-no-type, selector-max-type, scss/comment-no-empty\n\n// {% raw %}\n\n// This instruction applies to all queues not within 'pre' or 'figure', avoiding 'code' generated by the highlight.\n:not(pre, figure) {\n & > code {\n padding: 0.2em 0.15em;\n font-weight: 400;\n background-color: $code-background-color;\n border: $border $border-color;\n border-radius: $border-radius;\n }\n}\n\n// Avoid appearance of dark border around visited code links in Safari\na:visited code {\n border-color: $border-color;\n}\n\n// Content structure for highlighted code blocks using fences or Liquid\n//\n// ```[LANG]...```, no kramdown line_numbers:\n// div.[language-LANG.]highlighter-rouge > div.highlight > pre.highlight > code\n//\n// ```[LANG]...```, kramdown line_numbers = true:\n// div.[language-LANG.]highlighter-rouge > div.highlight > pre.highlight > code\n// > div.table-wrapper > table.rouge-table > tbody > tr\n// > td.rouge-gutter.gl > pre.lineno\n// | td.rouge-code > pre\n//\n// {% highlight LANG %}...{% endhighlight %}:\n// figure.highlight > pre > code.language-LANG\n//\n// {% highlight LANG linenos %}...{% endhighlight %}:\n// figure.highlight > pre > code.language-LANG\n// > div.table-wrapper > table.rouge-table > tbody > tr\n// > td.gutter.gl > pre.lineno\n// | td.code > pre\n//\n// ----...---- (AsciiDoc)\n// div.listingblock > div.content > pre.rouge.highlight\n//\n// fix_linenos removes the outermost pre when it encloses table.rouge-table\n//\n// See docs/index-test.md for some tests.\n//\n// No kramdown line_numbers: fences and Liquid highlighting look the same.\n// Kramdown line_numbers = true: fences have a wider gutter than with Liquid?\n\n// ```[LANG]...```\n// or in AsciiDoc:\n//\n// ----\n// ...\n// ----\n\n// the code may appear with 3 different types:\n// container \\ case: default case, code with line number, code with html rendering\n// top level: div.highlighter-rouge, figure.highlight, figure.highlight\n// second level: div.highlight, div.table-wrapper, pre.highlight\n// third level: pre.highlight, td.code, absent\n// last level: code, pre, code (optionality)\n// highlighter level: span, span, span\n// the spacing are only in the second level for case 1, 3 and in the third level for case 2\n// in AsciiDoc, there is a parent container that contains optionally a title and the content.\n\n// select top level container\ndiv.highlighter-rouge,\ndiv.listingblock > div.content,\nfigure.highlight {\n margin-top: 0;\n margin-bottom: $sp-3;\n background-color: $code-background-color;\n border-radius: $border-radius;\n box-shadow: none;\n -webkit-overflow-scrolling: touch;\n position: relative;\n padding: 0;\n\n // copy button (or other button)\n // the button appear only when there is a hover on the code or focus on button\n > button {\n width: $sp-3;\n opacity: 0;\n position: absolute;\n top: 0;\n right: 0;\n padding: $sp-3;\n border: none;\n background: none;\n color: $body-text-color;\n box-sizing: content-box;\n\n svg {\n fill: $body-text-color;\n }\n\n &:active {\n text-decoration: none;\n outline: none;\n opacity: 1;\n }\n\n &:focus {\n opacity: 1;\n outline: 2px solid $link-color;\n }\n }\n\n // the button can be seen by doing a simple hover in the code, there is no need to go over the location of the button\n &:hover {\n > button {\n cursor: copy;\n opacity: 1;\n }\n }\n}\n\n// setting the spacing and scrollbar on the second level for the first case\n// remove all space on the second and third level\n// this is a mixin to accommodate for the slightly different structures generated via Markdown vs AsciiDoc\n@mixin scroll-and-spacing($code-div, $pre-select) {\n #{$code-div} {\n overflow-x: auto;\n padding: $sp-3;\n margin: 0;\n border: 1px solid $body-text-color;\n border-radius: $border-radius;\n }\n\n #{$pre-select},\n code {\n padding: 0;\n margin: 0;\n border: 0;\n }\n}\n\n// for Markdown\ndiv.highlighter-rouge {\n @include scroll-and-spacing(\"div.highlight\", \"pre.highlight\");\n}\n\n// for AsciiDoc. we also need to fix the margins for its parent container.\ndiv.listingblock {\n margin-top: 0;\n margin-bottom: $sp-3;\n\n @include scroll-and-spacing(\"div.content\", \"div.content > pre\");\n}\n\n// {% highlight LANG %}...{% endhighlight %},\n// {% highlight LANG linenos %}...{% endhighlight %}:\n\n// setting the spacing and scrollbar on the second level for the thirt case\n// the css rule are apply only to the last code enviroment\n// setting the scroolbar\nfigure.highlight {\n pre,\n :not(pre) > code {\n overflow-x: auto;\n padding: $sp-3;\n margin: 0;\n border: 1px solid $body-text-color;\n border-radius: $border-radius;\n }\n}\n\n// ```[LANG]...```, kramdown line_numbers = true,\n// {% highlight LANG linenos %}...{% endhighlight %}:\n\n// setting the spacing and scrollbar on the thirt level for the second case\n.highlight .table-wrapper {\n padding: $sp-3 0;\n margin: 0;\n border: 0;\n box-shadow: none;\n\n td,\n pre {\n min-width: 0;\n padding: 0;\n background-color: $code-background-color;\n border: 0;\n\n @include fs-2;\n }\n\n td.gl {\n width: 1em;\n padding-right: $sp-3;\n padding-left: $sp-3;\n }\n\n pre {\n margin: 0;\n line-height: 2;\n }\n}\n\n// Code examples: html render of a code\n.code-example,\n.listingblock > .title {\n padding: $sp-3;\n margin-bottom: $sp-3;\n overflow: auto;\n border: 1px solid $border-color;\n border-radius: $border-radius;\n\n + .highlighter-rouge,\n + .sectionbody .listingblock,\n + .content,\n + figure.highlight {\n position: relative;\n margin-top: -$sp-4;\n border-right: 1px solid $border-color;\n border-bottom: 1px solid $border-color;\n border-left: 1px solid $border-color;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n }\n}\n\n// Mermaid diagram code blocks should be left unstyled.\ncode.language-mermaid {\n padding: 0;\n background-color: inherit;\n border: 0;\n}\n\n// Override OneDarkJekyll Colors for Code Blocks\n.highlight,\npre.highlight {\n background: $code-background-color; // Code Background\n // For Backwards Compatibility Before $code-linenumber-color was added\n @if variable-exists(code-linenumber-color) {\n color: $code-linenumber-color; // Code Line Numbers\n } @else {\n color: $body-text-color; // Code Line Numbers\n }\n}\n\n// Override OneDarkJekyll Colors for Code Blocks\n.highlight pre {\n background: $code-background-color; // Code Background\n}\n\n// {% endraw %}\n","// Utility classes for colors\n\n// Text colors\n\n.text-grey-dk-000 {\n color: $grey-dk-000 !important;\n}\n\n.text-grey-dk-100 {\n color: $grey-dk-100 !important;\n}\n\n.text-grey-dk-200 {\n color: $grey-dk-200 !important;\n}\n\n.text-grey-dk-250 {\n color: $grey-dk-250 !important;\n}\n\n.text-grey-dk-300 {\n color: $grey-dk-300 !important;\n}\n\n.text-grey-lt-000 {\n color: $grey-lt-000 !important;\n}\n\n.text-grey-lt-100 {\n color: $grey-lt-100 !important;\n}\n\n.text-grey-lt-200 {\n color: $grey-lt-200 !important;\n}\n\n.text-grey-lt-300 {\n color: $grey-lt-300 !important;\n}\n\n.text-blue-000 {\n color: $blue-000 !important;\n}\n\n.text-blue-100 {\n color: $blue-100 !important;\n}\n\n.text-blue-200 {\n color: $blue-200 !important;\n}\n\n.text-blue-300 {\n color: $blue-300 !important;\n}\n\n.text-green-000 {\n color: $green-000 !important;\n}\n\n.text-green-100 {\n color: $green-100 !important;\n}\n\n.text-green-200 {\n color: $green-200 !important;\n}\n\n.text-green-300 {\n color: $green-300 !important;\n}\n\n.text-purple-000 {\n color: $purple-000 !important;\n}\n\n.text-purple-100 {\n color: $purple-100 !important;\n}\n\n.text-purple-200 {\n color: $purple-200 !important;\n}\n\n.text-purple-300 {\n color: $purple-300 !important;\n}\n\n.text-yellow-000 {\n color: $yellow-000 !important;\n}\n\n.text-yellow-100 {\n color: $yellow-100 !important;\n}\n\n.text-yellow-200 {\n color: $yellow-200 !important;\n}\n\n.text-yellow-300 {\n color: $yellow-300 !important;\n}\n\n.text-red-000 {\n color: $red-000 !important;\n}\n\n.text-red-100 {\n color: $red-100 !important;\n}\n\n.text-red-200 {\n color: $red-200 !important;\n}\n\n.text-red-300 {\n color: $red-300 !important;\n}\n\n// Background colors\n\n.bg-grey-dk-000 {\n background-color: $grey-dk-000 !important;\n}\n\n.bg-grey-dk-100 {\n background-color: $grey-dk-100 !important;\n}\n\n.bg-grey-dk-200 {\n background-color: $grey-dk-200 !important;\n}\n\n.bg-grey-dk-250 {\n background-color: $grey-dk-250 !important;\n}\n\n.bg-grey-dk-300 {\n background-color: $grey-dk-300 !important;\n}\n\n.bg-grey-lt-000 {\n background-color: $grey-lt-000 !important;\n}\n\n.bg-grey-lt-100 {\n background-color: $grey-lt-100 !important;\n}\n\n.bg-grey-lt-200 {\n background-color: $grey-lt-200 !important;\n}\n\n.bg-grey-lt-300 {\n background-color: $grey-lt-300 !important;\n}\n\n.bg-blue-000 {\n background-color: $blue-000 !important;\n}\n\n.bg-blue-100 {\n background-color: $blue-100 !important;\n}\n\n.bg-blue-200 {\n background-color: $blue-200 !important;\n}\n\n.bg-blue-300 {\n background-color: $blue-300 !important;\n}\n\n.bg-green-000 {\n background-color: $green-000 !important;\n}\n\n.bg-green-100 {\n background-color: $green-100 !important;\n}\n\n.bg-green-200 {\n background-color: $green-200 !important;\n}\n\n.bg-green-300 {\n background-color: $green-300 !important;\n}\n\n.bg-purple-000 {\n background-color: $purple-000 !important;\n}\n\n.bg-purple-100 {\n background-color: $purple-100 !important;\n}\n\n.bg-purple-200 {\n background-color: $purple-200 !important;\n}\n\n.bg-purple-300 {\n background-color: $purple-300 !important;\n}\n\n.bg-yellow-000 {\n background-color: $yellow-000 !important;\n}\n\n.bg-yellow-100 {\n background-color: $yellow-100 !important;\n}\n\n.bg-yellow-200 {\n background-color: $yellow-200 !important;\n}\n\n.bg-yellow-300 {\n background-color: $yellow-300 !important;\n}\n\n.bg-red-000 {\n background-color: $red-000 !important;\n}\n\n.bg-red-100 {\n background-color: $red-100 !important;\n}\n\n.bg-red-200 {\n background-color: $red-200 !important;\n}\n\n.bg-red-300 {\n background-color: $red-300 !important;\n}\n","// Utility classes for layout\n\n// Display\n\n.d-block {\n display: block !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-none {\n display: none !important;\n}\n\n// Screenreader-only\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border-width: 0;\n}\n\n@each $media-query in map-keys($media-queries) {\n @for $i from 1 through length($spacers) {\n @include mq($media-query) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .d-sm-block, .d-md-none, .d-lg-inline\n .d-#{$media-query}-block {\n display: block !important;\n }\n .d-#{$media-query}-flex {\n display: flex !important;\n }\n .d-#{$media-query}-inline {\n display: inline !important;\n }\n .d-#{$media-query}-inline-block {\n display: inline-block !important;\n }\n .d-#{$media-query}-none {\n display: none !important;\n }\n }\n }\n}\n\n// Horizontal alignment\n\n.float-left {\n float: left !important;\n}\n\n.float-right {\n float: right !important;\n}\n\n.flex-justify-start {\n justify-content: flex-start !important;\n}\n\n.flex-justify-end {\n justify-content: flex-end !important;\n}\n\n.flex-justify-between {\n justify-content: space-between !important;\n}\n\n.flex-justify-around {\n justify-content: space-around !important;\n}\n\n// Vertical alignment\n\n.v-align-baseline {\n vertical-align: baseline !important;\n}\n\n.v-align-bottom {\n vertical-align: bottom !important;\n}\n\n.v-align-middle {\n vertical-align: middle !important;\n}\n\n.v-align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.v-align-text-top {\n vertical-align: text-top !important;\n}\n\n.v-align-top {\n vertical-align: top !important;\n}\n","// Utility classes for typography\n\n.fs-1 {\n @include fs-1;\n}\n\n.fs-2 {\n @include fs-2;\n}\n\n.fs-3 {\n @include fs-3;\n}\n\n.fs-4 {\n @include fs-4;\n}\n\n.fs-5 {\n @include fs-5;\n}\n\n.fs-6 {\n @include fs-6;\n}\n\n.fs-7 {\n @include fs-7;\n}\n\n.fs-8 {\n @include fs-8;\n}\n\n.fs-9 {\n @include fs-9;\n}\n\n.fs-10 {\n @include fs-10;\n}\n\n.fw-300 {\n font-weight: 300 !important;\n}\n\n.fw-400 {\n font-weight: 400 !important;\n}\n\n.fw-500 {\n font-weight: 500 !important;\n}\n\n.fw-700 {\n font-weight: 700 !important;\n}\n\n.lh-0 {\n line-height: 0 !important;\n}\n\n.lh-default {\n line-height: $body-line-height;\n}\n\n.lh-tight {\n line-height: $body-heading-line-height;\n}\n\n.ls-5 {\n letter-spacing: 0.05em !important;\n}\n\n.ls-10 {\n letter-spacing: 0.1em !important;\n}\n\n.ls-0 {\n letter-spacing: 0 !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n","// Utility classes for lists\n\n// stylelint-disable selector-max-type\n\n.list-style-none {\n padding: 0 !important;\n margin: 0 !important;\n list-style: none !important;\n\n li {\n &::before {\n display: none !important;\n }\n }\n}\n","// Utility classes for margins and padding\n\n// stylelint-disable block-opening-brace-space-after, block-opening-brace-space-before\n\n// Margin spacer utilities\n\n.mx-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n}\n\n@for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .m-0, .m-1, .m-2...\n .m-#{$scale} {\n margin: #{$size} !important;\n }\n .mt-#{$scale} {\n margin-top: #{$size} !important;\n }\n .mr-#{$scale} {\n margin-right: #{$size} !important;\n }\n .mb-#{$scale} {\n margin-bottom: #{$size} !important;\n }\n .ml-#{$scale} {\n margin-left: #{$size} !important;\n }\n\n .mx-#{$scale} {\n margin-right: #{$size} !important;\n margin-left: #{$size} !important;\n }\n\n .my-#{$scale} {\n margin-top: #{$size} !important;\n margin-bottom: #{$size} !important;\n }\n\n .mxn-#{$scale} {\n margin-right: -#{$size} !important;\n margin-left: -#{$size} !important;\n }\n .mx-#{$scale}-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n}\n\n@each $media-query in map-keys($media-queries) {\n @for $i from 1 through length($spacers) {\n @include mq($media-query) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .m-sm-0, .m-md-1, .m-lg-2...\n .m-#{$media-query}-#{$scale} {\n margin: #{$size} !important;\n }\n .mt-#{$media-query}-#{$scale} {\n margin-top: #{$size} !important;\n }\n .mr-#{$media-query}-#{$scale} {\n margin-right: #{$size} !important;\n }\n .mb-#{$media-query}-#{$scale} {\n margin-bottom: #{$size} !important;\n }\n .ml-#{$media-query}-#{$scale} {\n margin-left: #{$size} !important;\n }\n\n .mx-#{$media-query}-#{$scale} {\n margin-right: #{$size} !important;\n margin-left: #{$size} !important;\n }\n\n .my-#{$media-query}-#{$scale} {\n margin-top: #{$size} !important;\n margin-bottom: #{$size} !important;\n }\n\n .mxn-#{$media-query}-#{$scale} {\n margin-right: -#{$size} !important;\n margin-left: -#{$size} !important;\n }\n }\n }\n}\n\n// Padding spacer utilities\n\n@for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .p-0, .p-1, .p-2...\n .p-#{$scale} {\n padding: #{$size} !important;\n }\n .pt-#{$scale} {\n padding-top: #{$size} !important;\n }\n .pr-#{$scale} {\n padding-right: #{$size} !important;\n }\n .pb-#{$scale} {\n padding-bottom: #{$size} !important;\n }\n .pl-#{$scale} {\n padding-left: #{$size} !important;\n }\n\n .px-#{$scale} {\n padding-right: #{$size} !important;\n padding-left: #{$size} !important;\n }\n\n .py-#{$scale} {\n padding-top: #{$size} !important;\n padding-bottom: #{$size} !important;\n }\n}\n\n@each $media-query in map-keys($media-queries) {\n @include mq($media-query) {\n @for $i from 1 through length($spacers) {\n $size: #{map-get($spacers, sp-#{$i - 1})};\n $scale: #{$i - 1};\n\n // .p-sm-0, .p-md-1, .p-lg-2...\n .p-#{$media-query}-#{$scale} {\n padding: #{$size} !important;\n }\n .pt-#{$media-query}-#{$scale} {\n padding-top: #{$size} !important;\n }\n .pr-#{$media-query}-#{$scale} {\n padding-right: #{$size} !important;\n }\n .pb-#{$media-query}-#{$scale} {\n padding-bottom: #{$size} !important;\n }\n .pl-#{$media-query}-#{$scale} {\n padding-left: #{$size} !important;\n }\n\n .px-#{$media-query}-#{$scale} {\n padding-right: #{$size} !important;\n padding-left: #{$size} !important;\n }\n\n .py-#{$media-query}-#{$scale} {\n padding-top: #{$size} !important;\n padding-bottom: #{$size} !important;\n }\n }\n }\n}\n","// stylelint-disable selector-max-specificity, selector-max-id, selector-max-type, selector-no-qualifying-type\n\n@media print {\n .site-footer,\n .site-button,\n #edit-this-page,\n #back-to-top,\n .site-nav,\n .main-header {\n display: none !important;\n }\n\n hr {\n margin-top: 1rem;\n margin-bottom: 1rem;\n }\n\n .side-bar {\n width: 100%;\n height: auto;\n border-right: 0 !important;\n }\n\n .site-header {\n border-bottom: 1px solid $border-color;\n }\n\n .site-title {\n font-size: 1rem !important;\n font-weight: 700 !important;\n }\n\n .text-small {\n font-size: 8pt !important;\n }\n\n pre.highlight {\n border: 1px solid $border-color;\n }\n\n .main {\n max-width: none;\n margin-left: 0;\n }\n}\n","// Skipnav\n// Skip to main content\n\na.skip-to-main {\n left: -999px;\n position: absolute;\n top: auto;\n width: 1px;\n height: 1px;\n overflow: hidden;\n z-index: -999;\n}\n\na.skip-to-main:focus,\na.skip-to-main:active {\n color: $link-color;\n background-color: $body-background-color;\n left: auto;\n top: auto;\n width: 30%;\n height: auto;\n overflow: auto;\n margin: 10px 35%;\n padding: 5px;\n border-radius: 15px;\n border: 4px solid $btn-primary-color;\n text-align: center;\n font-size: 1.2em;\n z-index: 999;\n}\n","\n@import \"./support/support\";\n@import \"./custom/setup\";\n@import \"./color_schemes/light\";\n\n@import \"./color_schemes/meshtastic\";\n\n@import \"./modules\";\ndiv.opaque {\n background-color: $body-background-color;\n}\n\np.tip, blockquote.tip {\n border: 1px $green-000 solid;\n border-left: $border-radius solid $green-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $green-300;\n content: \"Tip\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .tip-title {\n color: $green-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.tip-title, blockquote.tip-title {\n border: 1px $green-000 solid;\n border-left: $border-radius solid $green-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $green-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.tip {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.tip-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n\np.note, blockquote.note {\n border: 1px $blue-000 solid;\n border-left: $border-radius solid $blue-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $blue-300;\n content: \"Note\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .note-title {\n color: $blue-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.note-title, blockquote.note-title {\n border: 1px $blue-000 solid;\n border-left: $border-radius solid $blue-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $blue-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.note {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.note-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n\np.warning, blockquote.warning {\n border: 1px $yellow-000 solid;\n border-left: $border-radius solid $yellow-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n \n &::before {\n color: $yellow-300;\n content: \"Warning\";\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n \n > .warning-title {\n color: $yellow-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\np.warning-title, blockquote.warning-title {\n border: 1px $yellow-000 solid;\n border-left: $border-radius solid $yellow-300;\n border-radius: $border-radius;\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12), 0 3px 10px rgba(0, 0, 0, 0.08);\n padding: .8rem;\n > p:first-child {\n margin-top: 0;\n margin-bottom: 0;\n color: $yellow-300;\n display: block;\n font-weight: bold;\n text-transform: uppercase;\n font-size: .75em;\n padding-bottom: .125rem;\n }\n}\n\nblockquote.warning {\n margin-left: 0;\n margin-right: 0;\n\n > p:first-child {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\nblockquote.warning-title {\n margin-left: 0;\n margin-right: 0;\n\n > p:nth-child(2) {\n margin-top: 0;\n }\n\n > p:last-child {\n margin-bottom: 0;\n }\n}\n\n\n@import \"./custom/custom\";\n\n\n"],"file":"just-the-docs-meshtastic.css"} \ No newline at end of file diff --git a/main/assets/js/search-data.json b/main/assets/js/search-data.json index 11bf4f9614..63b545f5c9 100644 --- a/main/assets/js/search-data.json +++ b/main/assets/js/search-data.json @@ -3046,7 +3046,7 @@ },"435": { "doc": "Connections", "title": "Bluetooth (BLE)", - "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. Connection Status . | Icon | State | Lýsing | . | 🟢 | Connected | Active radio link established | . | 🟡 | Connecting | Handshake in progress | . | 🔴 | Aftengd | No active connection | . | ⚪ | Not configured | No device selected | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", + "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range. The screen names anything on the app’s side that is blocking a scan, with the fix attached: . | What you see | What it means | . | A card asking for Nearby devices | The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings. | . | Bluetooth is off | The adapter is disabled — the card opens Bluetooth settings. | . | Bluetooth scanning also needs location services | Android 11 and older only: the permission is held but the system location toggle is off. | . | No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | . Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. Connection Status . | Icon | State | Lýsing | . | 🟢 | Connected | Active radio link established | . | 🟡 | Connecting | Handshake in progress | . | 🔴 | Aftengd | No active connection | . | ⚪ | Not configured | No device selected | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", "url": "/Meshtastic-Android/main/is-rIS/user/connections.html#bluetooth-ble", "relUrl": "/is-rIS/user/connections.html#bluetooth-ble" @@ -3095,7 +3095,7 @@ },"442": { "doc": "コネクション", "title": "Bluetooth(BLE)", - "content": "Bluetooth Low Energy は、Android で標準的かつ最も一般的な接続方法です。 . デバイスをペアリングする . | Meshtastic 無線機の電源が入っていて、ペアリングモードになっていることを確認します。 | アプリを開き、「接続」タブに移動します。 | 「Bluetooth デバイスをスキャン」をタップすると、近くの Meshtastic 無線機が表示されます。 | リストからデバイスを選択します。 | Bluetooth のペアリング確認が表示されたら承認します。 | . 接続カードの下にあるセグメント化されたボタン列(接続方式のセレクター)を使って、Bluetooth・ネットワーク・USB の接続方式を切り替えます(一度に 1 つが有効になります): . 💡 ヒント: デバイスが表示されない場合は、Bluetooth と位置情報の権限が許可されているか、また無線機が別のデバイスにすでに接続されていないかを確認してください。 . 接続ステータス . | アイコン | 状態 | 説明 | . | 🟢 | 接続済 | 無線リンクが確立しています | . | 🟡 | 接続中 | ハンドシェイク中 | . | 🔴 | 切断 | 接続がありません | . | ⚪ | 未設定 | デバイスが選択されていません | . 接続時には、ステータスインジケーターが現在の接続状態を表示します: . デバイスが見つからない場合、アプリは操作手順とともに空の状態を表示します: . Bluetooth のトラブルシューティング . | デバイスが見つからない: Bluetooth をオフ/オンし、位置情報が有効になっていることを確認します。 | 接続が切れる: 無線機に近づき、電波干渉がないか確認します。 | ペアリングが拒否される: Android の Bluetooth 設定でデバイスの登録を解除し、やり直します。 | . ", + "content": "Bluetooth Low Energy は、Android で標準的かつ最も一般的な接続方法です。 . デバイスをペアリングする . | Meshtastic 無線機の電源が入っていて、ペアリングモードになっていることを確認します。 | アプリを開き、「接続」タブに移動します。 | 「Bluetooth デバイスをスキャン」をタップすると、近くの Meshtastic 無線機が表示されます。 | リストからデバイスを選択します。 | Bluetooth のペアリング確認が表示されたら承認します。 | . 接続カードの下にあるセグメント化されたボタン列(接続方式のセレクター)を使って、Bluetooth・ネットワーク・USB の接続方式を切り替えます(一度に 1 つが有効になります): . 💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range. The screen names anything on the app’s side that is blocking a scan, with the fix attached: . | What you see | 意味 | . | A card asking for Nearby devices | The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings. | . | Bluetooth is off | The adapter is disabled — the card opens Bluetooth settings. | . | Bluetooth scanning also needs location services | Android 11 and older only: the permission is held but the system location toggle is off. | . | No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | . Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. 接続ステータス . | アイコン | 状態 | 説明 | . | 🟢 | 接続済 | 無線リンクが確立しています | . | 🟡 | 接続中 | ハンドシェイク中 | . | 🔴 | 切断 | 接続がありません | . | ⚪ | 未設定 | デバイスが選択されていません | . 接続時には、ステータスインジケーターが現在の接続状態を表示します: . デバイスが見つからない場合、アプリは操作手順とともに空の状態を表示します: . Bluetooth のトラブルシューティング . | デバイスが見つからない: Bluetooth をオフ/オンし、位置情報が有効になっていることを確認します。 | 接続が切れる: 無線機に近づき、電波干渉がないか確認します。 | ペアリングが拒否される: Android の Bluetooth 設定でデバイスの登録を解除し、やり直します。 | . ", "url": "/Meshtastic-Android/main/ja-rJP/user/connections.html#bluetoothble", "relUrl": "/ja-rJP/user/connections.html#bluetoothble" @@ -3144,7 +3144,7 @@ },"449": { "doc": "Connections", "title": "Bluetooth (BLE)", - "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. Connection Status . | Icon | State | Descripció | . | 🟢 | Connected | Active radio link established | . | 🟡 | Connecting | Handshake in progress | . | 🔴 | Desconnectat | No active connection | . | ⚪ | Not configured | No device selected | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", + "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range. The screen names anything on the app’s side that is blocking a scan, with the fix attached: . | What you see | What it means | . | A card asking for Nearby devices | The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings. | . | Bluetooth is off | The adapter is disabled — the card opens Bluetooth settings. | . | Bluetooth scanning also needs location services | Android 11 and older only: the permission is held but the system location toggle is off. | . | No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | . Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. Connection Status . | Icon | State | Descripció | . | 🟢 | Connected | Active radio link established | . | 🟡 | Connecting | Handshake in progress | . | 🔴 | Desconnectat | No active connection | . | ⚪ | Not configured | No device selected | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", "url": "/Meshtastic-Android/main/ca-rES/user/connections.html#bluetooth-ble", "relUrl": "/ca-rES/user/connections.html#bluetooth-ble" @@ -3193,7 +3193,7 @@ },"456": { "doc": "Connections", "title": "Bluetooth (BLE)", - "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. Connection Status . | Иконица | State | Опис | . | 🟢 | Блутут повезан | Active radio link established | . | 🟡 | Connecting | Handshake in progress | . | 🔴 | Raskačeno | No active connection | . | ⚪ | Not configured | No device selected | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", + "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range. The screen names anything on the app’s side that is blocking a scan, with the fix attached: . | What you see | What it means | . | A card asking for Nearby devices | The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings. | . | Bluetooth is off | The adapter is disabled — the card opens Bluetooth settings. | . | Bluetooth scanning also needs location services | Android 11 and older only: the permission is held but the system location toggle is off. | . | No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | . Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. Connection Status . | Иконица | State | Опис | . | 🟢 | Блутут повезан | Active radio link established | . | 🟡 | Connecting | Handshake in progress | . | 🔴 | Raskačeno | No active connection | . | ⚪ | Not configured | No device selected | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", "url": "/Meshtastic-Android/main/sr-rLatn/user/connections.html#bluetooth-ble", "relUrl": "/sr-rLatn/user/connections.html#bluetooth-ble" @@ -3242,7 +3242,7 @@ },"463": { "doc": "Connections", "title": "Bluetooth (BLE)", - "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. Connection Status . | Icon | State | 설명 | . | 🟢 | 연결됨 | Active radio link established | . | 🟡 | 연결 중 | Handshake in progress | . | 🔴 | 연결 끊김 | No active connection | . | ⚪ | Not configured | No device selected | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", + "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range. The screen names anything on the app’s side that is blocking a scan, with the fix attached: . | What you see | What it means | . | A card asking for Nearby devices | The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings. | . | Bluetooth is off | The adapter is disabled — the card opens Bluetooth settings. | . | Bluetooth scanning also needs location services | Android 11 and older only: the permission is held but the system location toggle is off. | . | No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | . Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. Connection Status . | Icon | State | 설명 | . | 🟢 | 연결됨 | Active radio link established | . | 🟡 | 연결 중 | Handshake in progress | . | 🔴 | 연결 끊김 | No active connection | . | ⚪ | Not configured | No device selected | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", "url": "/Meshtastic-Android/main/ko-rKR/user/connections.html#bluetooth-ble", "relUrl": "/ko-rKR/user/connections.html#bluetooth-ble" @@ -3291,7 +3291,7 @@ },"470": { "doc": "Connections", "title": "Bluetooth (BLE)", - "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. Connection Status . | Icon | State | Descriere | . | 🟢 | Conectat | Active radio link established | . | 🟡 | Conectare | Handshake in progress | . | 🔴 | Deconectat | No active connection | . | ⚪ | Not configured | Nici un dispozitiv selectat | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", + "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range. The screen names anything on the app’s side that is blocking a scan, with the fix attached: . | What you see | What it means | . | A card asking for Nearby devices | The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings. | . | Bluetooth is off | The adapter is disabled — the card opens Bluetooth settings. | . | Bluetooth scanning also needs location services | Android 11 and older only: the permission is held but the system location toggle is off. | . | No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | . Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. Connection Status . | Icon | State | Descriere | . | 🟢 | Conectat | Active radio link established | . | 🟡 | Conectare | Handshake in progress | . | 🔴 | Deconectat | No active connection | . | ⚪ | Not configured | Nici un dispozitiv selectat | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", "url": "/Meshtastic-Android/main/ro-rRO/user/connections.html#bluetooth-ble", "relUrl": "/ro-rRO/user/connections.html#bluetooth-ble" @@ -3340,7 +3340,7 @@ },"477": { "doc": "Connections", "title": "Bluetooth (BLE)", - "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. Connection Status . | Icon | State | Cur síos | . | 🟢 | Connected | Active radio link established | . | 🟡 | Connecting | Handshake in progress | . | 🔴 | Na ceangailte | No active connection | . | ⚪ | Not configured | No device selected | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", + "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range. The screen names anything on the app’s side that is blocking a scan, with the fix attached: . | What you see | What it means | . | A card asking for Nearby devices | The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings. | . | Bluetooth is off | The adapter is disabled — the card opens Bluetooth settings. | . | Bluetooth scanning also needs location services | Android 11 and older only: the permission is held but the system location toggle is off. | . | No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | . Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. Connection Status . | Icon | State | Cur síos | . | 🟢 | Connected | Active radio link established | . | 🟡 | Connecting | Handshake in progress | . | 🔴 | Na ceangailte | No active connection | . | ⚪ | Not configured | No device selected | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", "url": "/Meshtastic-Android/main/ga-rIE/user/connections.html#bluetooth-ble", "relUrl": "/ga-rIE/user/connections.html#bluetooth-ble" @@ -3389,7 +3389,7 @@ },"484": { "doc": "Connections", "title": "Bluetooth (BLE)", - "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. Connection Status . | Icon | State | תיאור | . | 🟢 | Connected | Active radio link established | . | 🟡 | Connecting | Handshake in progress | . | 🔴 | מנותק | No active connection | . | ⚪ | Not configured | No device selected | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", + "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range. The screen names anything on the app’s side that is blocking a scan, with the fix attached: . | What you see | What it means | . | A card asking for Nearby devices | The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings. | . | Bluetooth is off | The adapter is disabled — the card opens Bluetooth settings. | . | Bluetooth scanning also needs location services | Android 11 and older only: the permission is held but the system location toggle is off. | . | No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | . Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. Connection Status . | Icon | State | תיאור | . | 🟢 | Connected | Active radio link established | . | 🟡 | Connecting | Handshake in progress | . | 🔴 | מנותק | No active connection | . | ⚪ | Not configured | No device selected | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", "url": "/Meshtastic-Android/main/iw-rIL/user/connections.html#bluetooth-ble", "relUrl": "/iw-rIL/user/connections.html#bluetooth-ble" @@ -3438,7 +3438,7 @@ },"491": { "doc": "Connections", "title": "Bluetooth (BLE)", - "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. Connection Status . | Icon | State | Beskrivning | . | 🟢 | Ansluten | Active radio link established | . | 🟡 | Ansluter | Handshake in progress | . | 🔴 | Frånkopplad | No active connection | . | ⚪ | Not configured | Ingen enhet vald | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", + "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range. The screen names anything on the app’s side that is blocking a scan, with the fix attached: . | What you see | What it means | . | A card asking for Nearby devices | The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings. | . | Bluetooth is off | The adapter is disabled — the card opens Bluetooth settings. | . | Bluetooth scanning also needs location services | Android 11 and older only: the permission is held but the system location toggle is off. | . | No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | . Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. Connection Status . | Icon | State | Beskrivning | . | 🟢 | Ansluten | Active radio link established | . | 🟡 | Ansluter | Handshake in progress | . | 🔴 | Frånkopplad | No active connection | . | ⚪ | Not configured | Ingen enhet vald | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", "url": "/Meshtastic-Android/main/sv-rSE/user/connections.html#bluetooth-ble", "relUrl": "/sv-rSE/user/connections.html#bluetooth-ble" @@ -3487,7 +3487,7 @@ },"498": { "doc": "Connections", "title": "Bluetooth (BLE)", - "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. Connection Status . | Icon | State | Deskripsyon | . | 🟢 | Connected | Active radio link established | . | 🟡 | Connecting | Handshake in progress | . | 🔴 | Dekonekte | No active connection | . | ⚪ | Not configured | No device selected | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", + "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range. The screen names anything on the app’s side that is blocking a scan, with the fix attached: . | What you see | What it means | . | A card asking for Nearby devices | The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings. | . | Bluetooth is off | The adapter is disabled — the card opens Bluetooth settings. | . | Bluetooth scanning also needs location services | Android 11 and older only: the permission is held but the system location toggle is off. | . | No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | . Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. Connection Status . | Icon | State | Deskripsyon | . | 🟢 | Connected | Active radio link established | . | 🟡 | Connecting | Handshake in progress | . | 🔴 | Dekonekte | No active connection | . | ⚪ | Not configured | No device selected | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", "url": "/Meshtastic-Android/main/ht-rHT/user/connections.html#bluetooth-ble", "relUrl": "/ht-rHT/user/connections.html#bluetooth-ble" @@ -3536,7 +3536,7 @@ },"505": { "doc": "Yhteydet", "title": "Bluetooth (BLE)", - "content": "Bluetooth Low Energy on oletus ja yleisin yhteystapa Androidilla. Laitteen pariliitos . | Varmista, että Meshtastic-radio on päällä ja paritustilassa. | Avaa sovellus ja siirry Yhdistä-välilehdelle. | Napauta Hae bluetooth-laitteita — lähellä olevat Meshtastic-radiot ilmestyvät näkyville. | Valitse laitteesi listasta. | Hyväksy Bluetooth-pariliitospyyntö, jos se tulee näkyviin. | . Vaihda bluetooth-, verkko- ja USB-yhteyksien välillä käyttämällä yhteyskortin alapuolella olevaa yhteysvalitsinta (vain yksi yhteystapa voi olla aktiivinen kerrallaan): . 💡 Vinkki: Jos laitteesi ei näy, varmista että Bluetooth ja sijaintiluvat on myönnetty ja että radio ei ole jo yhdistettynä toiseen laitteeseen. Yhteyden tila . | Ikoni | Tila | Kuvaus | . | 🟢 | Yhdistetty | Aktiivinen radiolinkki muodostettu | . | 🟡 | Yhdistetään | Yhteyden muodostus käynnissä | . | 🔴 | Ei yhdistetty | Ei aktiivista yhteyttä | . | ⚪ | Ei määritetty | Ei laitetta valittuna | . Yhdistettäessä tilailmaisin näyttää nykyisen yhteyden tilan: . Jos laitteita ei löydy, sovellus näyttää tyhjän näkymän ohjeiden kanssa: . Bluetoothin vianmääritys . | Laitetta ei löydy: Kytke Bluetooth pois/päälle ja varmista, että sijainti on käytössä. | Yhteys katkeaa: Siirry lähemmäs radiota ja tarkista mahdolliset häiriöt. | Paritus hylätty: Poista laite Androidin Bluetooth-asetuksista ja yritä uudelleen. | . ", + "content": "Bluetooth Low Energy on oletus ja yleisin yhteystapa Androidilla. Laitteen pariliitos . | Varmista, että Meshtastic-radio on päällä ja paritustilassa. | Avaa sovellus ja siirry Yhdistä-välilehdelle. | Napauta Hae bluetooth-laitteita — lähellä olevat Meshtastic-radiot ilmestyvät näkyville. | Valitse laitteesi listasta. | Hyväksy Bluetooth-pariliitospyyntö, jos se tulee näkyviin. | . Vaihda bluetooth-, verkko- ja USB-yhteyksien välillä käyttämällä yhteyskortin alapuolella olevaa yhteysvalitsinta (vain yksi yhteystapa voi olla aktiivinen kerrallaan): . 💡 Vinkki: Jos laitettasi ei näy, tarkista, ettei radio ole jo yhdistetty toiseen laitteeseen tai kantaman ulkopuolella. Näytössä kerrotaan kaikki sovelluksen puolella olevat syyt, jotka estävät haun, sekä niiden ratkaisut: . | Näet seuraavan | Mitä se tarkoittaa | . | Kortti pyytää Lähistön laitteet -käyttöoikeutta | Käyttöoikeutta ei ole myönnetty. Myönnä käyttöoikeus pyytää sitä. Kun Android lakkaa kysymästä, painikkeeksi muuttuu Avaa asetukset. | . | Bluetooth on pois käytöstä | Bluetooth-sovitin on poistettu käytöstä – kortti avaa Bluetooth-asetukset. | . | Bluetooth-laitteiden haku edellyttää myös sijaintipalvelujen käyttöä | Vain Android 11:ssä ja vanhemmissa versioissa: käyttöoikeus on myönnetty, mutta järjestelmän sijaintipalvelut ovat pois käytöstä. | . | Ei korttia, tyhjä luettelo | Mikään sovelluksen puolella ei estä hakua – radio on kantaman ulkopuolella, pois käytöstä tai jo yhdistetty toiseen laitteeseen. | . Kun napautat Hae sen jälkeen, kun olet kerran hylännyt käyttöoikeuspyynnön, sovellus kertoo ensin, mihin käyttöoikeutta tarvitaan, ennen kuin pyytää sitä uudelleen. Näin voit myös kieltäytyä rauhassa ilman painostusta. Yhteyden tila . | Ikoni | Tila | Kuvaus | . | 🟢 | Yhdistetty | Aktiivinen radiolinkki muodostettu | . | 🟡 | Yhdistetään | Yhteyden muodostus käynnissä | . | 🔴 | Ei yhdistetty | Ei aktiivista yhteyttä | . | ⚪ | Ei määritetty | Ei laitetta valittuna | . Yhdistettäessä tilailmaisin näyttää nykyisen yhteyden tilan: . Jos laitteita ei löydy, sovellus näyttää tyhjän näkymän ohjeiden kanssa: . Bluetoothin vianmääritys . | Laitetta ei löydy: Kytke Bluetooth pois/päälle ja varmista, että sijainti on käytössä. | Yhteys katkeaa: Siirry lähemmäs radiota ja tarkista mahdolliset häiriöt. | Paritus hylätty: Poista laite Androidin Bluetooth-asetuksista ja yritä uudelleen. | . ", "url": "/Meshtastic-Android/main/fi-rFI/user/connections.html#bluetooth-ble", "relUrl": "/fi-rFI/user/connections.html#bluetooth-ble" @@ -3585,7 +3585,7 @@ },"512": { "doc": "Connections", "title": "Bluetooth (BLE)", - "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. Connection Status . | Icon | State | Descrición | . | 🟢 | Connected | Active radio link established | . | 🟡 | Connecting | Handshake in progress | . | 🔴 | Desconectado | No active connection | . | ⚪ | Not configured | No device selected | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", + "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range. The screen names anything on the app’s side that is blocking a scan, with the fix attached: . | What you see | What it means | . | A card asking for Nearby devices | The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings. | . | Bluetooth is off | The adapter is disabled — the card opens Bluetooth settings. | . | Bluetooth scanning also needs location services | Android 11 and older only: the permission is held but the system location toggle is off. | . | No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | . Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. Connection Status . | Icon | State | Descrición | . | 🟢 | Connected | Active radio link established | . | 🟡 | Connecting | Handshake in progress | . | 🔴 | Desconectado | No active connection | . | ⚪ | Not configured | No device selected | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", "url": "/Meshtastic-Android/main/gl-rES/user/connections.html#bluetooth-ble", "relUrl": "/gl-rES/user/connections.html#bluetooth-ble" @@ -3634,7 +3634,7 @@ },"519": { "doc": "Connexions", "title": "Bluetooth (BLE)", - "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. Connection Status . | Icon | State | Description | . | 🟢 | Connecté | Active radio link established | . | 🟡 | Connexion en cours | Handshake in progress | . | 🔴 | Déconnecté | No active connection | . | ⚪ | Not configured | Aucun appareil sélectionné | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", + "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range. The screen names anything on the app’s side that is blocking a scan, with the fix attached: . | What you see | What it means | . | A card asking for Nearby devices | The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings. | . | Bluetooth is off | The adapter is disabled — the card opens Bluetooth settings. | . | Bluetooth scanning also needs location services | Android 11 and older only: the permission is held but the system location toggle is off. | . | No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | . Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. Connection Status . | Icon | State | Description | . | 🟢 | Connecté | Active radio link established | . | 🟡 | Connexion en cours | Handshake in progress | . | 🔴 | Déconnecté | No active connection | . | ⚪ | Not configured | Aucun appareil sélectionné | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", "url": "/Meshtastic-Android/main/fr-rCA/user/connections.html#bluetooth-ble", "relUrl": "/fr-rCA/user/connections.html#bluetooth-ble" @@ -3683,7 +3683,7 @@ },"526": { "doc": "Connections", "title": "Bluetooth (BLE)", - "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. Connection Status . | Icon | State | Опис | . | 🟢 | Під’єднано | Active radio link established | . | 🟡 | Під’єднання | Handshake in progress | . | 🔴 | Відключено | No active connection | . | ⚪ | Not configured | Не вибраний пристрій | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", + "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range. The screen names anything on the app’s side that is blocking a scan, with the fix attached: . | What you see | What it means | . | A card asking for Nearby devices | The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings. | . | Bluetooth is off | The adapter is disabled — the card opens Bluetooth settings. | . | Bluetooth scanning also needs location services | Android 11 and older only: the permission is held but the system location toggle is off. | . | No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | . Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. Connection Status . | Icon | State | Опис | . | 🟢 | Під’єднано | Active radio link established | . | 🟡 | Під’єднання | Handshake in progress | . | 🔴 | Відключено | No active connection | . | ⚪ | Not configured | Не вибраний пристрій | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", "url": "/Meshtastic-Android/main/uk-rUA/user/connections.html#bluetooth-ble", "relUrl": "/uk-rUA/user/connections.html#bluetooth-ble" @@ -3732,7 +3732,7 @@ },"533": { "doc": "Verbindungen", "title": "Bluetooth (BLE)", - "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. Connection Status . | Symbol | Status | Beschreibung | . | 🟢 | Verbunden | Active radio link established | . | 🟡 | Wird verbunden | Handshake in progress | . | 🔴 | Verbindung getrennt | No active connection | . | ⚪ | Not configured | Kein Gerät ausgewählt | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", + "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range. The screen names anything on the app’s side that is blocking a scan, with the fix attached: . | What you see | What it means | . | A card asking for Nearby devices | The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings. | . | Bluetooth is off | The adapter is disabled — the card opens Bluetooth settings. | . | Bluetooth scanning also needs location services | Android 11 and older only: the permission is held but the system location toggle is off. | . | No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | . Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. Connection Status . | Symbol | Status | Beschreibung | . | 🟢 | Verbunden | Active radio link established | . | 🟡 | Wird verbunden | Handshake in progress | . | 🔴 | Verbindung getrennt | No active connection | . | ⚪ | Not configured | Kein Gerät ausgewählt | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", "url": "/Meshtastic-Android/main/de-rDE/user/connections.html#bluetooth-ble", "relUrl": "/de-rDE/user/connections.html#bluetooth-ble" @@ -3781,7 +3781,7 @@ },"540": { "doc": "Connections", "title": "Bluetooth (BLE)", - "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. Connection Status . | Icon | State | Opis | . | 🟢 | Connected | Active radio link established | . | 🟡 | Connecting | Handshake in progress | . | 🔴 | Odspojeno | No active connection | . | ⚪ | Not configured | No device selected | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", + "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range. The screen names anything on the app’s side that is blocking a scan, with the fix attached: . | What you see | What it means | . | A card asking for Nearby devices | The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings. | . | Bluetooth is off | The adapter is disabled — the card opens Bluetooth settings. | . | Bluetooth scanning also needs location services | Android 11 and older only: the permission is held but the system location toggle is off. | . | No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | . Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. Connection Status . | Icon | State | Opis | . | 🟢 | Connected | Active radio link established | . | 🟡 | Connecting | Handshake in progress | . | 🔴 | Odspojeno | No active connection | . | ⚪ | Not configured | No device selected | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", "url": "/Meshtastic-Android/main/hr-rHR/user/connections.html#bluetooth-ble", "relUrl": "/hr-rHR/user/connections.html#bluetooth-ble" @@ -3830,7 +3830,7 @@ },"547": { "doc": "Connections", "title": "Bluetooth (BLE)", - "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. Connection Status . | Icon | State | Aprašymas | . | 🟢 | Connected | Active radio link established | . | 🟡 | Connecting | Handshake in progress | . | 🔴 | Atsijungta | No active connection | . | ⚪ | Not configured | No device selected | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", + "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range. The screen names anything on the app’s side that is blocking a scan, with the fix attached: . | What you see | What it means | . | A card asking for Nearby devices | The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings. | . | Bluetooth is off | The adapter is disabled — the card opens Bluetooth settings. | . | Bluetooth scanning also needs location services | Android 11 and older only: the permission is held but the system location toggle is off. | . | No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | . Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. Connection Status . | Icon | State | Aprašymas | . | 🟢 | Connected | Active radio link established | . | 🟡 | Connecting | Handshake in progress | . | 🔴 | Atsijungta | No active connection | . | ⚪ | Not configured | No device selected | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", "url": "/Meshtastic-Android/main/lt-rLT/user/connections.html#bluetooth-ble", "relUrl": "/lt-rLT/user/connections.html#bluetooth-ble" @@ -3928,7 +3928,7 @@ },"561": { "doc": "Connections", "title": "Bluetooth (BLE)", - "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. Connection Status . | Icon | State | Leírás | . | 🟢 | Csatlakoztatva | Active radio link established | . | 🟡 | Csatlakozás… | Handshake in progress | . | 🔴 | Szétkapcsolva | No active connection | . | ⚪ | Not configured | No device selected | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", + "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range. The screen names anything on the app’s side that is blocking a scan, with the fix attached: . | What you see | What it means | . | A card asking for Nearby devices | The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings. | . | Bluetooth is off | The adapter is disabled — the card opens Bluetooth settings. | . | Bluetooth scanning also needs location services | Android 11 and older only: the permission is held but the system location toggle is off. | . | No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | . Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. Connection Status . | Icon | State | Leírás | . | 🟢 | Csatlakoztatva | Active radio link established | . | 🟡 | Csatlakozás… | Handshake in progress | . | 🔴 | Szétkapcsolva | No active connection | . | ⚪ | Not configured | No device selected | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", "url": "/Meshtastic-Android/main/hu-rHU/user/connections.html#bluetooth-ble", "relUrl": "/hu-rHU/user/connections.html#bluetooth-ble" @@ -3977,7 +3977,7 @@ },"568": { "doc": "Връзки", "title": "Bluetooth (BLE)", - "content": "Bluetooth Low Energy е методът за свързване по подразбиране и най-често срещаният в Android. Сдвояване на устройство . | Уверете се, че вашето радио Meshtastic е включено и е в режим на сдвояване. | Отворете приложението и отидете в раздела Свързване. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Изберете вашето устройство от списъка. | Приемете подканата за Bluetooth сдвояване, ако се покаже. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. Състояние на връзката . | Икона | Състояние | Описание | . | 🟢 | Свързано | Установена активна радиовръзка | . | 🟡 | Свързване | Ръкостискането е в ход | . | 🔴 | Прекъсната връзка | Няма активна връзка | . | ⚪ | Не е конфигурирано | Няма избрано устройство | . При свързване, индикатора за състояние показва текущото състояние на връзката: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", + "content": "Bluetooth Low Energy е методът за свързване по подразбиране и най-често срещаният в Android. Сдвояване на устройство . | Уверете се, че вашето радио Meshtastic е включено и е в режим на сдвояване. | Отворете приложението и отидете в раздела Свързване. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Изберете вашето устройство от списъка. | Приемете подканата за Bluetooth сдвояване, ако се покаже. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range. The screen names anything on the app’s side that is blocking a scan, with the fix attached: . | What you see | What it means | . | A card asking for Nearby devices | The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings. | . | Bluetooth is off | The adapter is disabled — the card opens Bluetooth settings. | . | Bluetooth scanning also needs location services | Android 11 and older only: the permission is held but the system location toggle is off. | . | No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | . Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. Състояние на връзката . | Икона | Състояние | Описание | . | 🟢 | Свързано | Установена активна радиовръзка | . | 🟡 | Свързване | Ръкостискането е в ход | . | 🔴 | Прекъсната връзка | Няма активна връзка | . | ⚪ | Не е конфигурирано | Няма избрано устройство | . При свързване, индикатора за състояние показва текущото състояние на връзката: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", "url": "/Meshtastic-Android/main/bg-rBG/user/connections.html#bluetooth-ble", "relUrl": "/bg-rBG/user/connections.html#bluetooth-ble" @@ -4026,7 +4026,7 @@ },"575": { "doc": "Connections", "title": "Bluetooth (BLE)", - "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. Connection Status . | Icon | State | Opis | . | 🟢 | Connected | Active radio link established | . | 🟡 | Connecting | Handshake in progress | . | 🔴 | Prekinjeno | No active connection | . | ⚪ | Not configured | No device selected | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", + "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range. The screen names anything on the app’s side that is blocking a scan, with the fix attached: . | What you see | What it means | . | A card asking for Nearby devices | The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings. | . | Bluetooth is off | The adapter is disabled — the card opens Bluetooth settings. | . | Bluetooth scanning also needs location services | Android 11 and older only: the permission is held but the system location toggle is off. | . | No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | . Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. Connection Status . | Icon | State | Opis | . | 🟢 | Connected | Active radio link established | . | 🟡 | Connecting | Handshake in progress | . | 🔴 | Prekinjeno | No active connection | . | ⚪ | Not configured | No device selected | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", "url": "/Meshtastic-Android/main/sl-rSI/user/connections.html#bluetooth-ble", "relUrl": "/sl-rSI/user/connections.html#bluetooth-ble" @@ -4075,7 +4075,7 @@ },"582": { "doc": "Ligações", "title": "Bluetooth (BLE)", - "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. Connection Status . | Icon | State | Descrição | . | 🟢 | Ligado | Active radio link established | . | 🟡 | A ligar | Handshake in progress | . | 🔴 | Desconectado | No active connection | . | ⚪ | Not configured | No device selected | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", + "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range. The screen names anything on the app’s side that is blocking a scan, with the fix attached: . | What you see | What it means | . | A card asking for Nearby devices | The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings. | . | Bluetooth is off | The adapter is disabled — the card opens Bluetooth settings. | . | Bluetooth scanning also needs location services | Android 11 and older only: the permission is held but the system location toggle is off. | . | No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | . Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. Connection Status . | Icon | State | Descrição | . | 🟢 | Ligado | Active radio link established | . | 🟡 | A ligar | Handshake in progress | . | 🔴 | Desconectado | No active connection | . | ⚪ | Not configured | No device selected | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", "url": "/Meshtastic-Android/main/pt-rPT/user/connections.html#bluetooth-ble", "relUrl": "/pt-rPT/user/connections.html#bluetooth-ble" @@ -4124,7 +4124,7 @@ },"589": { "doc": "Connections", "title": "Bluetooth (BLE)", - "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. Connection Status . | Icon | State | Апісанне | . | 🟢 | Злучаны | Active radio link established | . | 🟡 | Злучаемся | Handshake in progress | . | 🔴 | Адлучана | No active connection | . | ⚪ | Not configured | No device selected | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", + "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range. The screen names anything on the app’s side that is blocking a scan, with the fix attached: . | What you see | What it means | . | A card asking for Nearby devices | The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings. | . | Bluetooth is off | The adapter is disabled — the card opens Bluetooth settings. | . | Bluetooth scanning also needs location services | Android 11 and older only: the permission is held but the system location toggle is off. | . | No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | . Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. Connection Status . | Icon | State | Апісанне | . | 🟢 | Злучаны | Active radio link established | . | 🟡 | Злучаемся | Handshake in progress | . | 🔴 | Адлучана | No active connection | . | ⚪ | Not configured | No device selected | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", "url": "/Meshtastic-Android/main/be-rBY/user/connections.html#bluetooth-ble", "relUrl": "/be-rBY/user/connections.html#bluetooth-ble" @@ -4173,7 +4173,7 @@ },"596": { "doc": "Conexões", "title": "Bluetooth (BLE)", - "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. Connection Status . | Icon | State | Descrição | . | 🟢 | Conectado | Active radio link established | . | 🟡 | Connecting | Handshake in progress | . | 🔴 | Desconectado | No active connection | . | ⚪ | Not configured | No device selected | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", + "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range. The screen names anything on the app’s side that is blocking a scan, with the fix attached: . | What you see | What it means | . | A card asking for Nearby devices | The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings. | . | Bluetooth is off | The adapter is disabled — the card opens Bluetooth settings. | . | Bluetooth scanning also needs location services | Android 11 and older only: the permission is held but the system location toggle is off. | . | No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | . Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. Connection Status . | Icon | State | Descrição | . | 🟢 | Conectado | Active radio link established | . | 🟡 | Connecting | Handshake in progress | . | 🔴 | Desconectado | No active connection | . | ⚪ | Not configured | No device selected | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", "url": "/Meshtastic-Android/main/pt-rBR/user/connections.html#bluetooth-ble", "relUrl": "/pt-rBR/user/connections.html#bluetooth-ble" @@ -4222,7 +4222,7 @@ },"603": { "doc": "Connections", "title": "Bluetooth (BLE)", - "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. Connection Status . | Icon | State | Περιγραφή | . | 🟢 | Connected | Active radio link established | . | 🟡 | Connecting | Handshake in progress | . | 🔴 | Αποσυνδεδεμένο | No active connection | . | ⚪ | Not configured | No device selected | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", + "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range. The screen names anything on the app’s side that is blocking a scan, with the fix attached: . | What you see | What it means | . | A card asking for Nearby devices | The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings. | . | Bluetooth is off | The adapter is disabled — the card opens Bluetooth settings. | . | Bluetooth scanning also needs location services | Android 11 and older only: the permission is held but the system location toggle is off. | . | No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | . Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. Connection Status . | Icon | State | Περιγραφή | . | 🟢 | Connected | Active radio link established | . | 🟡 | Connecting | Handshake in progress | . | 🔴 | Αποσυνδεδεμένο | No active connection | . | ⚪ | Not configured | No device selected | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", "url": "/Meshtastic-Android/main/el-rGR/user/connections.html#bluetooth-ble", "relUrl": "/el-rGR/user/connections.html#bluetooth-ble" @@ -4271,7 +4271,7 @@ },"610": { "doc": "Conexiones", "title": "Bluetooth (BLE)", - "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. Connection Status . | Icon | State | Descripción | . | 🟢 | Conectado | Active radio link established | . | 🟡 | Conectando | Handshake in progress | . | 🔴 | Desconectado | No active connection | . | ⚪ | Not configured | No device selected | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", + "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range. The screen names anything on the app’s side that is blocking a scan, with the fix attached: . | What you see | What it means | . | A card asking for Nearby devices | The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings. | . | Bluetooth is off | The adapter is disabled — the card opens Bluetooth settings. | . | Bluetooth scanning also needs location services | Android 11 and older only: the permission is held but the system location toggle is off. | . | No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | . Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. Connection Status . | Icon | State | Descripción | . | 🟢 | Conectado | Active radio link established | . | 🟡 | Conectando | Handshake in progress | . | 🔴 | Desconectado | No active connection | . | ⚪ | Not configured | No device selected | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", "url": "/Meshtastic-Android/main/es-rES/user/connections.html#bluetooth-ble", "relUrl": "/es-rES/user/connections.html#bluetooth-ble" @@ -4320,7 +4320,7 @@ },"617": { "doc": "Bağlantılar", "title": "Bluetooth (BLE)", - "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. Connection Status . | Icon | State | Açıklaması | . | 🟢 | Bağlandı | Active radio link established | . | 🟡 | Bağlanıyor | Handshake in progress | . | 🔴 | Bağlantı kesildi | No active connection | . | ⚪ | Not configured | No device selected | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", + "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range. The screen names anything on the app’s side that is blocking a scan, with the fix attached: . | What you see | What it means | . | A card asking for Nearby devices | The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings. | . | Bluetooth is off | The adapter is disabled — the card opens Bluetooth settings. | . | Bluetooth scanning also needs location services | Android 11 and older only: the permission is held but the system location toggle is off. | . | No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | . Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. Connection Status . | Icon | State | Açıklaması | . | 🟢 | Bağlandı | Active radio link established | . | 🟡 | Bağlanıyor | Handshake in progress | . | 🔴 | Bağlantı kesildi | No active connection | . | ⚪ | Not configured | No device selected | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", "url": "/Meshtastic-Android/main/tr-rTR/user/connections.html#bluetooth-ble", "relUrl": "/tr-rTR/user/connections.html#bluetooth-ble" @@ -4369,7 +4369,7 @@ },"624": { "doc": "Connections", "title": "Bluetooth (BLE)", - "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. Connection Status . | Icon | State | Beskrivelse | . | 🟢 | Connected | Active radio link established | . | 🟡 | Connecting | Handshake in progress | . | 🔴 | Frakoblet | No active connection | . | ⚪ | Not configured | No device selected | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", + "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range. The screen names anything on the app’s side that is blocking a scan, with the fix attached: . | What you see | What it means | . | A card asking for Nearby devices | The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings. | . | Bluetooth is off | The adapter is disabled — the card opens Bluetooth settings. | . | Bluetooth scanning also needs location services | Android 11 and older only: the permission is held but the system location toggle is off. | . | No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | . Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. Connection Status . | Icon | State | Beskrivelse | . | 🟢 | Connected | Active radio link established | . | 🟡 | Connecting | Handshake in progress | . | 🔴 | Frakoblet | No active connection | . | ⚪ | Not configured | No device selected | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", "url": "/Meshtastic-Android/main/no-rNO/user/connections.html#bluetooth-ble", "relUrl": "/no-rNO/user/connections.html#bluetooth-ble" @@ -4418,7 +4418,7 @@ },"631": { "doc": "Соединения", "title": "Bluetooth (BLE)", - "content": "Bluetooth Low Energy является наиболее распространенным методом подключения на Android. Привязка устройства . | Убедитесь, что устройство Meshtastic включено и находится в режиме сопряжения. | Откройте приложение и перейдите на вкладку Подключение. | Нажми Сканировать Bluetooth-устройства — рядом появятся радиостанции Meshtastic. | Выберите ваше устройство из списка. | Примите запрос на соединение Bluetooth, если показано. | . Используйте селектор транспорта — ряд сегментированных кнопок под карточкой подключения — для переключения между транспортами Bluetooth, Network и USB (одновременно активен только один): . 💡 Подсказка: Если ваше радио Meshtastic не отображается, проверьте, предоставлены ли разрешения на Bluetooth и геолокацию, а также не подключено ли ваше радио к другому устройству. Статус подключения . | Иконка | Состояние | Описание | . | 🟢 | Подключено | Подключение активно | . | 🟡 | Подключение | Выполняется рукопожатие | . | 🔴 | Отключено | Нет активного соединения | . | ⚪ | Не настроено | Устройство не выбрано | . При подключении индикатор состояния показывает текущее состояние соединения: . Если устройства не найдены, приложение показывает пустое состояние с инструкциями: . Устранение неполадок Bluetooth . | Устройство не найдено: Выключи и снова включи Bluetooth, убедись, что включена служба определения местоположения. | Потеря связи: Подойди ближе к ноде; проверь наличие помех. | Сопряжение отклонено: Забыть устройство в настройках Bluetooth на Android и повторить попытку. | . ", + "content": "Bluetooth Low Energy является наиболее распространенным методом подключения на Android. Привязка устройства . | Убедитесь, что устройство Meshtastic включено и находится в режиме сопряжения. | Откройте приложение и перейдите на вкладку Подключение. | Нажми Сканировать Bluetooth-устройства — рядом появятся радиостанции Meshtastic. | Выберите ваше устройство из списка. | Примите запрос на соединение Bluetooth, если показано. | . Используйте селектор транспорта — ряд сегментированных кнопок под карточкой подключения — для переключения между транспортами Bluetooth, Network и USB (одновременно активен только один): . 💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range. The screen names anything on the app’s side that is blocking a scan, with the fix attached: . | What you see | Что это значит | . | A card asking for Nearby devices | The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings. | . | Bluetooth is off | The adapter is disabled — the card opens Bluetooth settings. | . | Bluetooth scanning also needs location services | Android 11 and older only: the permission is held but the system location toggle is off. | . | No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | . Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. Статус подключения . | Иконка | Состояние | Описание | . | 🟢 | Подключено | Подключение активно | . | 🟡 | Подключение | Выполняется рукопожатие | . | 🔴 | Отключено | Нет активного соединения | . | ⚪ | Не настроено | Устройство не выбрано | . При подключении индикатор состояния показывает текущее состояние соединения: . Если устройства не найдены, приложение показывает пустое состояние с инструкциями: . Устранение неполадок Bluetooth . | Устройство не найдено: Выключи и снова включи Bluetooth, убедись, что включена служба определения местоположения. | Потеря связи: Подойди ближе к ноде; проверь наличие помех. | Сопряжение отклонено: Забыть устройство в настройках Bluetooth на Android и повторить попытку. | . ", "url": "/Meshtastic-Android/main/ru-rRU/user/connections.html#bluetooth-ble", "relUrl": "/ru-rRU/user/connections.html#bluetooth-ble" @@ -4467,7 +4467,7 @@ },"638": { "doc": "Connections", "title": "Bluetooth (BLE)", - "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. Connection Status . | Icon | State | Beschrijving | . | 🟢 | Verbonden | Active radio link established | . | 🟡 | Bezig met verbinden | Handshake in progress | . | 🔴 | Niet verbonden | No active connection | . | ⚪ | Not configured | No device selected | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", + "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range. The screen names anything on the app’s side that is blocking a scan, with the fix attached: . | What you see | What it means | . | A card asking for Nearby devices | The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings. | . | Bluetooth is off | The adapter is disabled — the card opens Bluetooth settings. | . | Bluetooth scanning also needs location services | Android 11 and older only: the permission is held but the system location toggle is off. | . | No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | . Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. Connection Status . | Icon | State | Beschrijving | . | 🟢 | Verbonden | Active radio link established | . | 🟡 | Bezig met verbinden | Handshake in progress | . | 🔴 | Niet verbonden | No active connection | . | ⚪ | Not configured | No device selected | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", "url": "/Meshtastic-Android/main/nl-rNL/user/connections.html#bluetooth-ble", "relUrl": "/nl-rNL/user/connections.html#bluetooth-ble" @@ -4516,7 +4516,7 @@ },"645": { "doc": "Ühendus", "title": "Sinihammas (BLE)", - "content": "Sinihamba madal voolutarve on Androidi vaike- ja levinuim ühendusviis. Seadme sidumine . | Veendu, et Meshtastic seade on sisse lülitatud ja sidumisrežiimis. | Ava rakendus ja navigeeri vahekaardile Ühendused. | Puuduta valikut Otsi sinihamba seadmeid – kuvatakse lähedalasuvad Meshtasticu raadiod. | Vali loendist oma seade. | Nõustu Bluetoothi ​​sidumise taotlusega, kui see kuvatakse. | . Sinihamba, võrgu ja USB-transpordi vahel vahetamiseks (üks on korraga aktiivne) kasutage transpordivalijat – ühenduskaardi all asuvat segmenteeritud nuppude rida: . 💡 Vihje: Kui sinu seadet ei kuvata, kontrolli, kas sinihamba ​​ja asukoha load on antud ning et raadio poleks juba teise seadmega ühendatud. Ühenduse olek . | Ikoon | Olek | Kirjeldus | . | 🟢 | Ühendatud | Aktiivne raadioside loodud | . | 🟡 | Ühendan | Kätlemine on pooleli | . | 🔴 | Ühendus katkenud | Aktiivset ühendust pole | . | ⚪ | Pole seadistatud | Seadet pole valitud | . Ühenduse loomisel näitab olekuindikaator ühenduse praegust olekut: . Kui seadmeid ei leita, kuvab rakendus tühja oleku koos juhistega: . Sinihamba veaotsing . | Seadet ei leitud: Lülita sinihammas sisse/välja ja veendu, et asukoha määramine on lubatud. | Connection drops: Move closer to the radio; check for interference. | Sidumine tagasi lükatud: Unusta seade Androidi sinihamba ​​seadetes ja proovi uuesti. | . ", + "content": "Sinihamba madal voolutarve on Androidi vaike- ja levinuim ühendusviis. Seadme sidumine . | Veendu, et Meshtastic seade on sisse lülitatud ja sidumisrežiimis. | Ava rakendus ja navigeeri vahekaardile Ühendused. | Puuduta valikut Otsi sinihamba seadmeid – kuvatakse lähedalasuvad Meshtasticu raadiod. | Vali loendist oma seade. | Nõustu Bluetoothi ​​sidumise taotlusega, kui see kuvatakse. | . Sinihamba, võrgu ja USB-transpordi vahel vahetamiseks (üks on korraga aktiivne) kasutage transpordivalijat – ühenduskaardi all asuvat segmenteeritud nuppude rida: . 💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range. The screen names anything on the app’s side that is blocking a scan, with the fix attached: . | What you see | What it means | . | A card asking for Nearby devices | The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings. | . | Bluetooth is off | The adapter is disabled — the card opens Bluetooth settings. | . | Bluetooth scanning also needs location services | Android 11 and older only: the permission is held but the system location toggle is off. | . | No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | . Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. Ühenduse olek . | Ikoon | Olek | Kirjeldus | . | 🟢 | Ühendatud | Aktiivne raadioside loodud | . | 🟡 | Ühendan | Kätlemine on pooleli | . | 🔴 | Ühendus katkenud | Aktiivset ühendust pole | . | ⚪ | Pole seadistatud | Seadet pole valitud | . Ühenduse loomisel näitab olekuindikaator ühenduse praegust olekut: . Kui seadmeid ei leita, kuvab rakendus tühja oleku koos juhistega: . Sinihamba veaotsing . | Seadet ei leitud: Lülita sinihammas sisse/välja ja veendu, et asukoha määramine on lubatud. | Connection drops: Move closer to the radio; check for interference. | Sidumine tagasi lükatud: Unusta seade Androidi sinihamba ​​seadetes ja proovi uuesti. | . ", "url": "/Meshtastic-Android/main/et-rEE/user/connections.html#sinihammas-ble", "relUrl": "/et-rEE/user/connections.html#sinihammas-ble" @@ -4565,7 +4565,7 @@ },"652": { "doc": "Connessioni", "title": "Bluetooth (BLE)", - "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. Connection Status . | Icon | State | Descrizione | . | 🟢 | Connesso | Active radio link established | . | 🟡 | Connessione in corso | Handshake in progress | . | 🔴 | Disconnesso | No active connection | . | ⚪ | Not configured | Nessun dispositivo selezionato | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", + "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range. The screen names anything on the app’s side that is blocking a scan, with the fix attached: . | What you see | What it means | . | A card asking for Nearby devices | The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings. | . | Bluetooth is off | The adapter is disabled — the card opens Bluetooth settings. | . | Bluetooth scanning also needs location services | Android 11 and older only: the permission is held but the system location toggle is off. | . | No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | . Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. Connection Status . | Icon | State | Descrizione | . | 🟢 | Connesso | Active radio link established | . | 🟡 | Connessione in corso | Handshake in progress | . | 🔴 | Disconnesso | No active connection | . | ⚪ | Not configured | Nessun dispositivo selezionato | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", "url": "/Meshtastic-Android/main/it-rIT/user/connections.html#bluetooth-ble", "relUrl": "/it-rIT/user/connections.html#bluetooth-ble" @@ -4614,7 +4614,7 @@ },"659": { "doc": "Connections", "title": "Bluetooth (BLE)", - "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. Connection Status . | Icon | State | الوصف | . | 🟢 | Connected | Active radio link established | . | 🟡 | Connecting | Handshake in progress | . | 🔴 | انقطع الاتصال | No active connection | . | ⚪ | Not configured | No device selected | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", + "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range. The screen names anything on the app’s side that is blocking a scan, with the fix attached: . | What you see | What it means | . | A card asking for Nearby devices | The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings. | . | Bluetooth is off | The adapter is disabled — the card opens Bluetooth settings. | . | Bluetooth scanning also needs location services | Android 11 and older only: the permission is held but the system location toggle is off. | . | No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | . Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. Connection Status . | Icon | State | الوصف | . | 🟢 | Connected | Active radio link established | . | 🟡 | Connecting | Handshake in progress | . | 🔴 | انقطع الاتصال | No active connection | . | ⚪ | Not configured | No device selected | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", "url": "/Meshtastic-Android/main/ar-rSA/user/connections.html#bluetooth-ble", "relUrl": "/ar-rSA/user/connections.html#bluetooth-ble" @@ -4663,7 +4663,7 @@ },"666": { "doc": "Connections", "title": "Bluetooth (BLE)", - "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. Connection Status . | Icon | State | Popis | . | 🟢 | Pripojený | Active radio link established | . | 🟡 | Prebieha pripájanie | Handshake in progress | . | 🔴 | Odpojené | No active connection | . | ⚪ | Not configured | Nebolo vybrané žiadne zariadenie | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", + "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range. The screen names anything on the app’s side that is blocking a scan, with the fix attached: . | What you see | What it means | . | A card asking for Nearby devices | The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings. | . | Bluetooth is off | The adapter is disabled — the card opens Bluetooth settings. | . | Bluetooth scanning also needs location services | Android 11 and older only: the permission is held but the system location toggle is off. | . | No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | . Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. Connection Status . | Icon | State | Popis | . | 🟢 | Pripojený | Active radio link established | . | 🟡 | Prebieha pripájanie | Handshake in progress | . | 🔴 | Odpojené | No active connection | . | ⚪ | Not configured | Nebolo vybrané žiadne zariadenie | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", "url": "/Meshtastic-Android/main/sk-rSK/user/connections.html#bluetooth-ble", "relUrl": "/sk-rSK/user/connections.html#bluetooth-ble" @@ -4712,7 +4712,7 @@ },"673": { "doc": "Connections", "title": "Bluetooth (BLE)", - "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. Connection Status . | Icon | State | Opis | . | 🟢 | Połączony | Active radio link established | . | 🟡 | Łączenie | Handshake in progress | . | 🔴 | Rozłączono | No active connection | . | ⚪ | Not configured | Nie wybrano urządzenia | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", + "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range. The screen names anything on the app’s side that is blocking a scan, with the fix attached: . | What you see | What it means | . | A card asking for Nearby devices | The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings. | . | Bluetooth is off | The adapter is disabled — the card opens Bluetooth settings. | . | Bluetooth scanning also needs location services | Android 11 and older only: the permission is held but the system location toggle is off. | . | No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | . Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. Connection Status . | Icon | State | Opis | . | 🟢 | Połączony | Active radio link established | . | 🟡 | Łączenie | Handshake in progress | . | 🔴 | Rozłączono | No active connection | . | ⚪ | Not configured | Nie wybrano urządzenia | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", "url": "/Meshtastic-Android/main/pl-rPL/user/connections.html#bluetooth-ble", "relUrl": "/pl-rPL/user/connections.html#bluetooth-ble" @@ -4761,7 +4761,7 @@ },"680": { "doc": "連線", "title": "藍牙(BLE)", - "content": "藍牙低功耗是 Android 上預設且最常見的連線方式。 . 配對裝置 . | 請確認您的 Meshtastic 無線電裝置已開機,並進入配對模式。 | 開啟應用程式,並前往「連線」頁籤。 | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | 從清單中選取您的裝置。 | 若出現藍牙配對提示,請點選接受。 | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 提示:若裝置未顯示,請確認已授予藍牙與位置權限,且該無線電裝置尚未連接至其他裝置。 . 連線狀態 . | 圖示 | 狀態 | 描述說明 | . | 🟢 | 已連線 | 無線電連線已建立 | . | 🟡 | 正在連線 | 交握進行中 | . | 🔴 | 已中斷連線 | 無作用中連線 | . | ⚪ | 尚未設定 | 未選擇裝置 | . 連線過程中,狀態指示器會顯示目前的連線狀態: . 若未找到任何裝置,應用程式將顯示空白畫面並提供操作說明: . 藍牙疑難排解 . | 找不到裝置:請關閉再開啟藍牙,並確認已啟用位置服務。 | 連線中斷:請靠近無線電裝置,並檢查是否有訊號干擾。 | 配對遭拒:請至 Android 藍牙設定中移除該裝置後重新配對。 | . ", + "content": "藍牙低功耗是 Android 上預設且最常見的連線方式。 . 配對裝置 . | 請確認您的 Meshtastic 無線電裝置已開機,並進入配對模式。 | 開啟應用程式,並前往「連線」頁籤。 | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | 從清單中選取您的裝置。 | 若出現藍牙配對提示,請點選接受。 | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range. The screen names anything on the app’s side that is blocking a scan, with the fix attached: . | What you see | 代表意義 | . | A card asking for Nearby devices | The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings. | . | Bluetooth is off | The adapter is disabled — the card opens Bluetooth settings. | . | Bluetooth scanning also needs location services | Android 11 and older only: the permission is held but the system location toggle is off. | . | No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | . Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. 連線狀態 . | 圖示 | 狀態 | 描述說明 | . | 🟢 | 已連線 | 無線電連線已建立 | . | 🟡 | 正在連線 | 交握進行中 | . | 🔴 | 已中斷連線 | 無作用中連線 | . | ⚪ | 尚未設定 | 未選擇裝置 | . 連線過程中,狀態指示器會顯示目前的連線狀態: . 若未找到任何裝置,應用程式將顯示空白畫面並提供操作說明: . 藍牙疑難排解 . | 找不到裝置:請關閉再開啟藍牙,並確認已啟用位置服務。 | 連線中斷:請靠近無線電裝置,並檢查是否有訊號干擾。 | 配對遭拒:請至 Android 藍牙設定中移除該裝置後重新配對。 | . ", "url": "/Meshtastic-Android/main/zh-rTW/user/connections.html#%E8%97%8D%E7%89%99ble", "relUrl": "/zh-rTW/user/connections.html#藍牙ble" @@ -4810,7 +4810,7 @@ },"687": { "doc": "Připojení", "title": "Bluetooth (BLE)", - "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. Connection Status . | Icon | State | Popis | . | 🟢 | Připojeno | Active radio link established | . | 🟡 | Připojování | Handshake in progress | . | 🔴 | Odpojeno | No active connection | . | ⚪ | Not configured | Není vybráno žádné zařízení | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", + "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range. The screen names anything on the app’s side that is blocking a scan, with the fix attached: . | What you see | What it means | . | A card asking for Nearby devices | The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings. | . | Bluetooth is off | The adapter is disabled — the card opens Bluetooth settings. | . | Bluetooth scanning also needs location services | Android 11 and older only: the permission is held but the system location toggle is off. | . | No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | . Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. Connection Status . | Icon | State | Popis | . | 🟢 | Připojeno | Active radio link established | . | 🟡 | Připojování | Handshake in progress | . | 🔴 | Odpojeno | No active connection | . | ⚪ | Not configured | Není vybráno žádné zařízení | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", "url": "/Meshtastic-Android/main/cs-rCZ/user/connections.html#bluetooth-ble", "relUrl": "/cs-rCZ/user/connections.html#bluetooth-ble" @@ -4859,7 +4859,7 @@ },"694": { "doc": "Connexions", "title": "Bluetooth (BLE)", - "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. Connection Status . | Icon | State | Description | . | 🟢 | Connecté | Active radio link established | . | 🟡 | Connexion en cours | Handshake in progress | . | 🔴 | Déconnecté | No active connection | . | ⚪ | Not configured | Aucun appareil sélectionné | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", + "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range. The screen names anything on the app’s side that is blocking a scan, with the fix attached: . | What you see | What it means | . | A card asking for Nearby devices | The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings. | . | Bluetooth is off | The adapter is disabled — the card opens Bluetooth settings. | . | Bluetooth scanning also needs location services | Android 11 and older only: the permission is held but the system location toggle is off. | . | No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | . Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. Connection Status . | Icon | State | Description | . | 🟢 | Connecté | Active radio link established | . | 🟡 | Connexion en cours | Handshake in progress | . | 🔴 | Déconnecté | No active connection | . | ⚪ | Not configured | Aucun appareil sélectionné | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", "url": "/Meshtastic-Android/main/fr-rFR/user/connections.html#bluetooth-ble", "relUrl": "/fr-rFR/user/connections.html#bluetooth-ble" @@ -4908,7 +4908,7 @@ },"701": { "doc": "连接数", "title": "Bluetooth (BLE)", - "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. Connection Status . | 图标 | State | 说明 | . | 🟢 | 已连接 | Active radio link established | . | 🟡 | 正在连接 | Handshake in progress | . | 🔴 | 已断开连接 | No active connection | . | ⚪ | Not configured | 未选择设备 | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", + "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range. The screen names anything on the app’s side that is blocking a scan, with the fix attached: . | What you see | What it means | . | A card asking for Nearby devices | The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings. | . | Bluetooth is off | The adapter is disabled — the card opens Bluetooth settings. | . | Bluetooth scanning also needs location services | Android 11 and older only: the permission is held but the system location toggle is off. | . | No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | . Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. Connection Status . | 图标 | State | 说明 | . | 🟢 | 已连接 | Active radio link established | . | 🟡 | 正在连接 | Handshake in progress | . | 🔴 | 已断开连接 | No active connection | . | ⚪ | Not configured | 未选择设备 | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", "url": "/Meshtastic-Android/main/zh-rCN/user/connections.html#bluetooth-ble", "relUrl": "/zh-rCN/user/connections.html#bluetooth-ble" @@ -4957,7 +4957,7 @@ },"708": { "doc": "Connections", "title": "Bluetooth (BLE)", - "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. Connection Status . | Иконица | State | Опис | . | 🟢 | Блутут повезан | Active radio link established | . | 🟡 | Connecting | Handshake in progress | . | 🔴 | Раскачено | No active connection | . | ⚪ | Not configured | No device selected | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", + "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range. The screen names anything on the app’s side that is blocking a scan, with the fix attached: . | What you see | What it means | . | A card asking for Nearby devices | The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings. | . | Bluetooth is off | The adapter is disabled — the card opens Bluetooth settings. | . | Bluetooth scanning also needs location services | Android 11 and older only: the permission is held but the system location toggle is off. | . | No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | . Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. Connection Status . | Иконица | State | Опис | . | 🟢 | Блутут повезан | Active radio link established | . | 🟡 | Connecting | Handshake in progress | . | 🔴 | Раскачено | No active connection | . | ⚪ | Not configured | No device selected | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", "url": "/Meshtastic-Android/main/srp/user/connections.html#bluetooth-ble", "relUrl": "/srp/user/connections.html#bluetooth-ble" @@ -5006,7 +5006,7 @@ },"715": { "doc": "Connections", "title": "Bluetooth (BLE)", - "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. Connection Status . | Icon | State | Përshkrimi | . | 🟢 | Connected | Active radio link established | . | 🟡 | Connecting | Handshake in progress | . | 🔴 | I shkëputur | No active connection | . | ⚪ | Not configured | No device selected | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", + "content": "Bluetooth Low Energy is the default and most common connection method on Android. Pairing a Device . | Ensure your Meshtastic radio is powered on and in pairing mode. | Open the app and navigate to the Connect tab. | Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear. | Select your device from the list. | Accept the Bluetooth pairing prompt if shown. | . Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time): . 💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range. The screen names anything on the app’s side that is blocking a scan, with the fix attached: . | What you see | What it means | . | A card asking for Nearby devices | The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings. | . | Bluetooth is off | The adapter is disabled — the card opens Bluetooth settings. | . | Bluetooth scanning also needs location services | Android 11 and older only: the permission is held but the system location toggle is off. | . | No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | . Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. Connection Status . | Icon | State | Përshkrimi | . | 🟢 | Connected | Active radio link established | . | 🟡 | Connecting | Handshake in progress | . | 🔴 | I shkëputur | No active connection | . | ⚪ | Not configured | No device selected | . When connecting, a status indicator shows the current connection state: . If no devices are found, the app shows an empty state with instructions: . Troubleshooting Bluetooth . | Device not found: Toggle Bluetooth off/on, ensure location is enabled. | Connection drops: Move closer to the radio; check for interference. | Pairing rejected: Forget the device in Android Bluetooth settings and retry. | . ", "url": "/Meshtastic-Android/main/sq-rAL/user/connections.html#bluetooth-ble", "relUrl": "/sq-rAL/user/connections.html#bluetooth-ble" @@ -28995,21 +28995,21 @@ },"4142": { "doc": "Getting Started", "title": "First Launch", - "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", + "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", "url": "/Meshtastic-Android/main/is-rIS/user/onboarding.html#first-launch", "relUrl": "/is-rIS/user/onboarding.html#first-launch" },"4143": { "doc": "Getting Started", "title": "Permissions", - "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . If denied, Bluetooth scanning will not function and your node will not report a position. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . ", + "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . Reviewing permissions later . Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: . | State | What tapping the row does | . | Allowed | Opens the system page, so you can review or revoke it | . | Not asked yet | Requests it | . | Denied — tap to allow | Explains what the permission is for, then asks again if you agree | . | Blocked — tap to open system settings | Android will no longer show its dialog, so this opens the page where you can turn it back on | . | Not required on this version of Android | Nothing — the permission does not exist on your device | . This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead. ", "url": "/Meshtastic-Android/main/is-rIS/user/onboarding.html#permissions", "relUrl": "/is-rIS/user/onboarding.html#permissions" },"4144": { "doc": "Getting Started", "title": "After Setup", - "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use. ", + "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ", "url": "/Meshtastic-Android/main/is-rIS/user/onboarding.html#after-setup", "relUrl": "/is-rIS/user/onboarding.html#after-setup" @@ -29030,21 +29030,21 @@ },"4147": { "doc": "はじめに", "title": "初回起動", - "content": "アプリを初めて開くと、必要な権限と設定を構成するための導入フローが案内されます。 各ステップは順番に完了することも、スキップして後で Android の設定で権限を構成することもできます。 . ようこそ画面 . ようこそ画面では、Meshtastic とその主な機能を紹介します: . | オフグリッドのメッシュ通信 | 携帯電話やインターネットは不要 | エンドツーエンドで暗号化されたメッセージング | . 開始するをタップして、セットアップフローを進めます。 . ", + "content": "アプリを初めて開くと、必要な権限と設定を構成するための導入フローが案内されます。 Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app. ようこそ画面 . ようこそ画面では、Meshtastic とその主な機能を紹介します: . | オフグリッドのメッシュ通信 | 携帯電話やインターネットは不要 | エンドツーエンドで暗号化されたメッセージング | . 開始するをタップして、セットアップフローを進めます。 . ", "url": "/Meshtastic-Android/main/ja-rJP/user/onboarding.html#%E5%88%9D%E5%9B%9E%E8%B5%B7%E5%8B%95", "relUrl": "/ja-rJP/user/onboarding.html#初回起動" },"4148": { "doc": "はじめに", "title": "権限", - "content": "アプリはセットアップ中にいくつかの権限を要求します。 それぞれに特定の目的があり、一部は主要な機能に必要です。 . Bluetooth の権限 . Bluetooth は、スマートフォンと Meshtastic 無線機の主な接続方法です: . | Bluetooth スキャン:近くの Meshtastic 無線機を検出します | Bluetooth 接続:ペアリング済みの無線機との接続を確立して維持します | . プロンプトが表示されたら、両方の権限を許可してください。 Bluetooth がない場合は、代わりに USB または TCP 接続を使用する必要があります。 . 位置情報の権限 . ⚠️ なぜ Bluetooth に位置情報が必要なのですか? Android では、近くの Bluetooth Low Energy デバイスを検出するために位置情報の権限が必要です。 これは Android システムの要件であり、Meshtastic 固有の仕様ではありません。 . Meshtastic は、次の目的でも位置情報を使用します: . | メッシュマップ上に自分の位置を表示する | 他のノードまでの距離を計算する | 他のメッシュメンバーと GPS 座標を共有する(有効な場合) | . お好みに応じて、**「アプリの使用中のみ」または「常に許可」**を選択してください: . | アプリの使用中のみ:アプリが開いているときだけ位置情報を更新します | 常に許可:常時メッシュに存在するために、バックグラウンドでの位置情報更新を有効にします | . 拒否すると、Bluetooth スキャンが機能せず、ノードは位置情報を報告しません。 . 通知の権限 . 通知は、次のことをお知らせします: . | チャンネルおよびダイレクトメッセージの受信 | メッシュに参加する新しいノード | リモートノードのバッテリー低下 | . 💡 ヒント: 通知の設定は、後で Android のシステム設定で細かく調整できます。アプリはカテゴリごとに個別の通知チャンネルを作成する(さらに、バックグラウンドサービスなどの内部用のものもいくつか作成する)ため、個別に有効化したり消音したりできます。 . 重要なアラートの権限 . 対応デバイスでは、アプリが重要なアラートの権限を要求することがあります: . | これらは、サイレントモードを突破できる高優先度の通知です | 緊急のメッシュアラートや至急のメッセージに役立ちます | 突破通知が不要な場合は、このステップをスキップできます | 後で Android の通知設定で構成または取り消しができます | . ", + "content": "アプリはセットアップ中にいくつかの権限を要求します。 それぞれに特定の目的があり、一部は主要な機能に必要です。 . Bluetooth の権限 . Bluetooth は、スマートフォンと Meshtastic 無線機の主な接続方法です: . | Bluetooth スキャン:近くの Meshtastic 無線機を検出します | Bluetooth 接続:ペアリング済みの無線機との接続を確立して維持します | . プロンプトが表示されたら、両方の権限を許可してください。 Bluetooth がない場合は、代わりに USB または TCP 接続を使用する必要があります。 . 位置情報の権限 . ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio. Meshtastic は、次の目的でも位置情報を使用します: . | メッシュマップ上に自分の位置を表示する | 他のノードまでの距離を計算する | 他のメッシュメンバーと GPS 座標を共有する(有効な場合) | . お好みに応じて、**「アプリの使用中のみ」または「常に許可」**を選択してください: . | アプリの使用中のみ:アプリが開いているときだけ位置情報を更新します | 常に許可:常時メッシュに存在するために、バックグラウンドでの位置情報更新を有効にします | . Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. 通知の権限 . 通知は、次のことをお知らせします: . | チャンネルおよびダイレクトメッセージの受信 | メッシュに参加する新しいノード | リモートノードのバッテリー低下 | . 💡 ヒント: 通知の設定は、後で Android のシステム設定で細かく調整できます。アプリはカテゴリごとに個別の通知チャンネルを作成する(さらに、バックグラウンドサービスなどの内部用のものもいくつか作成する)ため、個別に有効化したり消音したりできます。 . 重要なアラートの権限 . 対応デバイスでは、アプリが重要なアラートの権限を要求することがあります: . | これらは、サイレントモードを突破できる高優先度の通知です | 緊急のメッシュアラートや至急のメッセージに役立ちます | 突破通知が不要な場合は、このステップをスキップできます | 後で Android の通知設定で構成または取り消しができます | . Reviewing permissions later . Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: . | 状態 | What tapping the row does | . | Allowed | Opens the system page, so you can review or revoke it | . | Not asked yet | Requests it | . | Denied — tap to allow | Explains what the permission is for, then asks again if you agree | . | Blocked — tap to open system settings | Android will no longer show its dialog, so this opens the page where you can turn it back on | . | Not required on this version of Android | Nothing — the permission does not exist on your device | . This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead. ", "url": "/Meshtastic-Android/main/ja-rJP/user/onboarding.html#%E6%A8%A9%E9%99%90", "relUrl": "/ja-rJP/user/onboarding.html#権限" },"4149": { "doc": "はじめに", "title": "セットアップ後", - "content": "権限を許可すると、アプリはメイン画面に移行します。 最初に行うべきことは、Meshtastic 無線機への接続です。詳しい手順は接続を参照してください。 . 💡 ヒント: セットアップ中に権限をスキップした場合は、後で**「Android 設定 → アプリ → Meshtastic → 権限」**から許可できます。 不足している権限が、使おうとする機能を妨げる場合は、アプリが再度確認を求めます。 . ", + "content": "権限を許可すると、アプリはメイン画面に移行します。 最初に行うべきことは、Meshtastic 無線機への接続です。詳しい手順は接続を参照してください。 . 💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ", "url": "/Meshtastic-Android/main/ja-rJP/user/onboarding.html#%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97%E5%BE%8C", "relUrl": "/ja-rJP/user/onboarding.html#セットアップ後" @@ -29065,21 +29065,21 @@ },"4152": { "doc": "Getting Started", "title": "First Launch", - "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", + "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", "url": "/Meshtastic-Android/main/ca-rES/user/onboarding.html#first-launch", "relUrl": "/ca-rES/user/onboarding.html#first-launch" },"4153": { "doc": "Getting Started", "title": "Permissions", - "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . If denied, Bluetooth scanning will not function and your node will not report a position. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . ", + "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . Reviewing permissions later . Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: . | State | What tapping the row does | . | Allowed | Opens the system page, so you can review or revoke it | . | Not asked yet | Requests it | . | Denied — tap to allow | Explains what the permission is for, then asks again if you agree | . | Blocked — tap to open system settings | Android will no longer show its dialog, so this opens the page where you can turn it back on | . | Not required on this version of Android | Nothing — the permission does not exist on your device | . This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead. ", "url": "/Meshtastic-Android/main/ca-rES/user/onboarding.html#permissions", "relUrl": "/ca-rES/user/onboarding.html#permissions" },"4154": { "doc": "Getting Started", "title": "After Setup", - "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use. ", + "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ", "url": "/Meshtastic-Android/main/ca-rES/user/onboarding.html#after-setup", "relUrl": "/ca-rES/user/onboarding.html#after-setup" @@ -29100,21 +29100,21 @@ },"4157": { "doc": "Getting Started", "title": "First Launch", - "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", + "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", "url": "/Meshtastic-Android/main/sr-rLatn/user/onboarding.html#first-launch", "relUrl": "/sr-rLatn/user/onboarding.html#first-launch" },"4158": { "doc": "Getting Started", "title": "Permissions", - "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . If denied, Bluetooth scanning will not function and your node will not report a position. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . ", + "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . Reviewing permissions later . Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: . | State | What tapping the row does | . | Allowed | Opens the system page, so you can review or revoke it | . | Not asked yet | Requests it | . | Denied — tap to allow | Explains what the permission is for, then asks again if you agree | . | Blocked — tap to open system settings | Android will no longer show its dialog, so this opens the page where you can turn it back on | . | Not required on this version of Android | Nothing — the permission does not exist on your device | . This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead. ", "url": "/Meshtastic-Android/main/sr-rLatn/user/onboarding.html#permissions", "relUrl": "/sr-rLatn/user/onboarding.html#permissions" },"4159": { "doc": "Getting Started", "title": "After Setup", - "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use. ", + "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ", "url": "/Meshtastic-Android/main/sr-rLatn/user/onboarding.html#after-setup", "relUrl": "/sr-rLatn/user/onboarding.html#after-setup" @@ -29135,21 +29135,21 @@ },"4162": { "doc": "Getting Started", "title": "First Launch", - "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", + "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", "url": "/Meshtastic-Android/main/ko-rKR/user/onboarding.html#first-launch", "relUrl": "/ko-rKR/user/onboarding.html#first-launch" },"4163": { "doc": "Getting Started", "title": "Permissions", - "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . If denied, Bluetooth scanning will not function and your node will not report a position. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . ", + "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . Reviewing permissions later . Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: . | State | What tapping the row does | . | Allowed | Opens the system page, so you can review or revoke it | . | Not asked yet | Requests it | . | Denied — tap to allow | Explains what the permission is for, then asks again if you agree | . | Blocked — tap to open system settings | Android will no longer show its dialog, so this opens the page where you can turn it back on | . | Not required on this version of Android | Nothing — the permission does not exist on your device | . This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead. ", "url": "/Meshtastic-Android/main/ko-rKR/user/onboarding.html#permissions", "relUrl": "/ko-rKR/user/onboarding.html#permissions" },"4164": { "doc": "Getting Started", "title": "After Setup", - "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use. ", + "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ", "url": "/Meshtastic-Android/main/ko-rKR/user/onboarding.html#after-setup", "relUrl": "/ko-rKR/user/onboarding.html#after-setup" @@ -29170,21 +29170,21 @@ },"4167": { "doc": "Getting Started", "title": "First Launch", - "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", + "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", "url": "/Meshtastic-Android/main/ro-rRO/user/onboarding.html#first-launch", "relUrl": "/ro-rRO/user/onboarding.html#first-launch" },"4168": { "doc": "Getting Started", "title": "Permissions", - "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . If denied, Bluetooth scanning will not function and your node will not report a position. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . ", + "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . Reviewing permissions later . Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: . | State | What tapping the row does | . | Allowed | Opens the system page, so you can review or revoke it | . | Not asked yet | Requests it | . | Denied — tap to allow | Explains what the permission is for, then asks again if you agree | . | Blocked — tap to open system settings | Android will no longer show its dialog, so this opens the page where you can turn it back on | . | Not required on this version of Android | Nothing — the permission does not exist on your device | . This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead. ", "url": "/Meshtastic-Android/main/ro-rRO/user/onboarding.html#permissions", "relUrl": "/ro-rRO/user/onboarding.html#permissions" },"4169": { "doc": "Getting Started", "title": "After Setup", - "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use. ", + "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ", "url": "/Meshtastic-Android/main/ro-rRO/user/onboarding.html#after-setup", "relUrl": "/ro-rRO/user/onboarding.html#after-setup" @@ -29205,21 +29205,21 @@ },"4172": { "doc": "Getting Started", "title": "First Launch", - "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", + "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", "url": "/Meshtastic-Android/main/ga-rIE/user/onboarding.html#first-launch", "relUrl": "/ga-rIE/user/onboarding.html#first-launch" },"4173": { "doc": "Getting Started", "title": "Permissions", - "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . If denied, Bluetooth scanning will not function and your node will not report a position. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . ", + "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . Reviewing permissions later . Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: . | State | What tapping the row does | . | Allowed | Opens the system page, so you can review or revoke it | . | Not asked yet | Requests it | . | Denied — tap to allow | Explains what the permission is for, then asks again if you agree | . | Blocked — tap to open system settings | Android will no longer show its dialog, so this opens the page where you can turn it back on | . | Not required on this version of Android | Nothing — the permission does not exist on your device | . This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead. ", "url": "/Meshtastic-Android/main/ga-rIE/user/onboarding.html#permissions", "relUrl": "/ga-rIE/user/onboarding.html#permissions" },"4174": { "doc": "Getting Started", "title": "After Setup", - "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use. ", + "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ", "url": "/Meshtastic-Android/main/ga-rIE/user/onboarding.html#after-setup", "relUrl": "/ga-rIE/user/onboarding.html#after-setup" @@ -29240,21 +29240,21 @@ },"4177": { "doc": "Getting Started", "title": "First Launch", - "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", + "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", "url": "/Meshtastic-Android/main/iw-rIL/user/onboarding.html#first-launch", "relUrl": "/iw-rIL/user/onboarding.html#first-launch" },"4178": { "doc": "Getting Started", "title": "Permissions", - "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . If denied, Bluetooth scanning will not function and your node will not report a position. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . ", + "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . Reviewing permissions later . Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: . | State | What tapping the row does | . | Allowed | Opens the system page, so you can review or revoke it | . | Not asked yet | Requests it | . | Denied — tap to allow | Explains what the permission is for, then asks again if you agree | . | Blocked — tap to open system settings | Android will no longer show its dialog, so this opens the page where you can turn it back on | . | Not required on this version of Android | Nothing — the permission does not exist on your device | . This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead. ", "url": "/Meshtastic-Android/main/iw-rIL/user/onboarding.html#permissions", "relUrl": "/iw-rIL/user/onboarding.html#permissions" },"4179": { "doc": "Getting Started", "title": "After Setup", - "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use. ", + "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ", "url": "/Meshtastic-Android/main/iw-rIL/user/onboarding.html#after-setup", "relUrl": "/iw-rIL/user/onboarding.html#after-setup" @@ -29275,21 +29275,21 @@ },"4182": { "doc": "Kom igång", "title": "First Launch", - "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", + "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", "url": "/Meshtastic-Android/main/sv-rSE/user/onboarding.html#first-launch", "relUrl": "/sv-rSE/user/onboarding.html#first-launch" },"4183": { "doc": "Kom igång", "title": "Permissions", - "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . If denied, Bluetooth scanning will not function and your node will not report a position. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . ", + "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . Reviewing permissions later . Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: . | State | What tapping the row does | . | Allowed | Opens the system page, so you can review or revoke it | . | Not asked yet | Requests it | . | Denied — tap to allow | Explains what the permission is for, then asks again if you agree | . | Blocked — tap to open system settings | Android will no longer show its dialog, so this opens the page where you can turn it back on | . | Not required on this version of Android | Nothing — the permission does not exist on your device | . This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead. ", "url": "/Meshtastic-Android/main/sv-rSE/user/onboarding.html#permissions", "relUrl": "/sv-rSE/user/onboarding.html#permissions" },"4184": { "doc": "Kom igång", "title": "After Setup", - "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use. ", + "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ", "url": "/Meshtastic-Android/main/sv-rSE/user/onboarding.html#after-setup", "relUrl": "/sv-rSE/user/onboarding.html#after-setup" @@ -29310,21 +29310,21 @@ },"4187": { "doc": "Getting Started", "title": "First Launch", - "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", + "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", "url": "/Meshtastic-Android/main/ht-rHT/user/onboarding.html#first-launch", "relUrl": "/ht-rHT/user/onboarding.html#first-launch" },"4188": { "doc": "Getting Started", "title": "Permissions", - "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . If denied, Bluetooth scanning will not function and your node will not report a position. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . ", + "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . Reviewing permissions later . Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: . | State | What tapping the row does | . | Allowed | Opens the system page, so you can review or revoke it | . | Not asked yet | Requests it | . | Denied — tap to allow | Explains what the permission is for, then asks again if you agree | . | Blocked — tap to open system settings | Android will no longer show its dialog, so this opens the page where you can turn it back on | . | Not required on this version of Android | Nothing — the permission does not exist on your device | . This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead. ", "url": "/Meshtastic-Android/main/ht-rHT/user/onboarding.html#permissions", "relUrl": "/ht-rHT/user/onboarding.html#permissions" },"4189": { "doc": "Getting Started", "title": "After Setup", - "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use. ", + "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ", "url": "/Meshtastic-Android/main/ht-rHT/user/onboarding.html#after-setup", "relUrl": "/ht-rHT/user/onboarding.html#after-setup" @@ -29345,21 +29345,21 @@ },"4192": { "doc": "Aloittaminen", "title": "Ensimmäinen käynnistys", - "content": "Kun avaat sovelluksen ensimmäistä kertaa, sinut ohjataan käyttöönottoprosessin läpi, joka auttaa määrittämään tarvittavat käyttöoikeudet ja asetukset. Voit suorittaa jokaisen vaiheen järjestyksessä tai ohittaa ne ja määrittää käyttöoikeudet myöhemmin Androidin asetuksissa. Aloitusnäkymä . Tervetulonäyttö esittelee Meshtasticin ja sen tärkeimmät ominaisuudet: . | Matkapuhelinverkosta riippumaton mesh-viestintä | Ei vaadi matkapuhelinverkkoa tai internetyhteyttä | Päästä päähän salattu viestintä | . Napauta “Aloita” jatkaaksesi käyttöönottoprosessia. ", + "content": "Kun avaat sovelluksen ensimmäistä kertaa, sinut ohjataan käyttöönottoprosessin läpi, joka auttaa määrittämään tarvittavat käyttöoikeudet ja asetukset. Jokainen vaihe voidaan suorittaa järjestyksessä tai ohittaa – mikään niistä ei ole kertaluonteinen mahdollisuus. Kaikki käyttöoikeudet voidaan tarkistaa ja myöntää myöhemmin sovelluksen Asetukset → Käyttöoikeudet -kohdassa. Aloitusnäkymä . Tervetulonäyttö esittelee Meshtasticin ja sen tärkeimmät ominaisuudet: . | Matkapuhelinverkosta riippumaton mesh-viestintä | Ei vaadi matkapuhelinverkkoa tai internetyhteyttä | Päästä päähän salattu viestintä | . Napauta “Aloita” jatkaaksesi käyttöönottoprosessia. ", "url": "/Meshtastic-Android/main/fi-rFI/user/onboarding.html#ensimm%C3%A4inen-k%C3%A4ynnistys", "relUrl": "/fi-rFI/user/onboarding.html#ensimmäinen-käynnistys" },"4193": { "doc": "Aloittaminen", "title": "Käyttöoikeudet", - "content": "Sovellus pyytää määrityksen aikana useita käyttöoikeuksia. Jokaisella niistä on oma tarkoituksensa, ja osa niistä on välttämättömiä perustoimintojen kannalta. Bluetooth-käyttöoikeus . Bluetooth on ensisijainen yhteystapa puhelimesi ja Meshtastic-radion välillä: . | Bluetooth-skannaus — etsi lähellä olevia Meshtastic-radioita | Bluetooth-yhteys — muodosta ja ylläpidä yhteyksiä pariliitettyihin radioihin | . Myönnä molemmat käyttöoikeudet pyydettäessä. Ilman Bluetoothia sinun on käytettävä sen sijaan USB- tai TCP-yhteyksiä. Sijaintikäyttöoikeus . ⚠️ Miksi sijaintikäyttöoikeus tarvitaan Bluetoothille? Android vaatii sijaintikäyttöoikeuden lähellä olevien Bluetooth Low Energy -laitteiden löytämiseen. Tämä on Android-järjestelmän vaatimus, eikä Meshtasticin erityinen valinta. Meshtastic käyttää sijaintiasi myös seuraaviin tarkoituksiin: . | Sijaintisi näyttäminen mesh-kartalla | Etäisyyksien laskeminen muihin radioihin | GPS-koordinaattiesi jakaminen muiden verkon jäsenten kanssa (jos käytössä) | . Myönnä “Sovelluksen käytön aikana” tai “Aina” oman mieltymyksesi mukaan: . | Sovelluksen käytön aikana — sijainti päivittyy vain silloin, kun sovellus on avoinna | Aina — mahdollistaa sijainnin päivittämisen taustalla jatkuvaa verkon läsnäoloa varten | . Jos käyttöoikeus evätään, Bluetooth-skannaus ei toimi eikä radiosi raportoi sijaintia. Ilmoituskäyttöoikeus . Ilmoitukset kertovat sinulle: . | Saapuvista viesteistä kanavilta ja yksityisviesteistä | Uusista mesh-verkkoon liittyvistä radioista | Etäradion akun vähäisestä virrasta | . 💡 Vinkki: Voit myöhemmin säätää ilmoitusasetuksia Androidin järjestelmäasetuksissa. Sovellus luo jokaiselle ilmoitusluokalle oman ilmoituskanavan (sekä muutamia sisäisiä kanavia, kuten taustapalvelulle), joten voit ottaa ne käyttöön tai mykistää ne yksitellen. Kriittisten hälytysten käyttöoikeus . Tuetuilla laitteilla sovellus voi pyytää käyttöoikeutta kriittisiin hälytyksiin: . | Nämä ovat korkean prioriteetin ilmoituksia, jotka voivat ohittaa Älä häiritse -tilan | Hyödyllinen hätätilanteiden verkkohälytyksille tai kiireellisille viesteille | Voit ohittaa tämän vaiheen, jos et tarvitse ilmoituksia, jotka ohittavat Älä häiritse -tilan | Voit määrittää tai peruuttaa tämän myöhemmin Androidin ilmoitusasetuksissa | . ", + "content": "Sovellus pyytää määrityksen aikana useita käyttöoikeuksia. Jokaisella niistä on oma tarkoituksensa, ja osa niistä on välttämättömiä perustoimintojen kannalta. Bluetooth-käyttöoikeus . Bluetooth on ensisijainen yhteystapa puhelimesi ja Meshtastic-radion välillä: . | Bluetooth-skannaus — etsi lähellä olevia Meshtastic-radioita | Bluetooth-yhteys — muodosta ja ylläpidä yhteyksiä pariliitettyihin radioihin | . Myönnä molemmat käyttöoikeudet pyydettäessä. Ilman Bluetoothia sinun on käytettävä sen sijaan USB- tai TCP-yhteyksiä. Sijaintikäyttöoikeus . ⚠️ Tarvitaanko Bluetoothiin sijaintia? Android 11:ssä ja sitä vanhemmissa versioissa kyllä. Niissä Bluetooth-laitteiden haku käsitellään sijaintiominaisuutena, joten sovellus pyytää Lähistön laitteet -käyttöoikeuden sijaan sijaintikäyttöoikeutta, ja myös Sijaintipalvelut on oltava käytössä, jotta haku toimii. Näissä versioissa Bluetooth-näytössä näkyy kaksi sijaan vain yksi sijaintikäyttöoikeuden vaihe, koska kyseessä on yksi järjestelmän käyttöoikeus. Sen pyytäminen kahdesti voisi johtaa siihen, että Android lakkaa näyttämästä käyttöoikeusikkunaa kokonaan (toisen hylkäyksen jälkeen Android 11:ssä tai “Älä kysy uudelleen” -valinnan jälkeen Android 10:ssä ja vanhemmissa versioissa). Android 12:ssa ja uudemmissa versioissa nämä ovat erillisiä: “Lähistön laitteet” on määritelty asetuksella neverForLocation, eikä sijaintikäyttöoikeuden hylkääminen estä radion löytämistä tai siihen yhdistämistä. Meshtastic käyttää sijaintiasi myös seuraaviin tarkoituksiin: . | Sijaintisi näyttäminen mesh-kartalla | Etäisyyksien laskeminen muihin radioihin | GPS-koordinaattiesi jakaminen muiden verkon jäsenten kanssa (jos käytössä) | . Myönnä “Sovelluksen käytön aikana” tai “Aina” oman mieltymyksesi mukaan: . | Sovelluksen käytön aikana — sijainti päivittyy vain silloin, kun sovellus on avoinna | Aina — mahdollistaa sijainnin päivittämisen taustalla jatkuvaa verkon läsnäoloa varten | . Sijaintikäyttöoikeuden hylkääminen ei estä sovelluksen muuta toimintaa. Android 12:ssa ja uudemmissa versioissa Bluetooth toimii edelleen, ja vain kartta, sijainnin näyttäminen ja sijainnin jakaminen poistuvat käytöstä. Android 11:ssä ja sitä vanhemmissa versioissa myös Bluetooth-laitteiden haku lakkaa toimimasta, koska Android edellyttää siihen sijaintikäyttöoikeutta. Ilmoituskäyttöoikeus . Ilmoitukset kertovat sinulle: . | Saapuvista viesteistä kanavilta ja yksityisviesteistä | Uusista mesh-verkkoon liittyvistä radioista | Etäradion akun vähäisestä virrasta | . 💡 Vinkki: Voit myöhemmin säätää ilmoitusasetuksia Androidin järjestelmäasetuksissa. Sovellus luo jokaiselle ilmoitusluokalle oman ilmoituskanavan (sekä muutamia sisäisiä kanavia, kuten taustapalvelulle), joten voit ottaa ne käyttöön tai mykistää ne yksitellen. Kriittisten hälytysten käyttöoikeus . Tuetuilla laitteilla sovellus voi pyytää käyttöoikeutta kriittisiin hälytyksiin: . | Nämä ovat korkean prioriteetin ilmoituksia, jotka voivat ohittaa Älä häiritse -tilan | Hyödyllinen hätätilanteiden verkkohälytyksille tai kiireellisille viesteille | Voit ohittaa tämän vaiheen, jos et tarvitse ilmoituksia, jotka ohittavat Älä häiritse -tilan | Voit määrittää tai peruuttaa tämän myöhemmin Androidin ilmoitusasetuksissa | . Käyttöoikeuksien tarkistaminen myöhemmin . Asetukset → Käyttöoikeudet näyttää kaikkien käyttöaikaisten käyttöoikeuksien tilan. Kun mikään käyttöoikeus ei vaadi huomiotasi, siinä lukee Kaikki sallittu. Jos jokin käyttöoikeus vaatii huomiota, siinä näytetään niiden määrä, ja näkymä avautuu automaattisesti. Napauta riviä nähdäksesi koko luettelon milloin tahansa: . | Tila | Mitä rivin napauttaminen tekee | . | Sallittu | Avaa järjestelmän sivun, jossa voit tarkistaa tai peruuttaa käyttöoikeuden | . | Ei kysytty vielä | Pyytää sitä | . | Estetty - napauta salliaksesi | Selittää, mihin käyttöoikeutta tarvitaan, ja pyytää sitä uudelleen, jos hyväksyt | . | Estetty - napauta avataksesi järjestelmäasetukset | Android ei enää näytä käyttöoikeusikkunaa, joten tämä avaa sivun, jossa voit ottaa käyttöoikeuden uudelleen käyttöön | . | Ei tarvita tässä Android-versiossa | Ei mitään – tätä käyttöoikeutta ei ole laitteessasi | . Tämä koskee erityisesti ilmoituksia. Aiemmin sovellus pyysi tätä käyttöoikeutta vain yhdessä paikassa – käyttöönottovaiheessa – joten sen hylkääminen esti viesti-, uusi radio- ja akun alhaisen varaustason ilmoitukset, eikä sovellus voinut pyytää käyttöoikeutta uudelleen. Kun olet hylännyt käyttöoikeuspyynnön lopullisesti (Android 11:ssä ja uudemmissa versioissa toisen hylkäyksen jälkeen), Android ei enää näytä käyttöoikeusikkunaa. Tällöin tämä rivi muuttuu tilaan Estetty ja avaa sen sijaan järjestelmän asetussivun. ", "url": "/Meshtastic-Android/main/fi-rFI/user/onboarding.html#k%C3%A4ytt%C3%B6oikeudet", "relUrl": "/fi-rFI/user/onboarding.html#käyttöoikeudet" },"4194": { "doc": "Aloittaminen", "title": "Määrityksen jälkeen", - "content": "Kun käyttöoikeudet on myönnetty, sovellus siirtyy pääkäyttöliittymään. Ensimmäinen toimenpiteesi pitäisi olla yhteyden muodostaminen Meshtastic-radioon — katso Yhteydet yksityiskohtaisia ohjeita varten. 💡 Vinkki: Jos ohitit käyttöoikeuksia määrityksen aikana, voit myöntää ne myöhemmin kohdassa Androidin asetukset → Sovellukset → Meshtastic → Käyttöoikeudet. Sovellus pyytää sinulta uudelleen käyttöoikeutta, jos puuttuva käyttöoikeus estää käyttämästä ominaisuutta, jota yrität käyttää. ", + "content": "Kun käyttöoikeudet on myönnetty, sovellus siirtyy pääkäyttöliittymään. Ensimmäinen toimenpiteesi pitäisi olla yhteyden muodostaminen Meshtastic-radioon — katso Yhteydet yksityiskohtaisia ohjeita varten. 💡 Vinkki: Jos ohitit käyttöoikeuksia käyttöönottovaiheessa, avaa sovelluksessa Asetukset → Käyttöoikeudet. Kaikki käyttöaikaiset käyttöoikeudet näkyvät siellä nykyisessä tilassaan sekä linkkinä niiden hallintaan, mukaan lukien ilmoitukset, joita järjestelmä ei pyydä toista kertaa automaattisesti. Sovelluksen toiminnot pyytävät käyttöoikeuksia myös tarpeen mukaan. Kun Yhteydet-näytössä napautat Hae ilman Bluetooth-käyttöoikeutta, sovellus kertoo, mihin käyttöoikeutta tarvitaan, ja tarjoaa mahdollisuuden pyytää sitä. Kun Android ei enää näytä käyttöoikeusikkunaa, sama painike avaa sen sijaan järjestelmän asetussivun eikä jää toimettomaksi. ", "url": "/Meshtastic-Android/main/fi-rFI/user/onboarding.html#m%C3%A4%C3%A4rityksen-j%C3%A4lkeen", "relUrl": "/fi-rFI/user/onboarding.html#määrityksen-jälkeen" @@ -29380,21 +29380,21 @@ },"4197": { "doc": "Getting Started", "title": "First Launch", - "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", + "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", "url": "/Meshtastic-Android/main/gl-rES/user/onboarding.html#first-launch", "relUrl": "/gl-rES/user/onboarding.html#first-launch" },"4198": { "doc": "Getting Started", "title": "Permissions", - "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . If denied, Bluetooth scanning will not function and your node will not report a position. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . ", + "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . Reviewing permissions later . Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: . | State | What tapping the row does | . | Allowed | Opens the system page, so you can review or revoke it | . | Not asked yet | Requests it | . | Denied — tap to allow | Explains what the permission is for, then asks again if you agree | . | Blocked — tap to open system settings | Android will no longer show its dialog, so this opens the page where you can turn it back on | . | Not required on this version of Android | Nothing — the permission does not exist on your device | . This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead. ", "url": "/Meshtastic-Android/main/gl-rES/user/onboarding.html#permissions", "relUrl": "/gl-rES/user/onboarding.html#permissions" },"4199": { "doc": "Getting Started", "title": "After Setup", - "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use. ", + "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ", "url": "/Meshtastic-Android/main/gl-rES/user/onboarding.html#after-setup", "relUrl": "/gl-rES/user/onboarding.html#after-setup" @@ -29415,21 +29415,21 @@ },"4202": { "doc": "Getting Started", "title": "First Launch", - "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", + "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", "url": "/Meshtastic-Android/main/fr-rCA/user/onboarding.html#first-launch", "relUrl": "/fr-rCA/user/onboarding.html#first-launch" },"4203": { "doc": "Getting Started", "title": "Permissions", - "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . If denied, Bluetooth scanning will not function and your node will not report a position. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . ", + "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . Reviewing permissions later . Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: . | State | What tapping the row does | . | Allowed | Opens the system page, so you can review or revoke it | . | Not asked yet | Requests it | . | Denied — tap to allow | Explains what the permission is for, then asks again if you agree | . | Blocked — tap to open system settings | Android will no longer show its dialog, so this opens the page where you can turn it back on | . | Not required on this version of Android | Nothing — the permission does not exist on your device | . This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead. ", "url": "/Meshtastic-Android/main/fr-rCA/user/onboarding.html#permissions", "relUrl": "/fr-rCA/user/onboarding.html#permissions" },"4204": { "doc": "Getting Started", "title": "After Setup", - "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use. ", + "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ", "url": "/Meshtastic-Android/main/fr-rCA/user/onboarding.html#after-setup", "relUrl": "/fr-rCA/user/onboarding.html#after-setup" @@ -29450,21 +29450,21 @@ },"4207": { "doc": "Getting Started", "title": "First Launch", - "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", + "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", "url": "/Meshtastic-Android/main/uk-rUA/user/onboarding.html#first-launch", "relUrl": "/uk-rUA/user/onboarding.html#first-launch" },"4208": { "doc": "Getting Started", "title": "Permissions", - "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . If denied, Bluetooth scanning will not function and your node will not report a position. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . ", + "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . Reviewing permissions later . Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: . | State | What tapping the row does | . | Allowed | Opens the system page, so you can review or revoke it | . | Not asked yet | Requests it | . | Denied — tap to allow | Explains what the permission is for, then asks again if you agree | . | Blocked — tap to open system settings | Android will no longer show its dialog, so this opens the page where you can turn it back on | . | Not required on this version of Android | Nothing — the permission does not exist on your device | . This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead. ", "url": "/Meshtastic-Android/main/uk-rUA/user/onboarding.html#permissions", "relUrl": "/uk-rUA/user/onboarding.html#permissions" },"4209": { "doc": "Getting Started", "title": "After Setup", - "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use. ", + "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ", "url": "/Meshtastic-Android/main/uk-rUA/user/onboarding.html#after-setup", "relUrl": "/uk-rUA/user/onboarding.html#after-setup" @@ -29485,21 +29485,21 @@ },"4212": { "doc": "Erste Schritte", "title": "First Launch", - "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", + "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", "url": "/Meshtastic-Android/main/de-rDE/user/onboarding.html#first-launch", "relUrl": "/de-rDE/user/onboarding.html#first-launch" },"4213": { "doc": "Erste Schritte", "title": "Permissions", - "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . If denied, Bluetooth scanning will not function and your node will not report a position. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . ", + "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . Reviewing permissions later . Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: . | Status | What tapping the row does | . | Allowed | Opens the system page, so you can review or revoke it | . | Not asked yet | Requests it | . | Denied — tap to allow | Explains what the permission is for, then asks again if you agree | . | Blocked — tap to open system settings | Android will no longer show its dialog, so this opens the page where you can turn it back on | . | Not required on this version of Android | Nothing — the permission does not exist on your device | . This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead. ", "url": "/Meshtastic-Android/main/de-rDE/user/onboarding.html#permissions", "relUrl": "/de-rDE/user/onboarding.html#permissions" },"4214": { "doc": "Erste Schritte", "title": "After Setup", - "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use. ", + "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ", "url": "/Meshtastic-Android/main/de-rDE/user/onboarding.html#after-setup", "relUrl": "/de-rDE/user/onboarding.html#after-setup" @@ -29520,21 +29520,21 @@ },"4217": { "doc": "Getting Started", "title": "First Launch", - "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", + "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", "url": "/Meshtastic-Android/main/hr-rHR/user/onboarding.html#first-launch", "relUrl": "/hr-rHR/user/onboarding.html#first-launch" },"4218": { "doc": "Getting Started", "title": "Permissions", - "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . If denied, Bluetooth scanning will not function and your node will not report a position. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . ", + "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . Reviewing permissions later . Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: . | State | What tapping the row does | . | Allowed | Opens the system page, so you can review or revoke it | . | Not asked yet | Requests it | . | Denied — tap to allow | Explains what the permission is for, then asks again if you agree | . | Blocked — tap to open system settings | Android will no longer show its dialog, so this opens the page where you can turn it back on | . | Not required on this version of Android | Nothing — the permission does not exist on your device | . This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead. ", "url": "/Meshtastic-Android/main/hr-rHR/user/onboarding.html#permissions", "relUrl": "/hr-rHR/user/onboarding.html#permissions" },"4219": { "doc": "Getting Started", "title": "After Setup", - "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use. ", + "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ", "url": "/Meshtastic-Android/main/hr-rHR/user/onboarding.html#after-setup", "relUrl": "/hr-rHR/user/onboarding.html#after-setup" @@ -29555,21 +29555,21 @@ },"4222": { "doc": "Getting Started", "title": "First Launch", - "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", + "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", "url": "/Meshtastic-Android/main/lt-rLT/user/onboarding.html#first-launch", "relUrl": "/lt-rLT/user/onboarding.html#first-launch" },"4223": { "doc": "Getting Started", "title": "Permissions", - "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . If denied, Bluetooth scanning will not function and your node will not report a position. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . ", + "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . Reviewing permissions later . Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: . | State | What tapping the row does | . | Allowed | Opens the system page, so you can review or revoke it | . | Not asked yet | Requests it | . | Denied — tap to allow | Explains what the permission is for, then asks again if you agree | . | Blocked — tap to open system settings | Android will no longer show its dialog, so this opens the page where you can turn it back on | . | Not required on this version of Android | Nothing — the permission does not exist on your device | . This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead. ", "url": "/Meshtastic-Android/main/lt-rLT/user/onboarding.html#permissions", "relUrl": "/lt-rLT/user/onboarding.html#permissions" },"4224": { "doc": "Getting Started", "title": "After Setup", - "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use. ", + "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ", "url": "/Meshtastic-Android/main/lt-rLT/user/onboarding.html#after-setup", "relUrl": "/lt-rLT/user/onboarding.html#after-setup" @@ -29625,21 +29625,21 @@ },"4232": { "doc": "Getting Started", "title": "First Launch", - "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", + "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", "url": "/Meshtastic-Android/main/hu-rHU/user/onboarding.html#first-launch", "relUrl": "/hu-rHU/user/onboarding.html#first-launch" },"4233": { "doc": "Getting Started", "title": "Permissions", - "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . If denied, Bluetooth scanning will not function and your node will not report a position. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . ", + "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . Reviewing permissions later . Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: . | State | What tapping the row does | . | Allowed | Opens the system page, so you can review or revoke it | . | Not asked yet | Requests it | . | Denied — tap to allow | Explains what the permission is for, then asks again if you agree | . | Blocked — tap to open system settings | Android will no longer show its dialog, so this opens the page where you can turn it back on | . | Not required on this version of Android | Nothing — the permission does not exist on your device | . This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead. ", "url": "/Meshtastic-Android/main/hu-rHU/user/onboarding.html#permissions", "relUrl": "/hu-rHU/user/onboarding.html#permissions" },"4234": { "doc": "Getting Started", "title": "After Setup", - "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use. ", + "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ", "url": "/Meshtastic-Android/main/hu-rHU/user/onboarding.html#after-setup", "relUrl": "/hu-rHU/user/onboarding.html#after-setup" @@ -29660,21 +29660,21 @@ },"4237": { "doc": "Първи стъпки", "title": "First Launch", - "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", + "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", "url": "/Meshtastic-Android/main/bg-rBG/user/onboarding.html#first-launch", "relUrl": "/bg-rBG/user/onboarding.html#first-launch" },"4238": { "doc": "Първи стъпки", "title": "Permissions", - "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . If denied, Bluetooth scanning will not function and your node will not report a position. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . ", + "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . Reviewing permissions later . Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: . | Състояние | What tapping the row does | . | Allowed | Opens the system page, so you can review or revoke it | . | Not asked yet | Requests it | . | Denied — tap to allow | Explains what the permission is for, then asks again if you agree | . | Blocked — tap to open system settings | Android will no longer show its dialog, so this opens the page where you can turn it back on | . | Not required on this version of Android | Nothing — the permission does not exist on your device | . This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead. ", "url": "/Meshtastic-Android/main/bg-rBG/user/onboarding.html#permissions", "relUrl": "/bg-rBG/user/onboarding.html#permissions" },"4239": { "doc": "Първи стъпки", "title": "After Setup", - "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use. ", + "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ", "url": "/Meshtastic-Android/main/bg-rBG/user/onboarding.html#after-setup", "relUrl": "/bg-rBG/user/onboarding.html#after-setup" @@ -29695,21 +29695,21 @@ },"4242": { "doc": "Getting Started", "title": "First Launch", - "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", + "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", "url": "/Meshtastic-Android/main/sl-rSI/user/onboarding.html#first-launch", "relUrl": "/sl-rSI/user/onboarding.html#first-launch" },"4243": { "doc": "Getting Started", "title": "Permissions", - "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . If denied, Bluetooth scanning will not function and your node will not report a position. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . ", + "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . Reviewing permissions later . Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: . | State | What tapping the row does | . | Allowed | Opens the system page, so you can review or revoke it | . | Not asked yet | Requests it | . | Denied — tap to allow | Explains what the permission is for, then asks again if you agree | . | Blocked — tap to open system settings | Android will no longer show its dialog, so this opens the page where you can turn it back on | . | Not required on this version of Android | Nothing — the permission does not exist on your device | . This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead. ", "url": "/Meshtastic-Android/main/sl-rSI/user/onboarding.html#permissions", "relUrl": "/sl-rSI/user/onboarding.html#permissions" },"4244": { "doc": "Getting Started", "title": "After Setup", - "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use. ", + "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ", "url": "/Meshtastic-Android/main/sl-rSI/user/onboarding.html#after-setup", "relUrl": "/sl-rSI/user/onboarding.html#after-setup" @@ -29730,21 +29730,21 @@ },"4247": { "doc": "Getting Started", "title": "First Launch", - "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", + "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", "url": "/Meshtastic-Android/main/pt-rPT/user/onboarding.html#first-launch", "relUrl": "/pt-rPT/user/onboarding.html#first-launch" },"4248": { "doc": "Getting Started", "title": "Permissions", - "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . If denied, Bluetooth scanning will not function and your node will not report a position. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . ", + "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . Reviewing permissions later . Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: . | State | What tapping the row does | . | Allowed | Opens the system page, so you can review or revoke it | . | Not asked yet | Requests it | . | Denied — tap to allow | Explains what the permission is for, then asks again if you agree | . | Blocked — tap to open system settings | Android will no longer show its dialog, so this opens the page where you can turn it back on | . | Not required on this version of Android | Nothing — the permission does not exist on your device | . This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead. ", "url": "/Meshtastic-Android/main/pt-rPT/user/onboarding.html#permissions", "relUrl": "/pt-rPT/user/onboarding.html#permissions" },"4249": { "doc": "Getting Started", "title": "After Setup", - "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use. ", + "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ", "url": "/Meshtastic-Android/main/pt-rPT/user/onboarding.html#after-setup", "relUrl": "/pt-rPT/user/onboarding.html#after-setup" @@ -29765,21 +29765,21 @@ },"4252": { "doc": "Начало работы", "title": "First Launch", - "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", + "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", "url": "/Meshtastic-Android/main/be-rBY/user/onboarding.html#first-launch", "relUrl": "/be-rBY/user/onboarding.html#first-launch" },"4253": { "doc": "Начало работы", "title": "Permissions", - "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . If denied, Bluetooth scanning will not function and your node will not report a position. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . ", + "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . Reviewing permissions later . Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: . | State | What tapping the row does | . | Allowed | Opens the system page, so you can review or revoke it | . | Not asked yet | Requests it | . | Denied — tap to allow | Explains what the permission is for, then asks again if you agree | . | Blocked — tap to open system settings | Android will no longer show its dialog, so this opens the page where you can turn it back on | . | Not required on this version of Android | Nothing — the permission does not exist on your device | . This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead. ", "url": "/Meshtastic-Android/main/be-rBY/user/onboarding.html#permissions", "relUrl": "/be-rBY/user/onboarding.html#permissions" },"4254": { "doc": "Начало работы", "title": "After Setup", - "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use. ", + "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ", "url": "/Meshtastic-Android/main/be-rBY/user/onboarding.html#after-setup", "relUrl": "/be-rBY/user/onboarding.html#after-setup" @@ -29800,21 +29800,21 @@ },"4257": { "doc": "Getting Started", "title": "First Launch", - "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", + "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", "url": "/Meshtastic-Android/main/pt-rBR/user/onboarding.html#first-launch", "relUrl": "/pt-rBR/user/onboarding.html#first-launch" },"4258": { "doc": "Getting Started", "title": "Permissions", - "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . If denied, Bluetooth scanning will not function and your node will not report a position. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . ", + "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . Reviewing permissions later . Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: . | State | What tapping the row does | . | Allowed | Opens the system page, so you can review or revoke it | . | Not asked yet | Requests it | . | Denied — tap to allow | Explains what the permission is for, then asks again if you agree | . | Blocked — tap to open system settings | Android will no longer show its dialog, so this opens the page where you can turn it back on | . | Not required on this version of Android | Nothing — the permission does not exist on your device | . This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead. ", "url": "/Meshtastic-Android/main/pt-rBR/user/onboarding.html#permissions", "relUrl": "/pt-rBR/user/onboarding.html#permissions" },"4259": { "doc": "Getting Started", "title": "After Setup", - "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use. ", + "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ", "url": "/Meshtastic-Android/main/pt-rBR/user/onboarding.html#after-setup", "relUrl": "/pt-rBR/user/onboarding.html#after-setup" @@ -29835,21 +29835,21 @@ },"4262": { "doc": "Getting Started", "title": "First Launch", - "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", + "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", "url": "/Meshtastic-Android/main/el-rGR/user/onboarding.html#first-launch", "relUrl": "/el-rGR/user/onboarding.html#first-launch" },"4263": { "doc": "Getting Started", "title": "Permissions", - "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . If denied, Bluetooth scanning will not function and your node will not report a position. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . ", + "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . Reviewing permissions later . Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: . | State | What tapping the row does | . | Allowed | Opens the system page, so you can review or revoke it | . | Not asked yet | Requests it | . | Denied — tap to allow | Explains what the permission is for, then asks again if you agree | . | Blocked — tap to open system settings | Android will no longer show its dialog, so this opens the page where you can turn it back on | . | Not required on this version of Android | Nothing — the permission does not exist on your device | . This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead. ", "url": "/Meshtastic-Android/main/el-rGR/user/onboarding.html#permissions", "relUrl": "/el-rGR/user/onboarding.html#permissions" },"4264": { "doc": "Getting Started", "title": "After Setup", - "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use. ", + "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ", "url": "/Meshtastic-Android/main/el-rGR/user/onboarding.html#after-setup", "relUrl": "/el-rGR/user/onboarding.html#after-setup" @@ -29870,21 +29870,21 @@ },"4267": { "doc": "Primeros Pasos", "title": "First Launch", - "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", + "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", "url": "/Meshtastic-Android/main/es-rES/user/onboarding.html#first-launch", "relUrl": "/es-rES/user/onboarding.html#first-launch" },"4268": { "doc": "Primeros Pasos", "title": "Permissions", - "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . If denied, Bluetooth scanning will not function and your node will not report a position. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . ", + "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . Reviewing permissions later . Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: . | State | What tapping the row does | . | Allowed | Opens the system page, so you can review or revoke it | . | Not asked yet | Requests it | . | Denied — tap to allow | Explains what the permission is for, then asks again if you agree | . | Blocked — tap to open system settings | Android will no longer show its dialog, so this opens the page where you can turn it back on | . | Not required on this version of Android | Nothing — the permission does not exist on your device | . This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead. ", "url": "/Meshtastic-Android/main/es-rES/user/onboarding.html#permissions", "relUrl": "/es-rES/user/onboarding.html#permissions" },"4269": { "doc": "Primeros Pasos", "title": "After Setup", - "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use. ", + "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ", "url": "/Meshtastic-Android/main/es-rES/user/onboarding.html#after-setup", "relUrl": "/es-rES/user/onboarding.html#after-setup" @@ -29905,21 +29905,21 @@ },"4272": { "doc": "Getting Started", "title": "First Launch", - "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", + "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", "url": "/Meshtastic-Android/main/tr-rTR/user/onboarding.html#first-launch", "relUrl": "/tr-rTR/user/onboarding.html#first-launch" },"4273": { "doc": "Getting Started", "title": "Permissions", - "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . If denied, Bluetooth scanning will not function and your node will not report a position. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . ", + "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . Reviewing permissions later . Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: . | State | What tapping the row does | . | Allowed | Opens the system page, so you can review or revoke it | . | Not asked yet | Requests it | . | Denied — tap to allow | Explains what the permission is for, then asks again if you agree | . | Blocked — tap to open system settings | Android will no longer show its dialog, so this opens the page where you can turn it back on | . | Not required on this version of Android | Nothing — the permission does not exist on your device | . This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead. ", "url": "/Meshtastic-Android/main/tr-rTR/user/onboarding.html#permissions", "relUrl": "/tr-rTR/user/onboarding.html#permissions" },"4274": { "doc": "Getting Started", "title": "After Setup", - "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use. ", + "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ", "url": "/Meshtastic-Android/main/tr-rTR/user/onboarding.html#after-setup", "relUrl": "/tr-rTR/user/onboarding.html#after-setup" @@ -29940,21 +29940,21 @@ },"4277": { "doc": "Getting Started", "title": "First Launch", - "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", + "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", "url": "/Meshtastic-Android/main/no-rNO/user/onboarding.html#first-launch", "relUrl": "/no-rNO/user/onboarding.html#first-launch" },"4278": { "doc": "Getting Started", "title": "Permissions", - "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . If denied, Bluetooth scanning will not function and your node will not report a position. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . ", + "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . Reviewing permissions later . Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: . | State | What tapping the row does | . | Allowed | Opens the system page, so you can review or revoke it | . | Not asked yet | Requests it | . | Denied — tap to allow | Explains what the permission is for, then asks again if you agree | . | Blocked — tap to open system settings | Android will no longer show its dialog, so this opens the page where you can turn it back on | . | Not required on this version of Android | Nothing — the permission does not exist on your device | . This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead. ", "url": "/Meshtastic-Android/main/no-rNO/user/onboarding.html#permissions", "relUrl": "/no-rNO/user/onboarding.html#permissions" },"4279": { "doc": "Getting Started", "title": "After Setup", - "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use. ", + "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ", "url": "/Meshtastic-Android/main/no-rNO/user/onboarding.html#after-setup", "relUrl": "/no-rNO/user/onboarding.html#after-setup" @@ -29975,21 +29975,21 @@ },"4282": { "doc": "Начало работы", "title": "Первый запуск", - "content": "Когда ты запускаешь приложение впервые, то будет предложено пройти через начальный процесс, который поможет настроить основные разрешения и параметры. Каждый шаг нужно выполнить по порядку, или же можешь пропустить его и настроить разрешения позже в настройках Android. Экран приветствия . Экран приветствия представляет Meshtastic и его основные возможности: . | Автономная mesh-связь | Не требуется мобильная связь или интернет | Сквозное шифрование сообщений | . Нажми Начать для перехода к настройке. ", + "content": "Когда ты запускаешь приложение впервые, то будет предложено пройти через начальный процесс, который поможет настроить основные разрешения и параметры. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app. Экран приветствия . Экран приветствия представляет Meshtastic и его основные возможности: . | Автономная mesh-связь | Не требуется мобильная связь или интернет | Сквозное шифрование сообщений | . Нажми Начать для перехода к настройке. ", "url": "/Meshtastic-Android/main/ru-rRU/user/onboarding.html#%D0%BF%D0%B5%D1%80%D0%B2%D1%8B%D0%B9-%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA", "relUrl": "/ru-rRU/user/onboarding.html#первый-запуск" },"4283": { "doc": "Начало работы", "title": "Разрешения", - "content": "Приложение запрашивает несколько разрешений во время настройки. Каждое из них служит определенной цели, и некоторые необходимы для основной функциональности. Разрешения Bluetooth . Bluetooth является основным методом соединения между телефоном и радиостанцией Meshtastic: . | Сканирование Bluetooth — обнаружение ближайших радиостанций Meshtastic | Подключение по Bluetooth — установка и поддержание соединения с сопряжёнными радиоустройствами | . Предоставь оба разрешения при запросе. Без Bluetooth тебе придется использовать USB или TCP соединения. Разрешение на доступ к местоположению . ⚠️ Почему для Bluetooth требуется местоположение? Android требует разрешение на определение местоположения для обнаружения устройств Bluetooth Low Energy поблизости. Это требование системы Android, а не специфический выбор Meshtastic. Meshtastic также использует местоположение для: . | Показ вашего положения на карте | Вычисление расстояний до других нод | Обмен GPS-координатами с другими участниками сети (если включено) | . Предоставь доступ “При использовании приложения” или “Всегда” в зависимости от своих предпочтений: . | При использовании приложения — обновление местоположения происходит только когда приложение открыто | Всегда — включает обновления позиции в фоновом режиме для активного присутствия в сети | . Если доступ будет запрещен, сканирование Bluetooth не будет работать, и нода не будет сообщать о положении. Разрешение на уведомления . Уведомления оповещают тебя о: . | Входящие сообщения из каналов и личных сообщений | Новые ноды, присоединившиеся к сети | Низкий заряд на удаленной ноде | . 💡 Совет: Ты можешь тонко настроить уведомления позже в настройках системы — приложение создает отдельный канал уведомлений по категориям (плюс несколько внутренних, как фоновая служба), поэтому ты можешь включить или заглушить их по отдельности. Разрешение на критические уведомления . На поддерживаемых устройствах приложение может запрашивать разрешение на критические уведомления: . | Это уведомления высокого приоритета, которые могут прерывать режим “Не беспокоить” | Полезно для экстренных уведомлений в mesh-сети или срочных сообщений | Вы можете пропустить этот шаг, если не нужны уведомления о прорывах | Настроить или отменить можно позже в настройках уведомлений Android | . ", + "content": "Приложение запрашивает несколько разрешений во время настройки. Каждое из них служит определенной цели, и некоторые необходимы для основной функциональности. Разрешения Bluetooth . Bluetooth является основным методом соединения между телефоном и радиостанцией Meshtastic: . | Сканирование Bluetooth — обнаружение ближайших радиостанций Meshtastic | Подключение по Bluetooth — установка и поддержание соединения с сопряжёнными радиоустройствами | . Предоставь оба разрешения при запросе. Без Bluetooth тебе придется использовать USB или TCP соединения. Разрешение на доступ к местоположению . ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio. Meshtastic также использует местоположение для: . | Показ вашего положения на карте | Вычисление расстояний до других нод | Обмен GPS-координатами с другими участниками сети (если включено) | . Предоставь доступ “При использовании приложения” или “Всегда” в зависимости от своих предпочтений: . | При использовании приложения — обновление местоположения происходит только когда приложение открыто | Всегда — включает обновления позиции в фоновом режиме для активного присутствия в сети | . Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. Разрешение на уведомления . Уведомления оповещают тебя о: . | Входящие сообщения из каналов и личных сообщений | Новые ноды, присоединившиеся к сети | Низкий заряд на удаленной ноде | . 💡 Совет: Ты можешь тонко настроить уведомления позже в настройках системы — приложение создает отдельный канал уведомлений по категориям (плюс несколько внутренних, как фоновая служба), поэтому ты можешь включить или заглушить их по отдельности. Разрешение на критические уведомления . На поддерживаемых устройствах приложение может запрашивать разрешение на критические уведомления: . | Это уведомления высокого приоритета, которые могут прерывать режим “Не беспокоить” | Полезно для экстренных уведомлений в mesh-сети или срочных сообщений | Вы можете пропустить этот шаг, если не нужны уведомления о прорывах | Настроить или отменить можно позже в настройках уведомлений Android | . Reviewing permissions later . Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: . | Состояние | What tapping the row does | . | Allowed | Opens the system page, so you can review or revoke it | . | Not asked yet | Requests it | . | Denied — tap to allow | Explains what the permission is for, then asks again if you agree | . | Blocked — tap to open system settings | Android will no longer show its dialog, so this opens the page where you can turn it back on | . | Not required on this version of Android | Nothing — the permission does not exist on your device | . This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead. ", "url": "/Meshtastic-Android/main/ru-rRU/user/onboarding.html#%D1%80%D0%B0%D0%B7%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D1%8F", "relUrl": "/ru-rRU/user/onboarding.html#разрешения" },"4284": { "doc": "Начало работы", "title": "После настройки", - "content": "Как только разрешения предоставлены, приложение переходит к основному интерфейсу. Ваше первое действие должно заключаться в подключении к радиостанции Meshtastic — см. Подключения для подробных инструкций. 💡 Совет: Если ты пропустил какие-либо разрешения во время настройки, то можешь выдать их позже через Настройки Android → Приложения → Meshtastic → Разрешения. Приложение снова запросит у тебя разрешение, если отсутствующее разрешение блокирует функцию, которую ты пытаешься использовать. ", + "content": "Как только разрешения предоставлены, приложение переходит к основному интерфейсу. Ваше первое действие должно заключаться в подключении к радиостанции Meshtastic — см. Подключения для подробных инструкций. 💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ", "url": "/Meshtastic-Android/main/ru-rRU/user/onboarding.html#%D0%BF%D0%BE%D1%81%D0%BB%D0%B5-%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B8", "relUrl": "/ru-rRU/user/onboarding.html#после-настройки" @@ -30010,21 +30010,21 @@ },"4287": { "doc": "Getting Started", "title": "First Launch", - "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", + "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", "url": "/Meshtastic-Android/main/nl-rNL/user/onboarding.html#first-launch", "relUrl": "/nl-rNL/user/onboarding.html#first-launch" },"4288": { "doc": "Getting Started", "title": "Permissions", - "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . If denied, Bluetooth scanning will not function and your node will not report a position. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . ", + "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . Reviewing permissions later . Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: . | State | What tapping the row does | . | Allowed | Opens the system page, so you can review or revoke it | . | Not asked yet | Requests it | . | Denied — tap to allow | Explains what the permission is for, then asks again if you agree | . | Blocked — tap to open system settings | Android will no longer show its dialog, so this opens the page where you can turn it back on | . | Not required on this version of Android | Nothing — the permission does not exist on your device | . This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead. ", "url": "/Meshtastic-Android/main/nl-rNL/user/onboarding.html#permissions", "relUrl": "/nl-rNL/user/onboarding.html#permissions" },"4289": { "doc": "Getting Started", "title": "After Setup", - "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use. ", + "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ", "url": "/Meshtastic-Android/main/nl-rNL/user/onboarding.html#after-setup", "relUrl": "/nl-rNL/user/onboarding.html#after-setup" @@ -30045,21 +30045,21 @@ },"4292": { "doc": "Getting Started", "title": "First Launch", - "content": "Rakenduse esmakordsel avamisel juhendatakse sind sissejuhatavas voos, mis aitab konfigureerida olulisi õigusi ja sätteid. Iga sammu saab läbida järjekorras või võid selle vahele jätta ja õigused hiljem Androidi seadetes konfigureerida. Tervituskuva . Tervituskuval tutvustatakse Meshtasticut ja selle põhifunktsioone: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Puuduta Alusta seadistusvoo jätkamiseks. ", + "content": "Rakenduse esmakordsel avamisel juhendatakse sind sissejuhatavas voos, mis aitab konfigureerida olulisi õigusi ja sätteid. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app. Tervituskuva . Tervituskuval tutvustatakse Meshtasticut ja selle põhifunktsioone: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Puuduta Alusta seadistusvoo jätkamiseks. ", "url": "/Meshtastic-Android/main/et-rEE/user/onboarding.html#first-launch", "relUrl": "/et-rEE/user/onboarding.html#first-launch" },"4293": { "doc": "Getting Started", "title": "Permissions", - "content": "Rakendus küsib seadistamise ajal mitmeid lube. Igal neist on kindel eesmärk ja mõned on vajalikud põhifunktsioonide täitmiseks. Sinihamba load . Sinihammas on peamine ühendusmeetod sinu telefoni ja Meshtastic raadio vahel: . | Bluetoothi ​​skann – avasta lähedalasuvad Meshtastic raadiod | Sinihamba ühendus – loo ja halda seotud seadmete ühendusi | . Grant both permissions when prompted. Ilma sinihambata peate kasutama USB- või TCP-ühendusi. Asukoha luba . ⚠️ Miks on sinihamba ​​jaoks vaja asukohateavet? Android vajab lähedalasuvate sinihamba madala energia seadmete avastamiseks asukohale juurdepääsu luba. See on Androidi süsteeminõue, mitte Meshtastic põhine valik. Meshtastic kasutab sinu asukohta ka järgmiseks: . | Kuvatakse asukoht kärgvõrgu kaardil | Calculating distances to other nodes | GPS koordinaatide jagamine teiste kärgvõrgu liikmetega (kui lubatud) | . Grant “While using the app” or “Always” depending on your preference: . | Rakenduse kasutamise ajal – asukohta uuendatakse kui rakendus on avatud | Alati – lubab taustal asukoha värskendusi, et kärgvõrgu oleks alati sisse lülitatud | . Kui keelatud, siis sinihamba otsing ei toimi ja sõlm ei edasta asukohta. Märguannete load . Märguanded teavitavad teid järgmisest: . | Sissetulevad sõnumid kanalitelt ja otsesõnumid | New nodes joining the mesh | Kaugsõlmel on aku tühjenenud | . 💡 Vihje: Teavituste eelistusi saab hiljem Androidi süsteemiseadetes täpsustada – rakendus loob iga kategooria kohta eraldi teavituskanali (lisaks mõned sisemised, näiteks taustateenus), nii et saad need eraldi lubada või vaigistada. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | Need on kõrge prioriteediga märguanded, mis võivad režiimist „Ära sega” läbi murda | Kasulik hädaolukorra võrguhoiatuste või kiireloomuliste sõnumite jaoks | Võid selle sammu vahele jätta, kui te kõrge prioriteediga märguandeid ei vaja | Seadistada või tühistada hiljem Androidi teavitusseadetes | . ", + "content": "Rakendus küsib seadistamise ajal mitmeid lube. Igal neist on kindel eesmärk ja mõned on vajalikud põhifunktsioonide täitmiseks. Sinihamba load . Sinihammas on peamine ühendusmeetod sinu telefoni ja Meshtastic raadio vahel: . | Bluetoothi ​​skann – avasta lähedalasuvad Meshtastic raadiod | Sinihamba ühendus – loo ja halda seotud seadmete ühendusi | . Grant both permissions when prompted. Ilma sinihambata peate kasutama USB- või TCP-ühendusi. Asukoha luba . ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio. Meshtastic kasutab sinu asukohta ka järgmiseks: . | Kuvatakse asukoht kärgvõrgu kaardil | Calculating distances to other nodes | GPS koordinaatide jagamine teiste kärgvõrgu liikmetega (kui lubatud) | . Grant “While using the app” or “Always” depending on your preference: . | Rakenduse kasutamise ajal – asukohta uuendatakse kui rakendus on avatud | Alati – lubab taustal asukoha värskendusi, et kärgvõrgu oleks alati sisse lülitatud | . Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. Märguannete load . Märguanded teavitavad teid järgmisest: . | Sissetulevad sõnumid kanalitelt ja otsesõnumid | New nodes joining the mesh | Kaugsõlmel on aku tühjenenud | . 💡 Vihje: Teavituste eelistusi saab hiljem Androidi süsteemiseadetes täpsustada – rakendus loob iga kategooria kohta eraldi teavituskanali (lisaks mõned sisemised, näiteks taustateenus), nii et saad need eraldi lubada või vaigistada. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | Need on kõrge prioriteediga märguanded, mis võivad režiimist „Ära sega” läbi murda | Kasulik hädaolukorra võrguhoiatuste või kiireloomuliste sõnumite jaoks | Võid selle sammu vahele jätta, kui te kõrge prioriteediga märguandeid ei vaja | Seadistada või tühistada hiljem Androidi teavitusseadetes | . Reviewing permissions later . Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: . | Olek | What tapping the row does | . | Allowed | Opens the system page, so you can review or revoke it | . | Not asked yet | Requests it | . | Denied — tap to allow | Explains what the permission is for, then asks again if you agree | . | Blocked — tap to open system settings | Android will no longer show its dialog, so this opens the page where you can turn it back on | . | Not required on this version of Android | Nothing — the permission does not exist on your device | . This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead. ", "url": "/Meshtastic-Android/main/et-rEE/user/onboarding.html#permissions", "relUrl": "/et-rEE/user/onboarding.html#permissions" },"4294": { "doc": "Getting Started", "title": "Peale seadistamist", - "content": "Kui load on antud, läheb rakendus üle põhiliidesele. Esimene samm peaks olema ühenduse loomine Meshtastic raadioga – üksikasjalike juhiste saamiseks vaata [Ühendused] (connections). 💡 Vihje: Kui jätsid seadistamise ajal mõne õiguse andmata, saad selle hiljem anda jaotises Androidi seaded → Rakendused → Meshtastic → Load. The app will prompt you again if a missing permission blocks a feature you try to use. ", + "content": "Kui load on antud, läheb rakendus üle põhiliidesele. Esimene samm peaks olema ühenduse loomine Meshtastic raadioga – üksikasjalike juhiste saamiseks vaata [Ühendused] (connections). 💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ", "url": "/Meshtastic-Android/main/et-rEE/user/onboarding.html#peale-seadistamist", "relUrl": "/et-rEE/user/onboarding.html#peale-seadistamist" @@ -30080,21 +30080,21 @@ },"4297": { "doc": "Come iniziare", "title": "First Launch", - "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", + "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", "url": "/Meshtastic-Android/main/it-rIT/user/onboarding.html#first-launch", "relUrl": "/it-rIT/user/onboarding.html#first-launch" },"4298": { "doc": "Come iniziare", "title": "Permissions", - "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . If denied, Bluetooth scanning will not function and your node will not report a position. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . ", + "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . Reviewing permissions later . Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: . | State | What tapping the row does | . | Allowed | Opens the system page, so you can review or revoke it | . | Not asked yet | Requests it | . | Denied — tap to allow | Explains what the permission is for, then asks again if you agree | . | Blocked — tap to open system settings | Android will no longer show its dialog, so this opens the page where you can turn it back on | . | Not required on this version of Android | Nothing — the permission does not exist on your device | . This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead. ", "url": "/Meshtastic-Android/main/it-rIT/user/onboarding.html#permissions", "relUrl": "/it-rIT/user/onboarding.html#permissions" },"4299": { "doc": "Come iniziare", "title": "After Setup", - "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use. ", + "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ", "url": "/Meshtastic-Android/main/it-rIT/user/onboarding.html#after-setup", "relUrl": "/it-rIT/user/onboarding.html#after-setup" @@ -30115,21 +30115,21 @@ },"4302": { "doc": "Getting Started", "title": "First Launch", - "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", + "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", "url": "/Meshtastic-Android/main/ar-rSA/user/onboarding.html#first-launch", "relUrl": "/ar-rSA/user/onboarding.html#first-launch" },"4303": { "doc": "Getting Started", "title": "Permissions", - "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . If denied, Bluetooth scanning will not function and your node will not report a position. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . ", + "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . Reviewing permissions later . Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: . | State | What tapping the row does | . | Allowed | Opens the system page, so you can review or revoke it | . | Not asked yet | Requests it | . | Denied — tap to allow | Explains what the permission is for, then asks again if you agree | . | Blocked — tap to open system settings | Android will no longer show its dialog, so this opens the page where you can turn it back on | . | Not required on this version of Android | Nothing — the permission does not exist on your device | . This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead. ", "url": "/Meshtastic-Android/main/ar-rSA/user/onboarding.html#permissions", "relUrl": "/ar-rSA/user/onboarding.html#permissions" },"4304": { "doc": "Getting Started", "title": "After Setup", - "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use. ", + "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ", "url": "/Meshtastic-Android/main/ar-rSA/user/onboarding.html#after-setup", "relUrl": "/ar-rSA/user/onboarding.html#after-setup" @@ -30150,21 +30150,21 @@ },"4307": { "doc": "Getting Started", "title": "First Launch", - "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", + "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", "url": "/Meshtastic-Android/main/sk-rSK/user/onboarding.html#first-launch", "relUrl": "/sk-rSK/user/onboarding.html#first-launch" },"4308": { "doc": "Getting Started", "title": "Permissions", - "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . If denied, Bluetooth scanning will not function and your node will not report a position. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . ", + "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . Reviewing permissions later . Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: . | State | What tapping the row does | . | Allowed | Opens the system page, so you can review or revoke it | . | Not asked yet | Requests it | . | Denied — tap to allow | Explains what the permission is for, then asks again if you agree | . | Blocked — tap to open system settings | Android will no longer show its dialog, so this opens the page where you can turn it back on | . | Not required on this version of Android | Nothing — the permission does not exist on your device | . This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead. ", "url": "/Meshtastic-Android/main/sk-rSK/user/onboarding.html#permissions", "relUrl": "/sk-rSK/user/onboarding.html#permissions" },"4309": { "doc": "Getting Started", "title": "After Setup", - "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use. ", + "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ", "url": "/Meshtastic-Android/main/sk-rSK/user/onboarding.html#after-setup", "relUrl": "/sk-rSK/user/onboarding.html#after-setup" @@ -30185,21 +30185,21 @@ },"4312": { "doc": "Getting Started", "title": "First Launch", - "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", + "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", "url": "/Meshtastic-Android/main/pl-rPL/user/onboarding.html#first-launch", "relUrl": "/pl-rPL/user/onboarding.html#first-launch" },"4313": { "doc": "Getting Started", "title": "Permissions", - "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . If denied, Bluetooth scanning will not function and your node will not report a position. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . ", + "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . Reviewing permissions later . Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: . | State | What tapping the row does | . | Allowed | Opens the system page, so you can review or revoke it | . | Not asked yet | Requests it | . | Denied — tap to allow | Explains what the permission is for, then asks again if you agree | . | Blocked — tap to open system settings | Android will no longer show its dialog, so this opens the page where you can turn it back on | . | Not required on this version of Android | Nothing — the permission does not exist on your device | . This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead. ", "url": "/Meshtastic-Android/main/pl-rPL/user/onboarding.html#permissions", "relUrl": "/pl-rPL/user/onboarding.html#permissions" },"4314": { "doc": "Getting Started", "title": "After Setup", - "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use. ", + "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ", "url": "/Meshtastic-Android/main/pl-rPL/user/onboarding.html#after-setup", "relUrl": "/pl-rPL/user/onboarding.html#after-setup" @@ -30220,21 +30220,21 @@ },"4317": { "doc": "新手入門", "title": "First Launch", - "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", + "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", "url": "/Meshtastic-Android/main/zh-rTW/user/onboarding.html#first-launch", "relUrl": "/zh-rTW/user/onboarding.html#first-launch" },"4318": { "doc": "新手入門", "title": "Permissions", - "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . If denied, Bluetooth scanning will not function and your node will not report a position. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . ", + "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . Reviewing permissions later . Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: . | 狀態 | What tapping the row does | . | Allowed | Opens the system page, so you can review or revoke it | . | Not asked yet | Requests it | . | Denied — tap to allow | Explains what the permission is for, then asks again if you agree | . | Blocked — tap to open system settings | Android will no longer show its dialog, so this opens the page where you can turn it back on | . | Not required on this version of Android | Nothing — the permission does not exist on your device | . This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead. ", "url": "/Meshtastic-Android/main/zh-rTW/user/onboarding.html#permissions", "relUrl": "/zh-rTW/user/onboarding.html#permissions" },"4319": { "doc": "新手入門", "title": "After Setup", - "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use. ", + "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ", "url": "/Meshtastic-Android/main/zh-rTW/user/onboarding.html#after-setup", "relUrl": "/zh-rTW/user/onboarding.html#after-setup" @@ -30262,21 +30262,21 @@ },"4323": { "doc": "Getting Started", "title": "First Launch", - "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", + "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", "url": "/Meshtastic-Android/main/cs-rCZ/user/onboarding.html#first-launch", "relUrl": "/cs-rCZ/user/onboarding.html#first-launch" },"4324": { "doc": "Getting Started", "title": "Permissions", - "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . If denied, Bluetooth scanning will not function and your node will not report a position. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . ", + "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . Reviewing permissions later . Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: . | State | What tapping the row does | . | Allowed | Opens the system page, so you can review or revoke it | . | Not asked yet | Requests it | . | Denied — tap to allow | Explains what the permission is for, then asks again if you agree | . | Blocked — tap to open system settings | Android will no longer show its dialog, so this opens the page where you can turn it back on | . | Not required on this version of Android | Nothing — the permission does not exist on your device | . This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead. ", "url": "/Meshtastic-Android/main/cs-rCZ/user/onboarding.html#permissions", "relUrl": "/cs-rCZ/user/onboarding.html#permissions" },"4325": { "doc": "Getting Started", "title": "After Setup", - "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use. ", + "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ", "url": "/Meshtastic-Android/main/cs-rCZ/user/onboarding.html#after-setup", "relUrl": "/cs-rCZ/user/onboarding.html#after-setup" @@ -30297,21 +30297,21 @@ },"4328": { "doc": "Getting Started", "title": "First Launch", - "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", + "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", "url": "/Meshtastic-Android/main/fr-rFR/user/onboarding.html#first-launch", "relUrl": "/fr-rFR/user/onboarding.html#first-launch" },"4329": { "doc": "Getting Started", "title": "Permissions", - "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . If denied, Bluetooth scanning will not function and your node will not report a position. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . ", + "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . Reviewing permissions later . Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: . | State | What tapping the row does | . | Allowed | Opens the system page, so you can review or revoke it | . | Not asked yet | Requests it | . | Denied — tap to allow | Explains what the permission is for, then asks again if you agree | . | Blocked — tap to open system settings | Android will no longer show its dialog, so this opens the page where you can turn it back on | . | Not required on this version of Android | Nothing — the permission does not exist on your device | . This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead. ", "url": "/Meshtastic-Android/main/fr-rFR/user/onboarding.html#permissions", "relUrl": "/fr-rFR/user/onboarding.html#permissions" },"4330": { "doc": "Getting Started", "title": "After Setup", - "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use. ", + "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ", "url": "/Meshtastic-Android/main/fr-rFR/user/onboarding.html#after-setup", "relUrl": "/fr-rFR/user/onboarding.html#after-setup" @@ -30332,21 +30332,21 @@ },"4333": { "doc": "Getting Started", "title": "First Launch", - "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", + "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", "url": "/Meshtastic-Android/main/zh-rCN/user/onboarding.html#first-launch", "relUrl": "/zh-rCN/user/onboarding.html#first-launch" },"4334": { "doc": "Getting Started", "title": "Permissions", - "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . If denied, Bluetooth scanning will not function and your node will not report a position. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . ", + "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . Reviewing permissions later . Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: . | State | What tapping the row does | . | Allowed | Opens the system page, so you can review or revoke it | . | Not asked yet | Requests it | . | Denied — tap to allow | Explains what the permission is for, then asks again if you agree | . | Blocked — tap to open system settings | Android will no longer show its dialog, so this opens the page where you can turn it back on | . | Not required on this version of Android | Nothing — the permission does not exist on your device | . This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead. ", "url": "/Meshtastic-Android/main/zh-rCN/user/onboarding.html#permissions", "relUrl": "/zh-rCN/user/onboarding.html#permissions" },"4335": { "doc": "Getting Started", "title": "After Setup", - "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use. ", + "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ", "url": "/Meshtastic-Android/main/zh-rCN/user/onboarding.html#after-setup", "relUrl": "/zh-rCN/user/onboarding.html#after-setup" @@ -30367,21 +30367,21 @@ },"4338": { "doc": "Getting Started", "title": "First Launch", - "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", + "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", "url": "/Meshtastic-Android/main/srp/user/onboarding.html#first-launch", "relUrl": "/srp/user/onboarding.html#first-launch" },"4339": { "doc": "Getting Started", "title": "Permissions", - "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . If denied, Bluetooth scanning will not function and your node will not report a position. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . ", + "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . Reviewing permissions later . Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: . | State | What tapping the row does | . | Allowed | Opens the system page, so you can review or revoke it | . | Not asked yet | Requests it | . | Denied — tap to allow | Explains what the permission is for, then asks again if you agree | . | Blocked — tap to open system settings | Android will no longer show its dialog, so this opens the page where you can turn it back on | . | Not required on this version of Android | Nothing — the permission does not exist on your device | . This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead. ", "url": "/Meshtastic-Android/main/srp/user/onboarding.html#permissions", "relUrl": "/srp/user/onboarding.html#permissions" },"4340": { "doc": "Getting Started", "title": "After Setup", - "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use. ", + "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ", "url": "/Meshtastic-Android/main/srp/user/onboarding.html#after-setup", "relUrl": "/srp/user/onboarding.html#after-setup" @@ -30402,21 +30402,21 @@ },"4343": { "doc": "Getting Started", "title": "First Launch", - "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", + "content": "When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app. Welcome Screen . The welcome screen introduces Meshtastic and its core capabilities: . | Off-grid mesh communication | No cellular or internet required | End-to-end encrypted messaging | . Tap Get Started to proceed through the setup flow. ", "url": "/Meshtastic-Android/main/sq-rAL/user/onboarding.html#first-launch", "relUrl": "/sq-rAL/user/onboarding.html#first-launch" },"4344": { "doc": "Getting Started", "title": "Permissions", - "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . If denied, Bluetooth scanning will not function and your node will not report a position. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . ", + "content": "The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality. Bluetooth Permission . Bluetooth is the primary connection method between your phone and Meshtastic radio: . | Bluetooth scanning — discover nearby Meshtastic radios | Bluetooth connect — establish and maintain connections with paired radios | . Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead. Location Permission . ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: . | Showing your position on the mesh map | Calculating distances to other nodes | Sharing your GPS coordinates with other mesh members (if enabled) | . Grant “While using the app” or “Always” depending on your preference: . | While using the app — position updates only when the app is open | Always — enables background position updates for always-on mesh presence | . Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. Notifications Permission . Notifications alert you to: . | Incoming messages from channels and direct messages | New nodes joining the mesh | Low battery on a remote node | . 💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually. Critical Alerts Permission . On supported devices, the app may request permission for critical alerts: . | These are high-priority notifications that can break through Do Not Disturb mode | Useful for emergency mesh alerts or urgent messages | You can skip this step if you don’t need breakthrough notifications | Configure or revoke later in Android notification settings | . Reviewing permissions later . Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: . | State | What tapping the row does | . | Allowed | Opens the system page, so you can review or revoke it | . | Not asked yet | Requests it | . | Denied — tap to allow | Explains what the permission is for, then asks again if you agree | . | Blocked — tap to open system settings | Android will no longer show its dialog, so this opens the page where you can turn it back on | . | Not required on this version of Android | Nothing — the permission does not exist on your device | . This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead. ", "url": "/Meshtastic-Android/main/sq-rAL/user/onboarding.html#permissions", "relUrl": "/sq-rAL/user/onboarding.html#permissions" },"4345": { "doc": "Getting Started", "title": "After Setup", - "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use. ", + "content": "Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions. 💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ", "url": "/Meshtastic-Android/main/sq-rAL/user/onboarding.html#after-setup", "relUrl": "/sq-rAL/user/onboarding.html#after-setup" diff --git a/main/be-rBY/user/connections.html b/main/be-rBY/user/connections.html index d0daeb8297..ed69884686 100644 --- a/main/be-rBY/user/connections.html +++ b/main/be-rBY/user/connections.html @@ -1 +1 @@ - Connections | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
🌐 Беларуская
Meshtastic Docs ↗

🌐 Беларуская — Community translation View in English

Connections

Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

Bluetooth (BLE)

Bluetooth Low Energy is the default and most common connection method on Android.

Pairing a Device

  1. Ensure your Meshtastic radio is powered on and in pairing mode.
  2. Open the app and navigate to the Connect tab.
  3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
  4. Select your device from the list.
  5. Accept the Bluetooth pairing prompt if shown.

Scanning for Bluetooth devices, with a discovered radio in the list

Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

Transport selector

💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device.

Connection Status

Icon State Апісанне
🟢 Злучаны Active radio link established
🟡 Злучаемся Handshake in progress
🔴 Адлучана No active connection
Not configured No device selected

When connecting, a status indicator shows the current connection state:

Connecting status

If no devices are found, the app shows an empty state with instructions:

No devices found

Troubleshooting Bluetooth

  • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
  • Connection drops: Move closer to the radio; check for interference.
  • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

USB Serial

USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

Setup

  1. Connect your radio via USB cable to your device.
  2. The app will prompt for USB permission — tap Allow.
  3. The connection is established automatically.

⚠️ Note: USB connections require OTG support on Android devices.

TCP/IP (Network)

Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

Connecting over the Network

  1. Make sure the radio is on the same local network as your phone/desktop.
  2. On the Connect screen, select Network in the transport selector.
  3. Choose the radio one of two ways:
    • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
    • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
  4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

When to Use TCP

  • Radio is on the same local network
  • Testing with a simulated radio
  • Environments where Bluetooth has interference issues

Reconnection Behavior

The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

To disconnect, tap the disconnect button on the Connect screen:

Disconnect from radio

Desktop Connections

On Desktop (Linux/macOS/Windows), the app supports:

  • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
  • USB Serial — primary wired connection method
  • TCP/IP — for network-connected radios

See Desktop App for platform-specific details and keyboard shortcuts.



+ Connections | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
🌐 Беларуская
Meshtastic Docs ↗

🌐 Беларуская — Community translation View in English

Connections

Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

Bluetooth (BLE)

Bluetooth Low Energy is the default and most common connection method on Android.

Pairing a Device

  1. Ensure your Meshtastic radio is powered on and in pairing mode.
  2. Open the app and navigate to the Connect tab.
  3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
  4. Select your device from the list.
  5. Accept the Bluetooth pairing prompt if shown.

Scanning for Bluetooth devices, with a discovered radio in the list

Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

Transport selector

💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range.

The screen names anything on the app’s side that is blocking a scan, with the fix attached:

What you see What it means
A card asking for Nearby devices The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings.
Bluetooth is off The adapter is disabled — the card opens Bluetooth settings.
Bluetooth scanning also needs location services Android 11 and older only: the permission is held but the system location toggle is off.
No card, empty list Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere.

Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered.

Connection Status

Icon State Апісанне
🟢 Злучаны Active radio link established
🟡 Злучаемся Handshake in progress
🔴 Адлучана No active connection
Not configured No device selected

When connecting, a status indicator shows the current connection state:

Connecting status

If no devices are found, the app shows an empty state with instructions:

No devices found

Troubleshooting Bluetooth

  • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
  • Connection drops: Move closer to the radio; check for interference.
  • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

USB Serial

USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

Setup

  1. Connect your radio via USB cable to your device.
  2. The app will prompt for USB permission — tap Allow.
  3. The connection is established automatically.

⚠️ Note: USB connections require OTG support on Android devices.

TCP/IP (Network)

Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

Connecting over the Network

  1. Make sure the radio is on the same local network as your phone/desktop.
  2. On the Connect screen, select Network in the transport selector.
  3. Choose the radio one of two ways:
    • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
    • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
  4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

When to Use TCP

  • Radio is on the same local network
  • Testing with a simulated radio
  • Environments where Bluetooth has interference issues

Reconnection Behavior

The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

To disconnect, tap the disconnect button on the Connect screen:

Disconnect from radio

Desktop Connections

On Desktop (Linux/macOS/Windows), the app supports:

  • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
  • USB Serial — primary wired connection method
  • TCP/IP — for network-connected radios

See Desktop App for platform-specific details and keyboard shortcuts.



diff --git a/main/be-rBY/user/onboarding.html b/main/be-rBY/user/onboarding.html index 7409275d9a..4a2e0b6724 100644 --- a/main/be-rBY/user/onboarding.html +++ b/main/be-rBY/user/onboarding.html @@ -1 +1 @@ - Начало работы | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
🌐 Беларуская
Meshtastic Docs ↗

🌐 Беларуская — Community translation View in English

Начало работы

Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

First Launch

When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings.

Welcome Screen

The welcome screen introduces Meshtastic and its core capabilities:

  • Off-grid mesh communication
  • No cellular or internet required
  • End-to-end encrypted messaging

Tap Get Started to proceed through the setup flow.

Welcome screen

Permissions

The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

Bluetooth Permission

Bluetooth is the primary connection method between your phone and Meshtastic radio:

  • Bluetooth scanning — discover nearby Meshtastic radios
  • Bluetooth connect — establish and maintain connections with paired radios

Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

Location Permission

⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice.

Meshtastic also uses your location for:

  • Showing your position on the mesh map
  • Calculating distances to other nodes
  • Sharing your GPS coordinates with other mesh members (if enabled)

Grant “While using the app” or “Always” depending on your preference:

  • While using the app — position updates only when the app is open
  • Always — enables background position updates for always-on mesh presence

If denied, Bluetooth scanning will not function and your node will not report a position.

Notifications Permission

Notifications alert you to:

  • Incoming messages from channels and direct messages
  • New nodes joining the mesh
  • Low battery on a remote node

💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

Critical Alerts Permission

On supported devices, the app may request permission for critical alerts:

  • These are high-priority notifications that can break through Do Not Disturb mode
  • Useful for emergency mesh alerts or urgent messages
  • You can skip this step if you don’t need breakthrough notifications
  • Configure or revoke later in Android notification settings

After Setup

Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use.

What’s Next?

Once connected to a radio, explore:

New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



+ Начало работы | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
🌐 Беларуская
Meshtastic Docs ↗

🌐 Беларуская — Community translation View in English

Начало работы

Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

First Launch

When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app.

Welcome Screen

The welcome screen introduces Meshtastic and its core capabilities:

  • Off-grid mesh communication
  • No cellular or internet required
  • End-to-end encrypted messaging

Tap Get Started to proceed through the setup flow.

Welcome screen

Permissions

The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

Bluetooth Permission

Bluetooth is the primary connection method between your phone and Meshtastic radio:

  • Bluetooth scanning — discover nearby Meshtastic radios
  • Bluetooth connect — establish and maintain connections with paired radios

Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

Location Permission

⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio.

Meshtastic also uses your location for:

  • Showing your position on the mesh map
  • Calculating distances to other nodes
  • Sharing your GPS coordinates with other mesh members (if enabled)

Grant “While using the app” or “Always” depending on your preference:

  • While using the app — position updates only when the app is open
  • Always — enables background position updates for always-on mesh presence

Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind.

Notifications Permission

Notifications alert you to:

  • Incoming messages from channels and direct messages
  • New nodes joining the mesh
  • Low battery on a remote node

💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

Critical Alerts Permission

On supported devices, the app may request permission for critical alerts:

  • These are high-priority notifications that can break through Do Not Disturb mode
  • Useful for emergency mesh alerts or urgent messages
  • You can skip this step if you don’t need breakthrough notifications
  • Configure or revoke later in Android notification settings

Reviewing permissions later

Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time:

State What tapping the row does
Allowed Opens the system page, so you can review or revoke it
Not asked yet Requests it
Denied — tap to allow Explains what the permission is for, then asks again if you agree
Blocked — tap to open system settings Android will no longer show its dialog, so this opens the page where you can turn it back on
Not required on this version of Android Nothing — the permission does not exist on your device

This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead.

After Setup

Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own.

Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing.

What’s Next?

Once connected to a radio, explore:

New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



diff --git a/main/bg-rBG/user/connections.html b/main/bg-rBG/user/connections.html index b9e581f6e8..b172a0a79d 100644 --- a/main/bg-rBG/user/connections.html +++ b/main/bg-rBG/user/connections.html @@ -1 +1 @@ - Връзки | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
🌐 Български
Meshtastic Docs ↗

🌐 Български — Community translation View in English

Връзки

Meshtastic поддържа множество транспортни методи за за комуникация между вашия телефон/настолен компютър и радио възел.

Bluetooth (BLE)

Bluetooth Low Energy е методът за свързване по подразбиране и най-често срещаният в Android.

Сдвояване на устройство

  1. Уверете се, че вашето радио Meshtastic е включено и е в режим на сдвояване.
  2. Отворете приложението и отидете в раздела Свързване.
  3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
  4. Изберете вашето устройство от списъка.
  5. Приемете подканата за Bluetooth сдвояване, ако се покаже.

Scanning for Bluetooth devices, with a discovered radio in the list

Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

Transport selector

💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device.

Състояние на връзката

Икона Състояние Описание
🟢 Свързано Установена активна радиовръзка
🟡 Свързване Ръкостискането е в ход
🔴 Прекъсната връзка Няма активна връзка
Не е конфигурирано Няма избрано устройство

При свързване, индикатора за състояние показва текущото състояние на връзката:

Connecting status

If no devices are found, the app shows an empty state with instructions:

No devices found

Troubleshooting Bluetooth

  • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
  • Connection drops: Move closer to the radio; check for interference.
  • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

USB Serial

USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

Настройка

  1. Connect your radio via USB cable to your device.
  2. The app will prompt for USB permission — tap Allow.
  3. The connection is established automatically.

⚠️ Note: USB connections require OTG support on Android devices.

TCP/IP (Network)

Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

Свързване през мрежата

  1. Make sure the radio is on the same local network as your phone/desktop.
  2. On the Connect screen, select Network in the transport selector.
  3. Choose the radio one of two ways:
    • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
    • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
  4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

When to Use TCP

  • Radio is on the same local network
  • Testing with a simulated radio
  • Environments where Bluetooth has interference issues

Reconnection Behavior

The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

To disconnect, tap the disconnect button on the Connect screen:

Disconnect from radio

Desktop Connections

On Desktop (Linux/macOS/Windows), the app supports:

  • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
  • USB Serial — primary wired connection method
  • TCP/IP — for network-connected radios

See Desktop App for platform-specific details and keyboard shortcuts.



+ Връзки | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
🌐 Български
Meshtastic Docs ↗

🌐 Български — Community translation View in English

Връзки

Meshtastic поддържа множество транспортни методи за за комуникация между вашия телефон/настолен компютър и радио възел.

Bluetooth (BLE)

Bluetooth Low Energy е методът за свързване по подразбиране и най-често срещаният в Android.

Сдвояване на устройство

  1. Уверете се, че вашето радио Meshtastic е включено и е в режим на сдвояване.
  2. Отворете приложението и отидете в раздела Свързване.
  3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
  4. Изберете вашето устройство от списъка.
  5. Приемете подканата за Bluetooth сдвояване, ако се покаже.

Scanning for Bluetooth devices, with a discovered radio in the list

Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

Transport selector

💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range.

The screen names anything on the app’s side that is blocking a scan, with the fix attached:

What you see What it means
A card asking for Nearby devices The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings.
Bluetooth is off The adapter is disabled — the card opens Bluetooth settings.
Bluetooth scanning also needs location services Android 11 and older only: the permission is held but the system location toggle is off.
No card, empty list Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere.

Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered.

Състояние на връзката

Икона Състояние Описание
🟢 Свързано Установена активна радиовръзка
🟡 Свързване Ръкостискането е в ход
🔴 Прекъсната връзка Няма активна връзка
Не е конфигурирано Няма избрано устройство

При свързване, индикатора за състояние показва текущото състояние на връзката:

Connecting status

If no devices are found, the app shows an empty state with instructions:

No devices found

Troubleshooting Bluetooth

  • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
  • Connection drops: Move closer to the radio; check for interference.
  • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

USB Serial

USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

Настройка

  1. Connect your radio via USB cable to your device.
  2. The app will prompt for USB permission — tap Allow.
  3. The connection is established automatically.

⚠️ Note: USB connections require OTG support on Android devices.

TCP/IP (Network)

Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

Свързване през мрежата

  1. Make sure the radio is on the same local network as your phone/desktop.
  2. On the Connect screen, select Network in the transport selector.
  3. Choose the radio one of two ways:
    • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
    • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
  4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

When to Use TCP

  • Radio is on the same local network
  • Testing with a simulated radio
  • Environments where Bluetooth has interference issues

Reconnection Behavior

The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

To disconnect, tap the disconnect button on the Connect screen:

Disconnect from radio

Desktop Connections

On Desktop (Linux/macOS/Windows), the app supports:

  • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
  • USB Serial — primary wired connection method
  • TCP/IP — for network-connected radios

See Desktop App for platform-specific details and keyboard shortcuts.



diff --git a/main/bg-rBG/user/onboarding.html b/main/bg-rBG/user/onboarding.html index 0fb4c85b00..ebd36f90cb 100644 --- a/main/bg-rBG/user/onboarding.html +++ b/main/bg-rBG/user/onboarding.html @@ -1 +1 @@ - Първи стъпки | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
🌐 Български
Meshtastic Docs ↗

🌐 Български — Community translation View in English

Първи стъпки

Добре дошли в Meshtastic! Това ръководство ви превежда през първоначалната настройка на приложението Meshtastic за Android.

First Launch

When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings.

Welcome Screen

The welcome screen introduces Meshtastic and its core capabilities:

  • Off-grid mesh communication
  • No cellular or internet required
  • End-to-end encrypted messaging

Tap Get Started to proceed through the setup flow.

Welcome screen

Permissions

The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

Bluetooth Permission

Bluetooth is the primary connection method between your phone and Meshtastic radio:

  • Bluetooth scanning — discover nearby Meshtastic radios
  • Bluetooth connect — establish and maintain connections with paired radios

Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

Location Permission

⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice.

Meshtastic also uses your location for:

  • Showing your position on the mesh map
  • Calculating distances to other nodes
  • Sharing your GPS coordinates with other mesh members (if enabled)

Grant “While using the app” or “Always” depending on your preference:

  • While using the app — position updates only when the app is open
  • Always — enables background position updates for always-on mesh presence

If denied, Bluetooth scanning will not function and your node will not report a position.

Notifications Permission

Notifications alert you to:

  • Incoming messages from channels and direct messages
  • New nodes joining the mesh
  • Low battery on a remote node

💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

Critical Alerts Permission

On supported devices, the app may request permission for critical alerts:

  • These are high-priority notifications that can break through Do Not Disturb mode
  • Useful for emergency mesh alerts or urgent messages
  • You can skip this step if you don’t need breakthrough notifications
  • Configure or revoke later in Android notification settings

After Setup

Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use.

What’s Next?

Once connected to a radio, explore:

New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



+ Първи стъпки | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
🌐 Български
Meshtastic Docs ↗

🌐 Български — Community translation View in English

Първи стъпки

Добре дошли в Meshtastic! Това ръководство ви превежда през първоначалната настройка на приложението Meshtastic за Android.

First Launch

When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app.

Welcome Screen

The welcome screen introduces Meshtastic and its core capabilities:

  • Off-grid mesh communication
  • No cellular or internet required
  • End-to-end encrypted messaging

Tap Get Started to proceed through the setup flow.

Welcome screen

Permissions

The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

Bluetooth Permission

Bluetooth is the primary connection method between your phone and Meshtastic radio:

  • Bluetooth scanning — discover nearby Meshtastic radios
  • Bluetooth connect — establish and maintain connections with paired radios

Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

Location Permission

⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio.

Meshtastic also uses your location for:

  • Showing your position on the mesh map
  • Calculating distances to other nodes
  • Sharing your GPS coordinates with other mesh members (if enabled)

Grant “While using the app” or “Always” depending on your preference:

  • While using the app — position updates only when the app is open
  • Always — enables background position updates for always-on mesh presence

Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind.

Notifications Permission

Notifications alert you to:

  • Incoming messages from channels and direct messages
  • New nodes joining the mesh
  • Low battery on a remote node

💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

Critical Alerts Permission

On supported devices, the app may request permission for critical alerts:

  • These are high-priority notifications that can break through Do Not Disturb mode
  • Useful for emergency mesh alerts or urgent messages
  • You can skip this step if you don’t need breakthrough notifications
  • Configure or revoke later in Android notification settings

Reviewing permissions later

Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time:

Състояние What tapping the row does
Allowed Opens the system page, so you can review or revoke it
Not asked yet Requests it
Denied — tap to allow Explains what the permission is for, then asks again if you agree
Blocked — tap to open system settings Android will no longer show its dialog, so this opens the page where you can turn it back on
Not required on this version of Android Nothing — the permission does not exist on your device

This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead.

After Setup

Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own.

Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing.

What’s Next?

Once connected to a radio, explore:

New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



diff --git a/main/ca-rES/user/connections.html b/main/ca-rES/user/connections.html index 8a17cd48c2..c092cc698e 100644 --- a/main/ca-rES/user/connections.html +++ b/main/ca-rES/user/connections.html @@ -1 +1 @@ - Connections | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
🌐 Català
Meshtastic Docs ↗

🌐 Català — Community translation View in English

Connections

Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

Bluetooth (BLE)

Bluetooth Low Energy is the default and most common connection method on Android.

Pairing a Device

  1. Ensure your Meshtastic radio is powered on and in pairing mode.
  2. Open the app and navigate to the Connect tab.
  3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
  4. Select your device from the list.
  5. Accept the Bluetooth pairing prompt if shown.

Scanning for Bluetooth devices, with a discovered radio in the list

Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

Transport selector

💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device.

Connection Status

Icon State Descripció
🟢 Connected Active radio link established
🟡 Connecting Handshake in progress
🔴 Desconnectat No active connection
Not configured No device selected

When connecting, a status indicator shows the current connection state:

Connecting status

If no devices are found, the app shows an empty state with instructions:

No devices found

Troubleshooting Bluetooth

  • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
  • Connection drops: Move closer to the radio; check for interference.
  • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

USB Serial

USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

Setup

  1. Connect your radio via USB cable to your device.
  2. The app will prompt for USB permission — tap Allow.
  3. The connection is established automatically.

⚠️ Note: USB connections require OTG support on Android devices.

TCP/IP (Network)

Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

Connecting over the Network

  1. Make sure the radio is on the same local network as your phone/desktop.
  2. On the Connect screen, select Network in the transport selector.
  3. Choose the radio one of two ways:
    • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
    • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
  4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

When to Use TCP

  • Radio is on the same local network
  • Testing with a simulated radio
  • Environments where Bluetooth has interference issues

Reconnection Behavior

The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

To disconnect, tap the disconnect button on the Connect screen:

Disconnect from radio

Desktop Connections

On Desktop (Linux/macOS/Windows), the app supports:

  • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
  • USB Serial — primary wired connection method
  • TCP/IP — for network-connected radios

See Desktop App for platform-specific details and keyboard shortcuts.



+ Connections | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
🌐 Català
Meshtastic Docs ↗

🌐 Català — Community translation View in English

Connections

Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

Bluetooth (BLE)

Bluetooth Low Energy is the default and most common connection method on Android.

Pairing a Device

  1. Ensure your Meshtastic radio is powered on and in pairing mode.
  2. Open the app and navigate to the Connect tab.
  3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
  4. Select your device from the list.
  5. Accept the Bluetooth pairing prompt if shown.

Scanning for Bluetooth devices, with a discovered radio in the list

Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

Transport selector

💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range.

The screen names anything on the app’s side that is blocking a scan, with the fix attached:

What you see What it means
A card asking for Nearby devices The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings.
Bluetooth is off The adapter is disabled — the card opens Bluetooth settings.
Bluetooth scanning also needs location services Android 11 and older only: the permission is held but the system location toggle is off.
No card, empty list Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere.

Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered.

Connection Status

Icon State Descripció
🟢 Connected Active radio link established
🟡 Connecting Handshake in progress
🔴 Desconnectat No active connection
Not configured No device selected

When connecting, a status indicator shows the current connection state:

Connecting status

If no devices are found, the app shows an empty state with instructions:

No devices found

Troubleshooting Bluetooth

  • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
  • Connection drops: Move closer to the radio; check for interference.
  • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

USB Serial

USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

Setup

  1. Connect your radio via USB cable to your device.
  2. The app will prompt for USB permission — tap Allow.
  3. The connection is established automatically.

⚠️ Note: USB connections require OTG support on Android devices.

TCP/IP (Network)

Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

Connecting over the Network

  1. Make sure the radio is on the same local network as your phone/desktop.
  2. On the Connect screen, select Network in the transport selector.
  3. Choose the radio one of two ways:
    • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
    • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
  4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

When to Use TCP

  • Radio is on the same local network
  • Testing with a simulated radio
  • Environments where Bluetooth has interference issues

Reconnection Behavior

The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

To disconnect, tap the disconnect button on the Connect screen:

Disconnect from radio

Desktop Connections

On Desktop (Linux/macOS/Windows), the app supports:

  • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
  • USB Serial — primary wired connection method
  • TCP/IP — for network-connected radios

See Desktop App for platform-specific details and keyboard shortcuts.



diff --git a/main/ca-rES/user/onboarding.html b/main/ca-rES/user/onboarding.html index 9cb8ececac..122c5690b0 100644 --- a/main/ca-rES/user/onboarding.html +++ b/main/ca-rES/user/onboarding.html @@ -1 +1 @@ - Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
🌐 Català
Meshtastic Docs ↗

🌐 Català — Community translation View in English

Getting Started

Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

First Launch

When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings.

Welcome Screen

The welcome screen introduces Meshtastic and its core capabilities:

  • Off-grid mesh communication
  • No cellular or internet required
  • End-to-end encrypted messaging

Tap Get Started to proceed through the setup flow.

Welcome screen

Permissions

The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

Bluetooth Permission

Bluetooth is the primary connection method between your phone and Meshtastic radio:

  • Bluetooth scanning — discover nearby Meshtastic radios
  • Bluetooth connect — establish and maintain connections with paired radios

Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

Location Permission

⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice.

Meshtastic also uses your location for:

  • Showing your position on the mesh map
  • Calculating distances to other nodes
  • Sharing your GPS coordinates with other mesh members (if enabled)

Grant “While using the app” or “Always” depending on your preference:

  • While using the app — position updates only when the app is open
  • Always — enables background position updates for always-on mesh presence

If denied, Bluetooth scanning will not function and your node will not report a position.

Notifications Permission

Notifications alert you to:

  • Incoming messages from channels and direct messages
  • New nodes joining the mesh
  • Low battery on a remote node

💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

Critical Alerts Permission

On supported devices, the app may request permission for critical alerts:

  • These are high-priority notifications that can break through Do Not Disturb mode
  • Useful for emergency mesh alerts or urgent messages
  • You can skip this step if you don’t need breakthrough notifications
  • Configure or revoke later in Android notification settings

After Setup

Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use.

What’s Next?

Once connected to a radio, explore:

New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



+ Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
🌐 Català
Meshtastic Docs ↗

🌐 Català — Community translation View in English

Getting Started

Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

First Launch

When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app.

Welcome Screen

The welcome screen introduces Meshtastic and its core capabilities:

  • Off-grid mesh communication
  • No cellular or internet required
  • End-to-end encrypted messaging

Tap Get Started to proceed through the setup flow.

Welcome screen

Permissions

The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

Bluetooth Permission

Bluetooth is the primary connection method between your phone and Meshtastic radio:

  • Bluetooth scanning — discover nearby Meshtastic radios
  • Bluetooth connect — establish and maintain connections with paired radios

Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

Location Permission

⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio.

Meshtastic also uses your location for:

  • Showing your position on the mesh map
  • Calculating distances to other nodes
  • Sharing your GPS coordinates with other mesh members (if enabled)

Grant “While using the app” or “Always” depending on your preference:

  • While using the app — position updates only when the app is open
  • Always — enables background position updates for always-on mesh presence

Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind.

Notifications Permission

Notifications alert you to:

  • Incoming messages from channels and direct messages
  • New nodes joining the mesh
  • Low battery on a remote node

💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

Critical Alerts Permission

On supported devices, the app may request permission for critical alerts:

  • These are high-priority notifications that can break through Do Not Disturb mode
  • Useful for emergency mesh alerts or urgent messages
  • You can skip this step if you don’t need breakthrough notifications
  • Configure or revoke later in Android notification settings

Reviewing permissions later

Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time:

State What tapping the row does
Allowed Opens the system page, so you can review or revoke it
Not asked yet Requests it
Denied — tap to allow Explains what the permission is for, then asks again if you agree
Blocked — tap to open system settings Android will no longer show its dialog, so this opens the page where you can turn it back on
Not required on this version of Android Nothing — the permission does not exist on your device

This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead.

After Setup

Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own.

Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing.

What’s Next?

Once connected to a radio, explore:

New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



diff --git a/main/cs-rCZ/user/connections.html b/main/cs-rCZ/user/connections.html index 308577ff51..bf1ed9c0ae 100644 --- a/main/cs-rCZ/user/connections.html +++ b/main/cs-rCZ/user/connections.html @@ -1 +1 @@ - Připojení | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
🌐 Čeština
Meshtastic Docs ↗

🌐 Čeština — Community translation View in English

Připojení

Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

Bluetooth (BLE)

Bluetooth Low Energy is the default and most common connection method on Android.

Pairing a Device

  1. Ensure your Meshtastic radio is powered on and in pairing mode.
  2. Open the app and navigate to the Connect tab.
  3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
  4. Select your device from the list.
  5. Accept the Bluetooth pairing prompt if shown.

Scanning for Bluetooth devices, with a discovered radio in the list

Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

Transport selector

💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device.

Connection Status

Icon State Popis
🟢 Připojeno Active radio link established
🟡 Připojování Handshake in progress
🔴 Odpojeno No active connection
Not configured Není vybráno žádné zařízení

When connecting, a status indicator shows the current connection state:

Connecting status

If no devices are found, the app shows an empty state with instructions:

No devices found

Troubleshooting Bluetooth

  • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
  • Connection drops: Move closer to the radio; check for interference.
  • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

USB Serial

USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

Setup

  1. Connect your radio via USB cable to your device.
  2. The app will prompt for USB permission — tap Allow.
  3. The connection is established automatically.

⚠️ Note: USB connections require OTG support on Android devices.

TCP/IP (Network)

Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

Connecting over the Network

  1. Make sure the radio is on the same local network as your phone/desktop.
  2. On the Connect screen, select Network in the transport selector.
  3. Choose the radio one of two ways:
    • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
    • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
  4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

When to Use TCP

  • Radio is on the same local network
  • Testing with a simulated radio
  • Environments where Bluetooth has interference issues

Reconnection Behavior

The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

To disconnect, tap the disconnect button on the Connect screen:

Disconnect from radio

Desktop Connections

On Desktop (Linux/macOS/Windows), the app supports:

  • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
  • USB Serial — primary wired connection method
  • TCP/IP — for network-connected radios

See Desktop App for platform-specific details and keyboard shortcuts.



+ Připojení | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
🌐 Čeština
Meshtastic Docs ↗

🌐 Čeština — Community translation View in English

Připojení

Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

Bluetooth (BLE)

Bluetooth Low Energy is the default and most common connection method on Android.

Pairing a Device

  1. Ensure your Meshtastic radio is powered on and in pairing mode.
  2. Open the app and navigate to the Connect tab.
  3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
  4. Select your device from the list.
  5. Accept the Bluetooth pairing prompt if shown.

Scanning for Bluetooth devices, with a discovered radio in the list

Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

Transport selector

💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range.

The screen names anything on the app’s side that is blocking a scan, with the fix attached:

What you see What it means
A card asking for Nearby devices The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings.
Bluetooth is off The adapter is disabled — the card opens Bluetooth settings.
Bluetooth scanning also needs location services Android 11 and older only: the permission is held but the system location toggle is off.
No card, empty list Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere.

Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered.

Connection Status

Icon State Popis
🟢 Připojeno Active radio link established
🟡 Připojování Handshake in progress
🔴 Odpojeno No active connection
Not configured Není vybráno žádné zařízení

When connecting, a status indicator shows the current connection state:

Connecting status

If no devices are found, the app shows an empty state with instructions:

No devices found

Troubleshooting Bluetooth

  • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
  • Connection drops: Move closer to the radio; check for interference.
  • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

USB Serial

USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

Setup

  1. Connect your radio via USB cable to your device.
  2. The app will prompt for USB permission — tap Allow.
  3. The connection is established automatically.

⚠️ Note: USB connections require OTG support on Android devices.

TCP/IP (Network)

Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

Connecting over the Network

  1. Make sure the radio is on the same local network as your phone/desktop.
  2. On the Connect screen, select Network in the transport selector.
  3. Choose the radio one of two ways:
    • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
    • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
  4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

When to Use TCP

  • Radio is on the same local network
  • Testing with a simulated radio
  • Environments where Bluetooth has interference issues

Reconnection Behavior

The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

To disconnect, tap the disconnect button on the Connect screen:

Disconnect from radio

Desktop Connections

On Desktop (Linux/macOS/Windows), the app supports:

  • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
  • USB Serial — primary wired connection method
  • TCP/IP — for network-connected radios

See Desktop App for platform-specific details and keyboard shortcuts.



diff --git a/main/cs-rCZ/user/onboarding.html b/main/cs-rCZ/user/onboarding.html index e6bbd62d66..de270659c5 100644 --- a/main/cs-rCZ/user/onboarding.html +++ b/main/cs-rCZ/user/onboarding.html @@ -1 +1 @@ - Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
🌐 Čeština
Meshtastic Docs ↗

🌐 Čeština — Community translation View in English

Getting Started

Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

First Launch

When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings.

Welcome Screen

The welcome screen introduces Meshtastic and its core capabilities:

  • Off-grid mesh communication
  • No cellular or internet required
  • End-to-end encrypted messaging

Tap Get Started to proceed through the setup flow.

Welcome screen

Permissions

The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

Bluetooth Permission

Bluetooth is the primary connection method between your phone and Meshtastic radio:

  • Bluetooth scanning — discover nearby Meshtastic radios
  • Bluetooth connect — establish and maintain connections with paired radios

Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

Location Permission

⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice.

Meshtastic also uses your location for:

  • Showing your position on the mesh map
  • Calculating distances to other nodes
  • Sharing your GPS coordinates with other mesh members (if enabled)

Grant “While using the app” or “Always” depending on your preference:

  • While using the app — position updates only when the app is open
  • Always — enables background position updates for always-on mesh presence

If denied, Bluetooth scanning will not function and your node will not report a position.

Notifications Permission

Notifications alert you to:

  • Incoming messages from channels and direct messages
  • New nodes joining the mesh
  • Low battery on a remote node

💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

Critical Alerts Permission

On supported devices, the app may request permission for critical alerts:

  • These are high-priority notifications that can break through Do Not Disturb mode
  • Useful for emergency mesh alerts or urgent messages
  • You can skip this step if you don’t need breakthrough notifications
  • Configure or revoke later in Android notification settings

After Setup

Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use.

What’s Next?

Once connected to a radio, explore:

New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



+ Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
🌐 Čeština
Meshtastic Docs ↗

🌐 Čeština — Community translation View in English

Getting Started

Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

First Launch

When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app.

Welcome Screen

The welcome screen introduces Meshtastic and its core capabilities:

  • Off-grid mesh communication
  • No cellular or internet required
  • End-to-end encrypted messaging

Tap Get Started to proceed through the setup flow.

Welcome screen

Permissions

The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

Bluetooth Permission

Bluetooth is the primary connection method between your phone and Meshtastic radio:

  • Bluetooth scanning — discover nearby Meshtastic radios
  • Bluetooth connect — establish and maintain connections with paired radios

Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

Location Permission

⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio.

Meshtastic also uses your location for:

  • Showing your position on the mesh map
  • Calculating distances to other nodes
  • Sharing your GPS coordinates with other mesh members (if enabled)

Grant “While using the app” or “Always” depending on your preference:

  • While using the app — position updates only when the app is open
  • Always — enables background position updates for always-on mesh presence

Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind.

Notifications Permission

Notifications alert you to:

  • Incoming messages from channels and direct messages
  • New nodes joining the mesh
  • Low battery on a remote node

💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

Critical Alerts Permission

On supported devices, the app may request permission for critical alerts:

  • These are high-priority notifications that can break through Do Not Disturb mode
  • Useful for emergency mesh alerts or urgent messages
  • You can skip this step if you don’t need breakthrough notifications
  • Configure or revoke later in Android notification settings

Reviewing permissions later

Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time:

State What tapping the row does
Allowed Opens the system page, so you can review or revoke it
Not asked yet Requests it
Denied — tap to allow Explains what the permission is for, then asks again if you agree
Blocked — tap to open system settings Android will no longer show its dialog, so this opens the page where you can turn it back on
Not required on this version of Android Nothing — the permission does not exist on your device

This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead.

After Setup

Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own.

Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing.

What’s Next?

Once connected to a radio, explore:

New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



diff --git a/main/de-rDE/user/connections.html b/main/de-rDE/user/connections.html index db3ae81d80..f7f75dcafd 100644 --- a/main/de-rDE/user/connections.html +++ b/main/de-rDE/user/connections.html @@ -1 +1 @@ - Verbindungen | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
🌐 Deutsch
Meshtastic Docs ↗

🌐 Deutsch — Community translation View in English

Verbindungen

Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

Bluetooth (BLE)

Bluetooth Low Energy is the default and most common connection method on Android.

Pairing a Device

  1. Ensure your Meshtastic radio is powered on and in pairing mode.
  2. Open the app and navigate to the Connect tab.
  3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
  4. Select your device from the list.
  5. Accept the Bluetooth pairing prompt if shown.

Scanning for Bluetooth devices, with a discovered radio in the list

Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

Transport selector

💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device.

Connection Status

Symbol Status Beschreibung
🟢 Verbunden Active radio link established
🟡 Wird verbunden Handshake in progress
🔴 Verbindung getrennt No active connection
Not configured Kein Gerät ausgewählt

When connecting, a status indicator shows the current connection state:

Connecting status

If no devices are found, the app shows an empty state with instructions:

No devices found

Troubleshooting Bluetooth

  • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
  • Connection drops: Move closer to the radio; check for interference.
  • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

USB Serial

USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

Einstellungen

  1. Connect your radio via USB cable to your device.
  2. The app will prompt for USB permission — tap Allow.
  3. The connection is established automatically.

⚠️ Note: USB connections require OTG support on Android devices.

TCP/IP (Network)

Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

Connecting over the Network

  1. Make sure the radio is on the same local network as your phone/desktop.
  2. On the Connect screen, select Network in the transport selector.
  3. Choose the radio one of two ways:
    • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
    • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
  4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

When to Use TCP

  • Radio is on the same local network
  • Testing with a simulated radio
  • Environments where Bluetooth has interference issues

Reconnection Behavior

The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

To disconnect, tap the disconnect button on the Connect screen:

Disconnect from radio

Desktop Connections

On Desktop (Linux/macOS/Windows), the app supports:

  • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
  • USB Serial — primary wired connection method
  • TCP/IP — for network-connected radios

See Desktop App for platform-specific details and keyboard shortcuts.



+ Verbindungen | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
🌐 Deutsch
Meshtastic Docs ↗

🌐 Deutsch — Community translation View in English

Verbindungen

Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

Bluetooth (BLE)

Bluetooth Low Energy is the default and most common connection method on Android.

Pairing a Device

  1. Ensure your Meshtastic radio is powered on and in pairing mode.
  2. Open the app and navigate to the Connect tab.
  3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
  4. Select your device from the list.
  5. Accept the Bluetooth pairing prompt if shown.

Scanning for Bluetooth devices, with a discovered radio in the list

Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

Transport selector

💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range.

The screen names anything on the app’s side that is blocking a scan, with the fix attached:

What you see What it means
A card asking for Nearby devices The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings.
Bluetooth is off The adapter is disabled — the card opens Bluetooth settings.
Bluetooth scanning also needs location services Android 11 and older only: the permission is held but the system location toggle is off.
No card, empty list Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere.

Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered.

Connection Status

Symbol Status Beschreibung
🟢 Verbunden Active radio link established
🟡 Wird verbunden Handshake in progress
🔴 Verbindung getrennt No active connection
Not configured Kein Gerät ausgewählt

When connecting, a status indicator shows the current connection state:

Connecting status

If no devices are found, the app shows an empty state with instructions:

No devices found

Troubleshooting Bluetooth

  • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
  • Connection drops: Move closer to the radio; check for interference.
  • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

USB Serial

USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

Einstellungen

  1. Connect your radio via USB cable to your device.
  2. The app will prompt for USB permission — tap Allow.
  3. The connection is established automatically.

⚠️ Note: USB connections require OTG support on Android devices.

TCP/IP (Network)

Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

Connecting over the Network

  1. Make sure the radio is on the same local network as your phone/desktop.
  2. On the Connect screen, select Network in the transport selector.
  3. Choose the radio one of two ways:
    • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
    • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
  4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

When to Use TCP

  • Radio is on the same local network
  • Testing with a simulated radio
  • Environments where Bluetooth has interference issues

Reconnection Behavior

The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

To disconnect, tap the disconnect button on the Connect screen:

Disconnect from radio

Desktop Connections

On Desktop (Linux/macOS/Windows), the app supports:

  • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
  • USB Serial — primary wired connection method
  • TCP/IP — for network-connected radios

See Desktop App for platform-specific details and keyboard shortcuts.



diff --git a/main/de-rDE/user/onboarding.html b/main/de-rDE/user/onboarding.html index 8792c475f6..e744abe8cc 100644 --- a/main/de-rDE/user/onboarding.html +++ b/main/de-rDE/user/onboarding.html @@ -1 +1 @@ - Erste Schritte | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
🌐 Deutsch
Meshtastic Docs ↗

🌐 Deutsch — Community translation View in English

Erste Schritte

Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

First Launch

When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings.

Welcome Screen

The welcome screen introduces Meshtastic and its core capabilities:

  • Off-grid mesh communication
  • No cellular or internet required
  • End-to-end encrypted messaging

Tap Get Started to proceed through the setup flow.

Welcome screen

Permissions

The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

Bluetooth Permission

Bluetooth is the primary connection method between your phone and Meshtastic radio:

  • Bluetooth scanning — discover nearby Meshtastic radios
  • Bluetooth connect — establish and maintain connections with paired radios

Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

Location Permission

⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice.

Meshtastic also uses your location for:

  • Showing your position on the mesh map
  • Calculating distances to other nodes
  • Sharing your GPS coordinates with other mesh members (if enabled)

Grant “While using the app” or “Always” depending on your preference:

  • While using the app — position updates only when the app is open
  • Always — enables background position updates for always-on mesh presence

If denied, Bluetooth scanning will not function and your node will not report a position.

Notifications Permission

Notifications alert you to:

  • Incoming messages from channels and direct messages
  • New nodes joining the mesh
  • Low battery on a remote node

💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

Critical Alerts Permission

On supported devices, the app may request permission for critical alerts:

  • These are high-priority notifications that can break through Do Not Disturb mode
  • Useful for emergency mesh alerts or urgent messages
  • You can skip this step if you don’t need breakthrough notifications
  • Configure or revoke later in Android notification settings

After Setup

Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use.

What’s Next?

Once connected to a radio, explore:

New to Meshtastic? Die Anleitung für den Einstieg auf meshtastic.org behandelt die Hardware-Auswahl, die anfängliche Funkkonfiguration und die Einrichtung deines ersten Mesh-Netzwerks.



+ Erste Schritte | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
🌐 Deutsch
Meshtastic Docs ↗

🌐 Deutsch — Community translation View in English

Erste Schritte

Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

First Launch

When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app.

Welcome Screen

The welcome screen introduces Meshtastic and its core capabilities:

  • Off-grid mesh communication
  • No cellular or internet required
  • End-to-end encrypted messaging

Tap Get Started to proceed through the setup flow.

Welcome screen

Permissions

The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

Bluetooth Permission

Bluetooth is the primary connection method between your phone and Meshtastic radio:

  • Bluetooth scanning — discover nearby Meshtastic radios
  • Bluetooth connect — establish and maintain connections with paired radios

Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

Location Permission

⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio.

Meshtastic also uses your location for:

  • Showing your position on the mesh map
  • Calculating distances to other nodes
  • Sharing your GPS coordinates with other mesh members (if enabled)

Grant “While using the app” or “Always” depending on your preference:

  • While using the app — position updates only when the app is open
  • Always — enables background position updates for always-on mesh presence

Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind.

Notifications Permission

Notifications alert you to:

  • Incoming messages from channels and direct messages
  • New nodes joining the mesh
  • Low battery on a remote node

💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

Critical Alerts Permission

On supported devices, the app may request permission for critical alerts:

  • These are high-priority notifications that can break through Do Not Disturb mode
  • Useful for emergency mesh alerts or urgent messages
  • You can skip this step if you don’t need breakthrough notifications
  • Configure or revoke later in Android notification settings

Reviewing permissions later

Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time:

Status What tapping the row does
Allowed Opens the system page, so you can review or revoke it
Not asked yet Requests it
Denied — tap to allow Explains what the permission is for, then asks again if you agree
Blocked — tap to open system settings Android will no longer show its dialog, so this opens the page where you can turn it back on
Not required on this version of Android Nothing — the permission does not exist on your device

This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead.

After Setup

Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own.

Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing.

What’s Next?

Once connected to a radio, explore:

New to Meshtastic? Die Anleitung für den Einstieg auf meshtastic.org behandelt die Hardware-Auswahl, die anfängliche Funkkonfiguration und die Einrichtung deines ersten Mesh-Netzwerks.



diff --git a/main/docs/ar-rSA/user/connections.html b/main/docs/ar-rSA/user/connections.html index 001350d81f..126618475f 100644 --- a/main/docs/ar-rSA/user/connections.html +++ b/main/docs/ar-rSA/user/connections.html @@ -29,7 +29,18 @@ Use the transport selector — a segmented button row below the connection card ![Transport selector](../../assets/screenshots/connections_transport_filters.png) -> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. +> 💡 **Tip:** If your device doesn't appear, check that the radio is not already connected to another device or out of range. + +The screen names anything on the app's side that is blocking a scan, with the fix attached: + + What you see | What it means | + --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + A card asking for **Nearby devices** | The permission has not been granted. **Grant permission** requests it; once Android stops prompting, the button becomes **Open settings**. | + **Bluetooth is off** | The adapter is disabled — the card opens Bluetooth settings. | + **Bluetooth scanning also needs location services** | Android 11 and older only: the permission is held but the system location toggle is off. | + No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | + +Tapping **Scan** after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. ### Connection Status diff --git a/main/docs/ar-rSA/user/onboarding.html b/main/docs/ar-rSA/user/onboarding.html index d3c20dfb31..65db590298 100644 --- a/main/docs/ar-rSA/user/onboarding.html +++ b/main/docs/ar-rSA/user/onboarding.html @@ -13,7 +13,7 @@ Welcome to Meshtastic! This guide walks you through the initial setup of the Mes ## First Launch -When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from **Settings → Permissions** inside the app. ### Welcome Screen @@ -42,7 +42,7 @@ Grant both permissions when prompted. Without Bluetooth, you'll need to use USB ### Location Permission -> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. +> ⚠️ **Is location required for Bluetooth?** On **Android 11 and older**, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of "Nearby devices", and system **Location Services** must also be switched on for a scan to return anything. There you will see **one** location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the "Don't ask again" checkbox on Android 10 and older). On **Android 12 and newer** the two are separate: "Nearby devices" is declared `neverForLocation`, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: @@ -55,7 +55,7 @@ Grant **"While using the app"** or **"Always"** depending on your preference: - **While using the app** — position updates only when the app is open - **Always** — enables background position updates for always-on mesh presence -If denied, Bluetooth scanning will not function and your node will not report a position. +Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. ### Notifications Permission @@ -76,11 +76,27 @@ On supported devices, the app may request permission for critical alerts: - You can **skip** this step if you don't need breakthrough notifications - Configure or revoke later in Android notification settings +### Reviewing permissions later + +**Settings → Permissions** summarizes where every runtime permission stands. It reads _All allowed_ when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: + + State | What tapping the row does | + ------------------------------------------- | -------------------------------------------------------------------------------------------- | + **Allowed** | Opens the system page, so you can review or revoke it | + **Not asked yet** | Requests it | + **Denied — tap to allow** | Explains what the permission is for, then asks again if you agree | + **Blocked — tap to open system settings** | Android will no longer show its dialog, so this opens the page where you can turn it back on | + **Not required on this version of Android** | Nothing — the permission does not exist on your device | + +This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to **Blocked** and sends you to the system settings page instead. + ## After Setup Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. -> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. +> 💡 **Tip:** If you skipped any permissions during setup, open **Settings → Permissions** in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. + +Features also ask in context. Tapping **Scan** on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ## What's Next? diff --git a/main/docs/be-rBY/user/connections.html b/main/docs/be-rBY/user/connections.html index 5b302f9e0c..1929764534 100644 --- a/main/docs/be-rBY/user/connections.html +++ b/main/docs/be-rBY/user/connections.html @@ -29,7 +29,18 @@ Use the transport selector — a segmented button row below the connection card ![Transport selector](../../assets/screenshots/connections_transport_filters.png) -> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. +> 💡 **Tip:** If your device doesn't appear, check that the radio is not already connected to another device or out of range. + +The screen names anything on the app's side that is blocking a scan, with the fix attached: + + What you see | What it means | + --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + A card asking for **Nearby devices** | The permission has not been granted. **Grant permission** requests it; once Android stops prompting, the button becomes **Open settings**. | + **Bluetooth is off** | The adapter is disabled — the card opens Bluetooth settings. | + **Bluetooth scanning also needs location services** | Android 11 and older only: the permission is held but the system location toggle is off. | + No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | + +Tapping **Scan** after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. ### Connection Status diff --git a/main/docs/be-rBY/user/onboarding.html b/main/docs/be-rBY/user/onboarding.html index d2ddd1e11c..3dd5f39143 100644 --- a/main/docs/be-rBY/user/onboarding.html +++ b/main/docs/be-rBY/user/onboarding.html @@ -13,7 +13,7 @@ Welcome to Meshtastic! This guide walks you through the initial setup of the Mes ## First Launch -When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from **Settings → Permissions** inside the app. ### Welcome Screen @@ -42,7 +42,7 @@ Grant both permissions when prompted. Without Bluetooth, you'll need to use USB ### Location Permission -> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. +> ⚠️ **Is location required for Bluetooth?** On **Android 11 and older**, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of "Nearby devices", and system **Location Services** must also be switched on for a scan to return anything. There you will see **one** location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the "Don't ask again" checkbox on Android 10 and older). On **Android 12 and newer** the two are separate: "Nearby devices" is declared `neverForLocation`, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: @@ -55,7 +55,7 @@ Grant **"While using the app"** or **"Always"** depending on your preference: - **While using the app** — position updates only when the app is open - **Always** — enables background position updates for always-on mesh presence -If denied, Bluetooth scanning will not function and your node will not report a position. +Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. ### Notifications Permission @@ -76,11 +76,27 @@ On supported devices, the app may request permission for critical alerts: - You can **skip** this step if you don't need breakthrough notifications - Configure or revoke later in Android notification settings +### Reviewing permissions later + +**Settings → Permissions** summarizes where every runtime permission stands. It reads _All allowed_ when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: + + State | What tapping the row does | + ------------------------------------------- | -------------------------------------------------------------------------------------------- | + **Allowed** | Opens the system page, so you can review or revoke it | + **Not asked yet** | Requests it | + **Denied — tap to allow** | Explains what the permission is for, then asks again if you agree | + **Blocked — tap to open system settings** | Android will no longer show its dialog, so this opens the page where you can turn it back on | + **Not required on this version of Android** | Nothing — the permission does not exist on your device | + +This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to **Blocked** and sends you to the system settings page instead. + ## After Setup Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. -> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. +> 💡 **Tip:** If you skipped any permissions during setup, open **Settings → Permissions** in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. + +Features also ask in context. Tapping **Scan** on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ## What's Next? diff --git a/main/docs/bg-rBG/user/connections.html b/main/docs/bg-rBG/user/connections.html index ce1aaf06c2..01ca25c244 100644 --- a/main/docs/bg-rBG/user/connections.html +++ b/main/docs/bg-rBG/user/connections.html @@ -29,7 +29,18 @@ Use the transport selector — a segmented button row below the connection card ![Transport selector](../../assets/screenshots/connections_transport_filters.png) -> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. +> 💡 **Tip:** If your device doesn't appear, check that the radio is not already connected to another device or out of range. + +The screen names anything on the app's side that is blocking a scan, with the fix attached: + + What you see | What it means | + --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + A card asking for **Nearby devices** | The permission has not been granted. **Grant permission** requests it; once Android stops prompting, the button becomes **Open settings**. | + **Bluetooth is off** | The adapter is disabled — the card opens Bluetooth settings. | + **Bluetooth scanning also needs location services** | Android 11 and older only: the permission is held but the system location toggle is off. | + No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | + +Tapping **Scan** after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. ### Състояние на връзката diff --git a/main/docs/bg-rBG/user/onboarding.html b/main/docs/bg-rBG/user/onboarding.html index b0d3b12657..d693436804 100644 --- a/main/docs/bg-rBG/user/onboarding.html +++ b/main/docs/bg-rBG/user/onboarding.html @@ -13,7 +13,7 @@ ## First Launch -When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from **Settings → Permissions** inside the app. ### Welcome Screen @@ -42,7 +42,7 @@ Grant both permissions when prompted. Without Bluetooth, you'll need to use USB ### Location Permission -> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. +> ⚠️ **Is location required for Bluetooth?** On **Android 11 and older**, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of "Nearby devices", and system **Location Services** must also be switched on for a scan to return anything. There you will see **one** location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the "Don't ask again" checkbox on Android 10 and older). On **Android 12 and newer** the two are separate: "Nearby devices" is declared `neverForLocation`, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: @@ -55,7 +55,7 @@ Grant **"While using the app"** or **"Always"** depending on your preference: - **While using the app** — position updates only when the app is open - **Always** — enables background position updates for always-on mesh presence -If denied, Bluetooth scanning will not function and your node will not report a position. +Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. ### Notifications Permission @@ -76,11 +76,27 @@ On supported devices, the app may request permission for critical alerts: - You can **skip** this step if you don't need breakthrough notifications - Configure or revoke later in Android notification settings +### Reviewing permissions later + +**Settings → Permissions** summarizes where every runtime permission stands. It reads _All allowed_ when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: + + Състояние | What tapping the row does | + ------------------------------------------- | -------------------------------------------------------------------------------------------- | + **Allowed** | Opens the system page, so you can review or revoke it | + **Not asked yet** | Requests it | + **Denied — tap to allow** | Explains what the permission is for, then asks again if you agree | + **Blocked — tap to open system settings** | Android will no longer show its dialog, so this opens the page where you can turn it back on | + **Not required on this version of Android** | Nothing — the permission does not exist on your device | + +This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to **Blocked** and sends you to the system settings page instead. + ## After Setup Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. -> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. +> 💡 **Tip:** If you skipped any permissions during setup, open **Settings → Permissions** in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. + +Features also ask in context. Tapping **Scan** on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ## What's Next? diff --git a/main/docs/ca-rES/user/connections.html b/main/docs/ca-rES/user/connections.html index 2d70aef3ee..dc4c672077 100644 --- a/main/docs/ca-rES/user/connections.html +++ b/main/docs/ca-rES/user/connections.html @@ -29,7 +29,18 @@ Use the transport selector — a segmented button row below the connection card ![Transport selector](../../assets/screenshots/connections_transport_filters.png) -> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. +> 💡 **Tip:** If your device doesn't appear, check that the radio is not already connected to another device or out of range. + +The screen names anything on the app's side that is blocking a scan, with the fix attached: + + What you see | What it means | + --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + A card asking for **Nearby devices** | The permission has not been granted. **Grant permission** requests it; once Android stops prompting, the button becomes **Open settings**. | + **Bluetooth is off** | The adapter is disabled — the card opens Bluetooth settings. | + **Bluetooth scanning also needs location services** | Android 11 and older only: the permission is held but the system location toggle is off. | + No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | + +Tapping **Scan** after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. ### Connection Status diff --git a/main/docs/ca-rES/user/onboarding.html b/main/docs/ca-rES/user/onboarding.html index 4df6017d71..8afb00568d 100644 --- a/main/docs/ca-rES/user/onboarding.html +++ b/main/docs/ca-rES/user/onboarding.html @@ -13,7 +13,7 @@ Welcome to Meshtastic! This guide walks you through the initial setup of the Mes ## First Launch -When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from **Settings → Permissions** inside the app. ### Welcome Screen @@ -42,7 +42,7 @@ Grant both permissions when prompted. Without Bluetooth, you'll need to use USB ### Location Permission -> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. +> ⚠️ **Is location required for Bluetooth?** On **Android 11 and older**, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of "Nearby devices", and system **Location Services** must also be switched on for a scan to return anything. There you will see **one** location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the "Don't ask again" checkbox on Android 10 and older). On **Android 12 and newer** the two are separate: "Nearby devices" is declared `neverForLocation`, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: @@ -55,7 +55,7 @@ Grant **"While using the app"** or **"Always"** depending on your preference: - **While using the app** — position updates only when the app is open - **Always** — enables background position updates for always-on mesh presence -If denied, Bluetooth scanning will not function and your node will not report a position. +Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. ### Notifications Permission @@ -76,11 +76,27 @@ On supported devices, the app may request permission for critical alerts: - You can **skip** this step if you don't need breakthrough notifications - Configure or revoke later in Android notification settings +### Reviewing permissions later + +**Settings → Permissions** summarizes where every runtime permission stands. It reads _All allowed_ when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: + + State | What tapping the row does | + ------------------------------------------- | -------------------------------------------------------------------------------------------- | + **Allowed** | Opens the system page, so you can review or revoke it | + **Not asked yet** | Requests it | + **Denied — tap to allow** | Explains what the permission is for, then asks again if you agree | + **Blocked — tap to open system settings** | Android will no longer show its dialog, so this opens the page where you can turn it back on | + **Not required on this version of Android** | Nothing — the permission does not exist on your device | + +This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to **Blocked** and sends you to the system settings page instead. + ## After Setup Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. -> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. +> 💡 **Tip:** If you skipped any permissions during setup, open **Settings → Permissions** in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. + +Features also ask in context. Tapping **Scan** on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ## What's Next? diff --git a/main/docs/cs-rCZ/user/connections.html b/main/docs/cs-rCZ/user/connections.html index 3a15914248..932c11888a 100644 --- a/main/docs/cs-rCZ/user/connections.html +++ b/main/docs/cs-rCZ/user/connections.html @@ -29,7 +29,18 @@ Use the transport selector — a segmented button row below the connection card ![Transport selector](../../assets/screenshots/connections_transport_filters.png) -> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. +> 💡 **Tip:** If your device doesn't appear, check that the radio is not already connected to another device or out of range. + +The screen names anything on the app's side that is blocking a scan, with the fix attached: + + What you see | What it means | + --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + A card asking for **Nearby devices** | The permission has not been granted. **Grant permission** requests it; once Android stops prompting, the button becomes **Open settings**. | + **Bluetooth is off** | The adapter is disabled — the card opens Bluetooth settings. | + **Bluetooth scanning also needs location services** | Android 11 and older only: the permission is held but the system location toggle is off. | + No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | + +Tapping **Scan** after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. ### Connection Status diff --git a/main/docs/cs-rCZ/user/onboarding.html b/main/docs/cs-rCZ/user/onboarding.html index ac06b2b937..dab352ed45 100644 --- a/main/docs/cs-rCZ/user/onboarding.html +++ b/main/docs/cs-rCZ/user/onboarding.html @@ -13,7 +13,7 @@ Welcome to Meshtastic! This guide walks you through the initial setup of the Mes ## First Launch -When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from **Settings → Permissions** inside the app. ### Welcome Screen @@ -42,7 +42,7 @@ Grant both permissions when prompted. Without Bluetooth, you'll need to use USB ### Location Permission -> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. +> ⚠️ **Is location required for Bluetooth?** On **Android 11 and older**, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of "Nearby devices", and system **Location Services** must also be switched on for a scan to return anything. There you will see **one** location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the "Don't ask again" checkbox on Android 10 and older). On **Android 12 and newer** the two are separate: "Nearby devices" is declared `neverForLocation`, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: @@ -55,7 +55,7 @@ Grant **"While using the app"** or **"Always"** depending on your preference: - **While using the app** — position updates only when the app is open - **Always** — enables background position updates for always-on mesh presence -If denied, Bluetooth scanning will not function and your node will not report a position. +Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. ### Notifications Permission @@ -76,11 +76,27 @@ On supported devices, the app may request permission for critical alerts: - You can **skip** this step if you don't need breakthrough notifications - Configure or revoke later in Android notification settings +### Reviewing permissions later + +**Settings → Permissions** summarizes where every runtime permission stands. It reads _All allowed_ when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: + + State | What tapping the row does | + ------------------------------------------- | -------------------------------------------------------------------------------------------- | + **Allowed** | Opens the system page, so you can review or revoke it | + **Not asked yet** | Requests it | + **Denied — tap to allow** | Explains what the permission is for, then asks again if you agree | + **Blocked — tap to open system settings** | Android will no longer show its dialog, so this opens the page where you can turn it back on | + **Not required on this version of Android** | Nothing — the permission does not exist on your device | + +This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to **Blocked** and sends you to the system settings page instead. + ## After Setup Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. -> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. +> 💡 **Tip:** If you skipped any permissions during setup, open **Settings → Permissions** in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. + +Features also ask in context. Tapping **Scan** on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ## What's Next? diff --git a/main/docs/de-rDE/user/connections.html b/main/docs/de-rDE/user/connections.html index f273aef130..6d73d5ad83 100644 --- a/main/docs/de-rDE/user/connections.html +++ b/main/docs/de-rDE/user/connections.html @@ -29,7 +29,18 @@ Use the transport selector — a segmented button row below the connection card ![Transport selector](../../assets/screenshots/connections_transport_filters.png) -> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. +> 💡 **Tip:** If your device doesn't appear, check that the radio is not already connected to another device or out of range. + +The screen names anything on the app's side that is blocking a scan, with the fix attached: + + What you see | What it means | + --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + A card asking for **Nearby devices** | The permission has not been granted. **Grant permission** requests it; once Android stops prompting, the button becomes **Open settings**. | + **Bluetooth is off** | The adapter is disabled — the card opens Bluetooth settings. | + **Bluetooth scanning also needs location services** | Android 11 and older only: the permission is held but the system location toggle is off. | + No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | + +Tapping **Scan** after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. ### Connection Status diff --git a/main/docs/de-rDE/user/onboarding.html b/main/docs/de-rDE/user/onboarding.html index 2da494451b..bc140e2ec8 100644 --- a/main/docs/de-rDE/user/onboarding.html +++ b/main/docs/de-rDE/user/onboarding.html @@ -13,7 +13,7 @@ Welcome to Meshtastic! This guide walks you through the initial setup of the Mes ## First Launch -When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from **Settings → Permissions** inside the app. ### Welcome Screen @@ -42,7 +42,7 @@ Grant both permissions when prompted. Without Bluetooth, you'll need to use USB ### Location Permission -> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. +> ⚠️ **Is location required for Bluetooth?** On **Android 11 and older**, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of "Nearby devices", and system **Location Services** must also be switched on for a scan to return anything. There you will see **one** location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the "Don't ask again" checkbox on Android 10 and older). On **Android 12 and newer** the two are separate: "Nearby devices" is declared `neverForLocation`, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: @@ -55,7 +55,7 @@ Grant **"While using the app"** or **"Always"** depending on your preference: - **While using the app** — position updates only when the app is open - **Always** — enables background position updates for always-on mesh presence -If denied, Bluetooth scanning will not function and your node will not report a position. +Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. ### Notifications Permission @@ -76,11 +76,27 @@ On supported devices, the app may request permission for critical alerts: - You can **skip** this step if you don't need breakthrough notifications - Configure or revoke later in Android notification settings +### Reviewing permissions later + +**Settings → Permissions** summarizes where every runtime permission stands. It reads _All allowed_ when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: + + Status | What tapping the row does | + ------------------------------------------- | -------------------------------------------------------------------------------------------- | + **Allowed** | Opens the system page, so you can review or revoke it | + **Not asked yet** | Requests it | + **Denied — tap to allow** | Explains what the permission is for, then asks again if you agree | + **Blocked — tap to open system settings** | Android will no longer show its dialog, so this opens the page where you can turn it back on | + **Not required on this version of Android** | Nothing — the permission does not exist on your device | + +This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to **Blocked** and sends you to the system settings page instead. + ## After Setup Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. -> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. +> 💡 **Tip:** If you skipped any permissions during setup, open **Settings → Permissions** in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. + +Features also ask in context. Tapping **Scan** on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ## What's Next? diff --git a/main/docs/el-rGR/user/connections.html b/main/docs/el-rGR/user/connections.html index 80e1986837..f2382d545d 100644 --- a/main/docs/el-rGR/user/connections.html +++ b/main/docs/el-rGR/user/connections.html @@ -29,7 +29,18 @@ Use the transport selector — a segmented button row below the connection card ![Transport selector](../../assets/screenshots/connections_transport_filters.png) -> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. +> 💡 **Tip:** If your device doesn't appear, check that the radio is not already connected to another device or out of range. + +The screen names anything on the app's side that is blocking a scan, with the fix attached: + + What you see | What it means | + --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + A card asking for **Nearby devices** | The permission has not been granted. **Grant permission** requests it; once Android stops prompting, the button becomes **Open settings**. | + **Bluetooth is off** | The adapter is disabled — the card opens Bluetooth settings. | + **Bluetooth scanning also needs location services** | Android 11 and older only: the permission is held but the system location toggle is off. | + No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | + +Tapping **Scan** after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. ### Connection Status diff --git a/main/docs/el-rGR/user/onboarding.html b/main/docs/el-rGR/user/onboarding.html index f89f89ccfe..879b7c6746 100644 --- a/main/docs/el-rGR/user/onboarding.html +++ b/main/docs/el-rGR/user/onboarding.html @@ -13,7 +13,7 @@ Welcome to Meshtastic! This guide walks you through the initial setup of the Mes ## First Launch -When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from **Settings → Permissions** inside the app. ### Welcome Screen @@ -42,7 +42,7 @@ Grant both permissions when prompted. Without Bluetooth, you'll need to use USB ### Location Permission -> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. +> ⚠️ **Is location required for Bluetooth?** On **Android 11 and older**, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of "Nearby devices", and system **Location Services** must also be switched on for a scan to return anything. There you will see **one** location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the "Don't ask again" checkbox on Android 10 and older). On **Android 12 and newer** the two are separate: "Nearby devices" is declared `neverForLocation`, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: @@ -55,7 +55,7 @@ Grant **"While using the app"** or **"Always"** depending on your preference: - **While using the app** — position updates only when the app is open - **Always** — enables background position updates for always-on mesh presence -If denied, Bluetooth scanning will not function and your node will not report a position. +Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. ### Notifications Permission @@ -76,11 +76,27 @@ On supported devices, the app may request permission for critical alerts: - You can **skip** this step if you don't need breakthrough notifications - Configure or revoke later in Android notification settings +### Reviewing permissions later + +**Settings → Permissions** summarizes where every runtime permission stands. It reads _All allowed_ when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: + + State | What tapping the row does | + ------------------------------------------- | -------------------------------------------------------------------------------------------- | + **Allowed** | Opens the system page, so you can review or revoke it | + **Not asked yet** | Requests it | + **Denied — tap to allow** | Explains what the permission is for, then asks again if you agree | + **Blocked — tap to open system settings** | Android will no longer show its dialog, so this opens the page where you can turn it back on | + **Not required on this version of Android** | Nothing — the permission does not exist on your device | + +This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to **Blocked** and sends you to the system settings page instead. + ## After Setup Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. -> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. +> 💡 **Tip:** If you skipped any permissions during setup, open **Settings → Permissions** in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. + +Features also ask in context. Tapping **Scan** on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ## What's Next? diff --git a/main/docs/es-rES/user/connections.html b/main/docs/es-rES/user/connections.html index 2b92a53f15..57bf0c1f66 100644 --- a/main/docs/es-rES/user/connections.html +++ b/main/docs/es-rES/user/connections.html @@ -29,7 +29,18 @@ Use the transport selector — a segmented button row below the connection card ![Transport selector](../../assets/screenshots/connections_transport_filters.png) -> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. +> 💡 **Tip:** If your device doesn't appear, check that the radio is not already connected to another device or out of range. + +The screen names anything on the app's side that is blocking a scan, with the fix attached: + + What you see | What it means | + --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + A card asking for **Nearby devices** | The permission has not been granted. **Grant permission** requests it; once Android stops prompting, the button becomes **Open settings**. | + **Bluetooth is off** | The adapter is disabled — the card opens Bluetooth settings. | + **Bluetooth scanning also needs location services** | Android 11 and older only: the permission is held but the system location toggle is off. | + No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | + +Tapping **Scan** after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. ### Connection Status diff --git a/main/docs/es-rES/user/onboarding.html b/main/docs/es-rES/user/onboarding.html index 4d9817e206..fe898b553b 100644 --- a/main/docs/es-rES/user/onboarding.html +++ b/main/docs/es-rES/user/onboarding.html @@ -13,7 +13,7 @@ Welcome to Meshtastic! This guide walks you through the initial setup of the Mes ## First Launch -When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from **Settings → Permissions** inside the app. ### Welcome Screen @@ -42,7 +42,7 @@ Grant both permissions when prompted. Without Bluetooth, you'll need to use USB ### Location Permission -> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. +> ⚠️ **Is location required for Bluetooth?** On **Android 11 and older**, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of "Nearby devices", and system **Location Services** must also be switched on for a scan to return anything. There you will see **one** location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the "Don't ask again" checkbox on Android 10 and older). On **Android 12 and newer** the two are separate: "Nearby devices" is declared `neverForLocation`, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: @@ -55,7 +55,7 @@ Grant **"While using the app"** or **"Always"** depending on your preference: - **While using the app** — position updates only when the app is open - **Always** — enables background position updates for always-on mesh presence -If denied, Bluetooth scanning will not function and your node will not report a position. +Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. ### Notifications Permission @@ -76,11 +76,27 @@ On supported devices, the app may request permission for critical alerts: - You can **skip** this step if you don't need breakthrough notifications - Configure or revoke later in Android notification settings +### Reviewing permissions later + +**Settings → Permissions** summarizes where every runtime permission stands. It reads _All allowed_ when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: + + State | What tapping the row does | + ------------------------------------------- | -------------------------------------------------------------------------------------------- | + **Allowed** | Opens the system page, so you can review or revoke it | + **Not asked yet** | Requests it | + **Denied — tap to allow** | Explains what the permission is for, then asks again if you agree | + **Blocked — tap to open system settings** | Android will no longer show its dialog, so this opens the page where you can turn it back on | + **Not required on this version of Android** | Nothing — the permission does not exist on your device | + +This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to **Blocked** and sends you to the system settings page instead. + ## After Setup Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. -> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. +> 💡 **Tip:** If you skipped any permissions during setup, open **Settings → Permissions** in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. + +Features also ask in context. Tapping **Scan** on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ## What's Next? diff --git a/main/docs/et-rEE/user/connections.html b/main/docs/et-rEE/user/connections.html index 471b0df872..530272f846 100644 --- a/main/docs/et-rEE/user/connections.html +++ b/main/docs/et-rEE/user/connections.html @@ -29,7 +29,18 @@ Sinihamba, võrgu ja USB-transpordi vahel vahetamiseks (üks on korraga aktiivne ![Transpordi valik](../../assets/screenshots/connections_transport_filters.png) -> 💡 **Vihje:** Kui sinu seadet ei kuvata, kontrolli, kas sinihamba ​​ja asukoha load on antud ning et raadio poleks juba teise seadmega ühendatud. +> 💡 **Tip:** If your device doesn't appear, check that the radio is not already connected to another device or out of range. + +The screen names anything on the app's side that is blocking a scan, with the fix attached: + + What you see | What it means | + --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + A card asking for **Nearby devices** | The permission has not been granted. **Grant permission** requests it; once Android stops prompting, the button becomes **Open settings**. | + **Bluetooth is off** | The adapter is disabled — the card opens Bluetooth settings. | + **Bluetooth scanning also needs location services** | Android 11 and older only: the permission is held but the system location toggle is off. | + No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | + +Tapping **Scan** after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. ### Ühenduse olek diff --git a/main/docs/et-rEE/user/onboarding.html b/main/docs/et-rEE/user/onboarding.html index 204da7c06b..ffa4dd556f 100644 --- a/main/docs/et-rEE/user/onboarding.html +++ b/main/docs/et-rEE/user/onboarding.html @@ -13,7 +13,7 @@ Tere tulemast Meshtasticusse! See juhend juhendab sind Meshtastic Androidi raken ## First Launch -Rakenduse esmakordsel avamisel juhendatakse sind sissejuhatavas voos, mis aitab konfigureerida olulisi õigusi ja sätteid. Iga sammu saab läbida järjekorras või võid selle vahele jätta ja õigused hiljem Androidi seadetes konfigureerida. +Rakenduse esmakordsel avamisel juhendatakse sind sissejuhatavas voos, mis aitab konfigureerida olulisi õigusi ja sätteid. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from **Settings → Permissions** inside the app. ### Tervituskuva @@ -42,7 +42,7 @@ Grant both permissions when prompted. Ilma sinihambata peate kasutama USB- või ### Asukoha luba -> ⚠️ **Miks on sinihamba ​​jaoks vaja asukohateavet?** Android vajab lähedalasuvate sinihamba madala energia seadmete avastamiseks asukohale juurdepääsu luba. See on Androidi süsteeminõue, mitte Meshtastic põhine valik. +> ⚠️ **Is location required for Bluetooth?** On **Android 11 and older**, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of "Nearby devices", and system **Location Services** must also be switched on for a scan to return anything. There you will see **one** location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the "Don't ask again" checkbox on Android 10 and older). On **Android 12 and newer** the two are separate: "Nearby devices" is declared `neverForLocation`, and declining Location does not stop you finding or connecting to a radio. Meshtastic kasutab sinu asukohta ka järgmiseks: @@ -55,7 +55,7 @@ Grant **"While using the app"** or **"Always"** depending on your preference: - **Rakenduse kasutamise ajal** – asukohta uuendatakse kui rakendus on avatud - **Alati** – lubab taustal asukoha värskendusi, et kärgvõrgu oleks alati sisse lülitatud -Kui keelatud, siis sinihamba otsing ei toimi ja sõlm ei edasta asukohta. +Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. ### Märguannete load @@ -76,11 +76,27 @@ On supported devices, the app may request permission for critical alerts: - Võid selle sammu **vahele jätta**, kui te kõrge prioriteediga märguandeid ei vaja - Seadistada või tühistada hiljem Androidi teavitusseadetes +### Reviewing permissions later + +**Settings → Permissions** summarizes where every runtime permission stands. It reads _All allowed_ when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: + + Olek | What tapping the row does | + ------------------------------------------- | -------------------------------------------------------------------------------------------- | + **Allowed** | Opens the system page, so you can review or revoke it | + **Not asked yet** | Requests it | + **Denied — tap to allow** | Explains what the permission is for, then asks again if you agree | + **Blocked — tap to open system settings** | Android will no longer show its dialog, so this opens the page where you can turn it back on | + **Not required on this version of Android** | Nothing — the permission does not exist on your device | + +This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to **Blocked** and sends you to the system settings page instead. + ## Peale seadistamist Kui load on antud, läheb rakendus üle põhiliidesele. Esimene samm peaks olema ühenduse loomine Meshtastic raadioga – üksikasjalike juhiste saamiseks vaata [Ühendused] (connections). -> 💡 **Vihje:** Kui jätsid seadistamise ajal mõne õiguse andmata, saad selle hiljem anda jaotises **Androidi seaded → Rakendused → Meshtastic → Load**. The app will prompt you again if a missing permission blocks a feature you try to use. +> 💡 **Tip:** If you skipped any permissions during setup, open **Settings → Permissions** in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. + +Features also ask in context. Tapping **Scan** on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ## What's Next? diff --git a/main/docs/fi-rFI/user/connections.html b/main/docs/fi-rFI/user/connections.html index 1374d873c1..f4f76e657d 100644 --- a/main/docs/fi-rFI/user/connections.html +++ b/main/docs/fi-rFI/user/connections.html @@ -29,7 +29,18 @@ Vaihda bluetooth-, verkko- ja USB-yhteyksien välillä käyttämällä yhteyskor ![Yhteysvalitsin](../../assets/screenshots/connections_transport_filters.png) -> 💡 **Vinkki:** Jos laitteesi ei näy, varmista että Bluetooth ja sijaintiluvat on myönnetty ja että radio ei ole jo yhdistettynä toiseen laitteeseen. +> 💡 **Vinkki:** Jos laitettasi ei näy, tarkista, ettei radio ole jo yhdistetty toiseen laitteeseen tai kantaman ulkopuolella. + +Näytössä kerrotaan kaikki sovelluksen puolella olevat syyt, jotka estävät haun, sekä niiden ratkaisut: + + Näet seuraavan | Mitä se tarkoittaa | + ------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + Kortti pyytää **Lähistön laitteet** -käyttöoikeutta | Käyttöoikeutta ei ole myönnetty. **Myönnä käyttöoikeus** pyytää sitä. Kun Android lakkaa kysymästä, painikkeeksi muuttuu **Avaa asetukset**. | + **Bluetooth on pois käytöstä** | Bluetooth-sovitin on poistettu käytöstä – kortti avaa Bluetooth-asetukset. | + **Bluetooth-laitteiden haku edellyttää myös sijaintipalvelujen käyttöä** | Vain Android 11:ssä ja vanhemmissa versioissa: käyttöoikeus on myönnetty, mutta järjestelmän sijaintipalvelut ovat pois käytöstä. | + Ei korttia, tyhjä luettelo | Mikään sovelluksen puolella ei estä hakua – radio on kantaman ulkopuolella, pois käytöstä tai jo yhdistetty toiseen laitteeseen. | + +Kun napautat **Hae** sen jälkeen, kun olet kerran hylännyt käyttöoikeuspyynnön, sovellus kertoo ensin, mihin käyttöoikeutta tarvitaan, ennen kuin pyytää sitä uudelleen. Näin voit myös kieltäytyä rauhassa ilman painostusta. ### Yhteyden tila diff --git a/main/docs/fi-rFI/user/onboarding.html b/main/docs/fi-rFI/user/onboarding.html index 62cd9c5312..36f011e7ba 100644 --- a/main/docs/fi-rFI/user/onboarding.html +++ b/main/docs/fi-rFI/user/onboarding.html @@ -13,7 +13,7 @@ Tervetuloa Meshtasticiin! Tämä opas opastaa sinut Meshtastic Android -sovelluk ## Ensimmäinen käynnistys -Kun avaat sovelluksen ensimmäistä kertaa, sinut ohjataan käyttöönottoprosessin läpi, joka auttaa määrittämään tarvittavat käyttöoikeudet ja asetukset. Voit suorittaa jokaisen vaiheen järjestyksessä tai ohittaa ne ja määrittää käyttöoikeudet myöhemmin Androidin asetuksissa. +Kun avaat sovelluksen ensimmäistä kertaa, sinut ohjataan käyttöönottoprosessin läpi, joka auttaa määrittämään tarvittavat käyttöoikeudet ja asetukset. Jokainen vaihe voidaan suorittaa järjestyksessä tai ohittaa – mikään niistä ei ole kertaluonteinen mahdollisuus. Kaikki käyttöoikeudet voidaan tarkistaa ja myöntää myöhemmin sovelluksen **Asetukset → Käyttöoikeudet** -kohdassa. ### Aloitusnäkymä @@ -42,7 +42,7 @@ Myönnä molemmat käyttöoikeudet pyydettäessä. Ilman Bluetoothia sinun on k ### Sijaintikäyttöoikeus -> ⚠️ **Miksi sijaintikäyttöoikeus tarvitaan Bluetoothille?** Android vaatii sijaintikäyttöoikeuden lähellä olevien Bluetooth Low Energy -laitteiden löytämiseen. Tämä on Android-järjestelmän vaatimus, eikä Meshtasticin erityinen valinta. +> ⚠️ **Tarvitaanko Bluetoothiin sijaintia?** Android 11:ssä ja sitä vanhemmissa versioissa kyllä. Niissä Bluetooth-laitteiden haku käsitellään sijaintiominaisuutena, joten sovellus pyytää **Lähistön laitteet** -käyttöoikeuden sijaan sijaintikäyttöoikeutta, ja myös **Sijaintipalvelut** on oltava käytössä, jotta haku toimii. Näissä versioissa Bluetooth-näytössä näkyy kaksi sijaan vain **yksi** sijaintikäyttöoikeuden vaihe, koska kyseessä on yksi järjestelmän käyttöoikeus. Sen pyytäminen kahdesti voisi johtaa siihen, että Android lakkaa näyttämästä käyttöoikeusikkunaa kokonaan (toisen hylkäyksen jälkeen Android 11:ssä tai "Älä kysy uudelleen" -valinnan jälkeen Android 10:ssä ja vanhemmissa versioissa). **Android 12:ssa ja uudemmissa versioissa** nämä ovat erillisiä: "Lähistön laitteet" on määritelty asetuksella `neverForLocation`, eikä sijaintikäyttöoikeuden hylkääminen estä radion löytämistä tai siihen yhdistämistä. Meshtastic käyttää sijaintiasi myös seuraaviin tarkoituksiin: @@ -55,7 +55,7 @@ Myönnä **"Sovelluksen käytön aikana"** tai **"Aina"** oman mieltymyksesi muk - **Sovelluksen käytön aikana** — sijainti päivittyy vain silloin, kun sovellus on avoinna - **Aina** — mahdollistaa sijainnin päivittämisen taustalla jatkuvaa verkon läsnäoloa varten -Jos käyttöoikeus evätään, Bluetooth-skannaus ei toimi eikä radiosi raportoi sijaintia. +Sijaintikäyttöoikeuden hylkääminen ei estä sovelluksen muuta toimintaa. Android 12:ssa ja uudemmissa versioissa Bluetooth toimii edelleen, ja vain kartta, sijainnin näyttäminen ja sijainnin jakaminen poistuvat käytöstä. Android 11:ssä ja sitä vanhemmissa versioissa myös Bluetooth-laitteiden haku lakkaa toimimasta, koska Android edellyttää siihen sijaintikäyttöoikeutta. ### Ilmoituskäyttöoikeus @@ -76,11 +76,27 @@ Tuetuilla laitteilla sovellus voi pyytää käyttöoikeutta kriittisiin hälytyk - Voit **ohittaa** tämän vaiheen, jos et tarvitse ilmoituksia, jotka ohittavat **Älä häiritse** -tilan - Voit määrittää tai peruuttaa tämän myöhemmin Androidin ilmoitusasetuksissa +### Käyttöoikeuksien tarkistaminen myöhemmin + +**Asetukset → Käyttöoikeudet** näyttää kaikkien käyttöaikaisten käyttöoikeuksien tilan. Kun mikään käyttöoikeus ei vaadi huomiotasi, siinä lukee _Kaikki sallittu_. Jos jokin käyttöoikeus vaatii huomiota, siinä näytetään niiden määrä, ja näkymä avautuu automaattisesti. Napauta riviä nähdäksesi koko luettelon milloin tahansa: + + Tila | Mitä rivin napauttaminen tekee | + ----------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | + **Sallittu** | Avaa järjestelmän sivun, jossa voit tarkistaa tai peruuttaa käyttöoikeuden | + **Ei kysytty vielä** | Pyytää sitä | + **Estetty - napauta salliaksesi** | Selittää, mihin käyttöoikeutta tarvitaan, ja pyytää sitä uudelleen, jos hyväksyt | + **Estetty - napauta avataksesi järjestelmäasetukset** | Android ei enää näytä käyttöoikeusikkunaa, joten tämä avaa sivun, jossa voit ottaa käyttöoikeuden uudelleen käyttöön | + **Ei tarvita tässä Android-versiossa** | Ei mitään – tätä käyttöoikeutta ei ole laitteessasi | + +Tämä koskee erityisesti ilmoituksia. Aiemmin sovellus pyysi tätä käyttöoikeutta vain yhdessä paikassa – käyttöönottovaiheessa – joten sen hylkääminen esti viesti-, uusi radio- ja akun alhaisen varaustason ilmoitukset, eikä sovellus voinut pyytää käyttöoikeutta uudelleen. Kun olet hylännyt käyttöoikeuspyynnön lopullisesti (Android 11:ssä ja uudemmissa versioissa toisen hylkäyksen jälkeen), Android ei enää näytä käyttöoikeusikkunaa. Tällöin tämä rivi muuttuu tilaan **Estetty** ja avaa sen sijaan järjestelmän asetussivun. + ## Määrityksen jälkeen Kun käyttöoikeudet on myönnetty, sovellus siirtyy pääkäyttöliittymään. Ensimmäinen toimenpiteesi pitäisi olla yhteyden muodostaminen Meshtastic-radioon — katso [Yhteydet](connections) yksityiskohtaisia ohjeita varten. -> 💡 **Vinkki:** Jos ohitit käyttöoikeuksia määrityksen aikana, voit myöntää ne myöhemmin kohdassa **Androidin asetukset → Sovellukset → Meshtastic → Käyttöoikeudet**. Sovellus pyytää sinulta uudelleen käyttöoikeutta, jos puuttuva käyttöoikeus estää käyttämästä ominaisuutta, jota yrität käyttää. +> 💡 **Vinkki:** Jos ohitit käyttöoikeuksia käyttöönottovaiheessa, avaa sovelluksessa **Asetukset → Käyttöoikeudet**. Kaikki käyttöaikaiset käyttöoikeudet näkyvät siellä nykyisessä tilassaan sekä linkkinä niiden hallintaan, mukaan lukien ilmoitukset, joita järjestelmä ei pyydä toista kertaa automaattisesti. + +Sovelluksen toiminnot pyytävät käyttöoikeuksia myös tarpeen mukaan. Kun **Yhteydet**-näytössä napautat **Hae** ilman Bluetooth-käyttöoikeutta, sovellus kertoo, mihin käyttöoikeutta tarvitaan, ja tarjoaa mahdollisuuden pyytää sitä. Kun Android ei enää näytä käyttöoikeusikkunaa, sama painike avaa sen sijaan järjestelmän asetussivun eikä jää toimettomaksi. ## Mitä seuraavaksi? diff --git a/main/docs/fr-rCA/user/connections.html b/main/docs/fr-rCA/user/connections.html index ed2e1058aa..3d81c38256 100644 --- a/main/docs/fr-rCA/user/connections.html +++ b/main/docs/fr-rCA/user/connections.html @@ -29,7 +29,18 @@ Use the transport selector — a segmented button row below the connection card ![Transport selector](../../assets/screenshots/connections_transport_filters.png) -> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. +> 💡 **Tip:** If your device doesn't appear, check that the radio is not already connected to another device or out of range. + +The screen names anything on the app's side that is blocking a scan, with the fix attached: + + What you see | What it means | + --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + A card asking for **Nearby devices** | The permission has not been granted. **Grant permission** requests it; once Android stops prompting, the button becomes **Open settings**. | + **Bluetooth is off** | The adapter is disabled — the card opens Bluetooth settings. | + **Bluetooth scanning also needs location services** | Android 11 and older only: the permission is held but the system location toggle is off. | + No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | + +Tapping **Scan** after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. ### Connection Status diff --git a/main/docs/fr-rCA/user/onboarding.html b/main/docs/fr-rCA/user/onboarding.html index 04b4247260..349805357d 100644 --- a/main/docs/fr-rCA/user/onboarding.html +++ b/main/docs/fr-rCA/user/onboarding.html @@ -13,7 +13,7 @@ Welcome to Meshtastic! This guide walks you through the initial setup of the Mes ## First Launch -When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from **Settings → Permissions** inside the app. ### Welcome Screen @@ -42,7 +42,7 @@ Grant both permissions when prompted. Without Bluetooth, you'll need to use USB ### Location Permission -> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. +> ⚠️ **Is location required for Bluetooth?** On **Android 11 and older**, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of "Nearby devices", and system **Location Services** must also be switched on for a scan to return anything. There you will see **one** location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the "Don't ask again" checkbox on Android 10 and older). On **Android 12 and newer** the two are separate: "Nearby devices" is declared `neverForLocation`, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: @@ -55,7 +55,7 @@ Grant **"While using the app"** or **"Always"** depending on your preference: - **While using the app** — position updates only when the app is open - **Always** — enables background position updates for always-on mesh presence -If denied, Bluetooth scanning will not function and your node will not report a position. +Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. ### Notifications Permission @@ -76,11 +76,27 @@ On supported devices, the app may request permission for critical alerts: - You can **skip** this step if you don't need breakthrough notifications - Configure or revoke later in Android notification settings +### Reviewing permissions later + +**Settings → Permissions** summarizes where every runtime permission stands. It reads _All allowed_ when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: + + State | What tapping the row does | + ------------------------------------------- | -------------------------------------------------------------------------------------------- | + **Allowed** | Opens the system page, so you can review or revoke it | + **Not asked yet** | Requests it | + **Denied — tap to allow** | Explains what the permission is for, then asks again if you agree | + **Blocked — tap to open system settings** | Android will no longer show its dialog, so this opens the page where you can turn it back on | + **Not required on this version of Android** | Nothing — the permission does not exist on your device | + +This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to **Blocked** and sends you to the system settings page instead. + ## After Setup Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. -> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. +> 💡 **Tip:** If you skipped any permissions during setup, open **Settings → Permissions** in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. + +Features also ask in context. Tapping **Scan** on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ## What's Next? diff --git a/main/docs/fr-rFR/user/connections.html b/main/docs/fr-rFR/user/connections.html index 9e612046dd..683159fe16 100644 --- a/main/docs/fr-rFR/user/connections.html +++ b/main/docs/fr-rFR/user/connections.html @@ -29,7 +29,18 @@ Use the transport selector — a segmented button row below the connection card ![Transport selector](../../assets/screenshots/connections_transport_filters.png) -> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. +> 💡 **Tip:** If your device doesn't appear, check that the radio is not already connected to another device or out of range. + +The screen names anything on the app's side that is blocking a scan, with the fix attached: + + What you see | What it means | + --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + A card asking for **Nearby devices** | The permission has not been granted. **Grant permission** requests it; once Android stops prompting, the button becomes **Open settings**. | + **Bluetooth is off** | The adapter is disabled — the card opens Bluetooth settings. | + **Bluetooth scanning also needs location services** | Android 11 and older only: the permission is held but the system location toggle is off. | + No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | + +Tapping **Scan** after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. ### Connection Status diff --git a/main/docs/fr-rFR/user/onboarding.html b/main/docs/fr-rFR/user/onboarding.html index bf715a4df8..39bd154342 100644 --- a/main/docs/fr-rFR/user/onboarding.html +++ b/main/docs/fr-rFR/user/onboarding.html @@ -13,7 +13,7 @@ Welcome to Meshtastic! This guide walks you through the initial setup of the Mes ## First Launch -When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from **Settings → Permissions** inside the app. ### Welcome Screen @@ -42,7 +42,7 @@ Grant both permissions when prompted. Without Bluetooth, you'll need to use USB ### Location Permission -> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. +> ⚠️ **Is location required for Bluetooth?** On **Android 11 and older**, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of "Nearby devices", and system **Location Services** must also be switched on for a scan to return anything. There you will see **one** location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the "Don't ask again" checkbox on Android 10 and older). On **Android 12 and newer** the two are separate: "Nearby devices" is declared `neverForLocation`, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: @@ -55,7 +55,7 @@ Grant **"While using the app"** or **"Always"** depending on your preference: - **While using the app** — position updates only when the app is open - **Always** — enables background position updates for always-on mesh presence -If denied, Bluetooth scanning will not function and your node will not report a position. +Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. ### Notifications Permission @@ -76,11 +76,27 @@ On supported devices, the app may request permission for critical alerts: - You can **skip** this step if you don't need breakthrough notifications - Configure or revoke later in Android notification settings +### Reviewing permissions later + +**Settings → Permissions** summarizes where every runtime permission stands. It reads _All allowed_ when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: + + State | What tapping the row does | + ------------------------------------------- | -------------------------------------------------------------------------------------------- | + **Allowed** | Opens the system page, so you can review or revoke it | + **Not asked yet** | Requests it | + **Denied — tap to allow** | Explains what the permission is for, then asks again if you agree | + **Blocked — tap to open system settings** | Android will no longer show its dialog, so this opens the page where you can turn it back on | + **Not required on this version of Android** | Nothing — the permission does not exist on your device | + +This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to **Blocked** and sends you to the system settings page instead. + ## After Setup Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. -> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. +> 💡 **Tip:** If you skipped any permissions during setup, open **Settings → Permissions** in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. + +Features also ask in context. Tapping **Scan** on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ## What's Next? diff --git a/main/docs/ga-rIE/user/connections.html b/main/docs/ga-rIE/user/connections.html index 01decf96a8..4c5a583d8d 100644 --- a/main/docs/ga-rIE/user/connections.html +++ b/main/docs/ga-rIE/user/connections.html @@ -29,7 +29,18 @@ Use the transport selector — a segmented button row below the connection card ![Transport selector](../../assets/screenshots/connections_transport_filters.png) -> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. +> 💡 **Tip:** If your device doesn't appear, check that the radio is not already connected to another device or out of range. + +The screen names anything on the app's side that is blocking a scan, with the fix attached: + + What you see | What it means | + --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + A card asking for **Nearby devices** | The permission has not been granted. **Grant permission** requests it; once Android stops prompting, the button becomes **Open settings**. | + **Bluetooth is off** | The adapter is disabled — the card opens Bluetooth settings. | + **Bluetooth scanning also needs location services** | Android 11 and older only: the permission is held but the system location toggle is off. | + No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | + +Tapping **Scan** after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. ### Connection Status diff --git a/main/docs/ga-rIE/user/onboarding.html b/main/docs/ga-rIE/user/onboarding.html index 3ae5ac0c6e..bc70b0c5e6 100644 --- a/main/docs/ga-rIE/user/onboarding.html +++ b/main/docs/ga-rIE/user/onboarding.html @@ -13,7 +13,7 @@ Welcome to Meshtastic! This guide walks you through the initial setup of the Mes ## First Launch -When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from **Settings → Permissions** inside the app. ### Welcome Screen @@ -42,7 +42,7 @@ Grant both permissions when prompted. Without Bluetooth, you'll need to use USB ### Location Permission -> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. +> ⚠️ **Is location required for Bluetooth?** On **Android 11 and older**, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of "Nearby devices", and system **Location Services** must also be switched on for a scan to return anything. There you will see **one** location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the "Don't ask again" checkbox on Android 10 and older). On **Android 12 and newer** the two are separate: "Nearby devices" is declared `neverForLocation`, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: @@ -55,7 +55,7 @@ Grant **"While using the app"** or **"Always"** depending on your preference: - **While using the app** — position updates only when the app is open - **Always** — enables background position updates for always-on mesh presence -If denied, Bluetooth scanning will not function and your node will not report a position. +Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. ### Notifications Permission @@ -76,11 +76,27 @@ On supported devices, the app may request permission for critical alerts: - You can **skip** this step if you don't need breakthrough notifications - Configure or revoke later in Android notification settings +### Reviewing permissions later + +**Settings → Permissions** summarizes where every runtime permission stands. It reads _All allowed_ when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: + + State | What tapping the row does | + ------------------------------------------- | -------------------------------------------------------------------------------------------- | + **Allowed** | Opens the system page, so you can review or revoke it | + **Not asked yet** | Requests it | + **Denied — tap to allow** | Explains what the permission is for, then asks again if you agree | + **Blocked — tap to open system settings** | Android will no longer show its dialog, so this opens the page where you can turn it back on | + **Not required on this version of Android** | Nothing — the permission does not exist on your device | + +This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to **Blocked** and sends you to the system settings page instead. + ## After Setup Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. -> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. +> 💡 **Tip:** If you skipped any permissions during setup, open **Settings → Permissions** in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. + +Features also ask in context. Tapping **Scan** on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ## What's Next? diff --git a/main/docs/gl-rES/user/connections.html b/main/docs/gl-rES/user/connections.html index d6b2bed962..99e8f42aba 100644 --- a/main/docs/gl-rES/user/connections.html +++ b/main/docs/gl-rES/user/connections.html @@ -29,7 +29,18 @@ Use the transport selector — a segmented button row below the connection card ![Transport selector](../../assets/screenshots/connections_transport_filters.png) -> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. +> 💡 **Tip:** If your device doesn't appear, check that the radio is not already connected to another device or out of range. + +The screen names anything on the app's side that is blocking a scan, with the fix attached: + + What you see | What it means | + --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + A card asking for **Nearby devices** | The permission has not been granted. **Grant permission** requests it; once Android stops prompting, the button becomes **Open settings**. | + **Bluetooth is off** | The adapter is disabled — the card opens Bluetooth settings. | + **Bluetooth scanning also needs location services** | Android 11 and older only: the permission is held but the system location toggle is off. | + No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | + +Tapping **Scan** after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. ### Connection Status diff --git a/main/docs/gl-rES/user/onboarding.html b/main/docs/gl-rES/user/onboarding.html index b8f2279a9d..92fd362285 100644 --- a/main/docs/gl-rES/user/onboarding.html +++ b/main/docs/gl-rES/user/onboarding.html @@ -13,7 +13,7 @@ Welcome to Meshtastic! This guide walks you through the initial setup of the Mes ## First Launch -When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from **Settings → Permissions** inside the app. ### Welcome Screen @@ -42,7 +42,7 @@ Grant both permissions when prompted. Without Bluetooth, you'll need to use USB ### Location Permission -> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. +> ⚠️ **Is location required for Bluetooth?** On **Android 11 and older**, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of "Nearby devices", and system **Location Services** must also be switched on for a scan to return anything. There you will see **one** location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the "Don't ask again" checkbox on Android 10 and older). On **Android 12 and newer** the two are separate: "Nearby devices" is declared `neverForLocation`, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: @@ -55,7 +55,7 @@ Grant **"While using the app"** or **"Always"** depending on your preference: - **While using the app** — position updates only when the app is open - **Always** — enables background position updates for always-on mesh presence -If denied, Bluetooth scanning will not function and your node will not report a position. +Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. ### Notifications Permission @@ -76,11 +76,27 @@ On supported devices, the app may request permission for critical alerts: - You can **skip** this step if you don't need breakthrough notifications - Configure or revoke later in Android notification settings +### Reviewing permissions later + +**Settings → Permissions** summarizes where every runtime permission stands. It reads _All allowed_ when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: + + State | What tapping the row does | + ------------------------------------------- | -------------------------------------------------------------------------------------------- | + **Allowed** | Opens the system page, so you can review or revoke it | + **Not asked yet** | Requests it | + **Denied — tap to allow** | Explains what the permission is for, then asks again if you agree | + **Blocked — tap to open system settings** | Android will no longer show its dialog, so this opens the page where you can turn it back on | + **Not required on this version of Android** | Nothing — the permission does not exist on your device | + +This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to **Blocked** and sends you to the system settings page instead. + ## After Setup Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. -> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. +> 💡 **Tip:** If you skipped any permissions during setup, open **Settings → Permissions** in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. + +Features also ask in context. Tapping **Scan** on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ## What's Next? diff --git a/main/docs/hr-rHR/user/connections.html b/main/docs/hr-rHR/user/connections.html index 4e5e043e41..b4a3fbef50 100644 --- a/main/docs/hr-rHR/user/connections.html +++ b/main/docs/hr-rHR/user/connections.html @@ -29,7 +29,18 @@ Use the transport selector — a segmented button row below the connection card ![Transport selector](../../assets/screenshots/connections_transport_filters.png) -> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. +> 💡 **Tip:** If your device doesn't appear, check that the radio is not already connected to another device or out of range. + +The screen names anything on the app's side that is blocking a scan, with the fix attached: + + What you see | What it means | + --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + A card asking for **Nearby devices** | The permission has not been granted. **Grant permission** requests it; once Android stops prompting, the button becomes **Open settings**. | + **Bluetooth is off** | The adapter is disabled — the card opens Bluetooth settings. | + **Bluetooth scanning also needs location services** | Android 11 and older only: the permission is held but the system location toggle is off. | + No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | + +Tapping **Scan** after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. ### Connection Status diff --git a/main/docs/hr-rHR/user/onboarding.html b/main/docs/hr-rHR/user/onboarding.html index e97bd0959a..4366a20f81 100644 --- a/main/docs/hr-rHR/user/onboarding.html +++ b/main/docs/hr-rHR/user/onboarding.html @@ -13,7 +13,7 @@ Welcome to Meshtastic! This guide walks you through the initial setup of the Mes ## First Launch -When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from **Settings → Permissions** inside the app. ### Welcome Screen @@ -42,7 +42,7 @@ Grant both permissions when prompted. Without Bluetooth, you'll need to use USB ### Location Permission -> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. +> ⚠️ **Is location required for Bluetooth?** On **Android 11 and older**, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of "Nearby devices", and system **Location Services** must also be switched on for a scan to return anything. There you will see **one** location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the "Don't ask again" checkbox on Android 10 and older). On **Android 12 and newer** the two are separate: "Nearby devices" is declared `neverForLocation`, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: @@ -55,7 +55,7 @@ Grant **"While using the app"** or **"Always"** depending on your preference: - **While using the app** — position updates only when the app is open - **Always** — enables background position updates for always-on mesh presence -If denied, Bluetooth scanning will not function and your node will not report a position. +Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. ### Notifications Permission @@ -76,11 +76,27 @@ On supported devices, the app may request permission for critical alerts: - You can **skip** this step if you don't need breakthrough notifications - Configure or revoke later in Android notification settings +### Reviewing permissions later + +**Settings → Permissions** summarizes where every runtime permission stands. It reads _All allowed_ when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: + + State | What tapping the row does | + ------------------------------------------- | -------------------------------------------------------------------------------------------- | + **Allowed** | Opens the system page, so you can review or revoke it | + **Not asked yet** | Requests it | + **Denied — tap to allow** | Explains what the permission is for, then asks again if you agree | + **Blocked — tap to open system settings** | Android will no longer show its dialog, so this opens the page where you can turn it back on | + **Not required on this version of Android** | Nothing — the permission does not exist on your device | + +This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to **Blocked** and sends you to the system settings page instead. + ## After Setup Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. -> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. +> 💡 **Tip:** If you skipped any permissions during setup, open **Settings → Permissions** in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. + +Features also ask in context. Tapping **Scan** on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ## What's Next? diff --git a/main/docs/ht-rHT/user/connections.html b/main/docs/ht-rHT/user/connections.html index 11cec1c123..a967166f97 100644 --- a/main/docs/ht-rHT/user/connections.html +++ b/main/docs/ht-rHT/user/connections.html @@ -29,7 +29,18 @@ Use the transport selector — a segmented button row below the connection card ![Transport selector](../../assets/screenshots/connections_transport_filters.png) -> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. +> 💡 **Tip:** If your device doesn't appear, check that the radio is not already connected to another device or out of range. + +The screen names anything on the app's side that is blocking a scan, with the fix attached: + + What you see | What it means | + --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + A card asking for **Nearby devices** | The permission has not been granted. **Grant permission** requests it; once Android stops prompting, the button becomes **Open settings**. | + **Bluetooth is off** | The adapter is disabled — the card opens Bluetooth settings. | + **Bluetooth scanning also needs location services** | Android 11 and older only: the permission is held but the system location toggle is off. | + No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | + +Tapping **Scan** after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. ### Connection Status diff --git a/main/docs/ht-rHT/user/onboarding.html b/main/docs/ht-rHT/user/onboarding.html index fb2a5378d9..52188998fa 100644 --- a/main/docs/ht-rHT/user/onboarding.html +++ b/main/docs/ht-rHT/user/onboarding.html @@ -13,7 +13,7 @@ Welcome to Meshtastic! This guide walks you through the initial setup of the Mes ## First Launch -When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from **Settings → Permissions** inside the app. ### Welcome Screen @@ -42,7 +42,7 @@ Grant both permissions when prompted. Without Bluetooth, you'll need to use USB ### Location Permission -> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. +> ⚠️ **Is location required for Bluetooth?** On **Android 11 and older**, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of "Nearby devices", and system **Location Services** must also be switched on for a scan to return anything. There you will see **one** location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the "Don't ask again" checkbox on Android 10 and older). On **Android 12 and newer** the two are separate: "Nearby devices" is declared `neverForLocation`, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: @@ -55,7 +55,7 @@ Grant **"While using the app"** or **"Always"** depending on your preference: - **While using the app** — position updates only when the app is open - **Always** — enables background position updates for always-on mesh presence -If denied, Bluetooth scanning will not function and your node will not report a position. +Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. ### Notifications Permission @@ -76,11 +76,27 @@ On supported devices, the app may request permission for critical alerts: - You can **skip** this step if you don't need breakthrough notifications - Configure or revoke later in Android notification settings +### Reviewing permissions later + +**Settings → Permissions** summarizes where every runtime permission stands. It reads _All allowed_ when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: + + State | What tapping the row does | + ------------------------------------------- | -------------------------------------------------------------------------------------------- | + **Allowed** | Opens the system page, so you can review or revoke it | + **Not asked yet** | Requests it | + **Denied — tap to allow** | Explains what the permission is for, then asks again if you agree | + **Blocked — tap to open system settings** | Android will no longer show its dialog, so this opens the page where you can turn it back on | + **Not required on this version of Android** | Nothing — the permission does not exist on your device | + +This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to **Blocked** and sends you to the system settings page instead. + ## After Setup Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. -> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. +> 💡 **Tip:** If you skipped any permissions during setup, open **Settings → Permissions** in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. + +Features also ask in context. Tapping **Scan** on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ## What's Next? diff --git a/main/docs/hu-rHU/user/connections.html b/main/docs/hu-rHU/user/connections.html index b74c019e34..e943a1c459 100644 --- a/main/docs/hu-rHU/user/connections.html +++ b/main/docs/hu-rHU/user/connections.html @@ -29,7 +29,18 @@ Use the transport selector — a segmented button row below the connection card ![Transport selector](../../assets/screenshots/connections_transport_filters.png) -> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. +> 💡 **Tip:** If your device doesn't appear, check that the radio is not already connected to another device or out of range. + +The screen names anything on the app's side that is blocking a scan, with the fix attached: + + What you see | What it means | + --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + A card asking for **Nearby devices** | The permission has not been granted. **Grant permission** requests it; once Android stops prompting, the button becomes **Open settings**. | + **Bluetooth is off** | The adapter is disabled — the card opens Bluetooth settings. | + **Bluetooth scanning also needs location services** | Android 11 and older only: the permission is held but the system location toggle is off. | + No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | + +Tapping **Scan** after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. ### Connection Status diff --git a/main/docs/hu-rHU/user/onboarding.html b/main/docs/hu-rHU/user/onboarding.html index 4d9d950029..6db0a99f62 100644 --- a/main/docs/hu-rHU/user/onboarding.html +++ b/main/docs/hu-rHU/user/onboarding.html @@ -13,7 +13,7 @@ Welcome to Meshtastic! This guide walks you through the initial setup of the Mes ## First Launch -When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from **Settings → Permissions** inside the app. ### Welcome Screen @@ -42,7 +42,7 @@ Grant both permissions when prompted. Without Bluetooth, you'll need to use USB ### Location Permission -> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. +> ⚠️ **Is location required for Bluetooth?** On **Android 11 and older**, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of "Nearby devices", and system **Location Services** must also be switched on for a scan to return anything. There you will see **one** location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the "Don't ask again" checkbox on Android 10 and older). On **Android 12 and newer** the two are separate: "Nearby devices" is declared `neverForLocation`, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: @@ -55,7 +55,7 @@ Grant **"While using the app"** or **"Always"** depending on your preference: - **While using the app** — position updates only when the app is open - **Always** — enables background position updates for always-on mesh presence -If denied, Bluetooth scanning will not function and your node will not report a position. +Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. ### Notifications Permission @@ -76,11 +76,27 @@ On supported devices, the app may request permission for critical alerts: - You can **skip** this step if you don't need breakthrough notifications - Configure or revoke later in Android notification settings +### Reviewing permissions later + +**Settings → Permissions** summarizes where every runtime permission stands. It reads _All allowed_ when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: + + State | What tapping the row does | + ------------------------------------------- | -------------------------------------------------------------------------------------------- | + **Allowed** | Opens the system page, so you can review or revoke it | + **Not asked yet** | Requests it | + **Denied — tap to allow** | Explains what the permission is for, then asks again if you agree | + **Blocked — tap to open system settings** | Android will no longer show its dialog, so this opens the page where you can turn it back on | + **Not required on this version of Android** | Nothing — the permission does not exist on your device | + +This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to **Blocked** and sends you to the system settings page instead. + ## After Setup Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. -> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. +> 💡 **Tip:** If you skipped any permissions during setup, open **Settings → Permissions** in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. + +Features also ask in context. Tapping **Scan** on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ## What's Next? diff --git a/main/docs/is-rIS/user/connections.html b/main/docs/is-rIS/user/connections.html index 31b90f1504..eb5aca7cb6 100644 --- a/main/docs/is-rIS/user/connections.html +++ b/main/docs/is-rIS/user/connections.html @@ -29,7 +29,18 @@ Use the transport selector — a segmented button row below the connection card ![Transport selector](../../assets/screenshots/connections_transport_filters.png) -> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. +> 💡 **Tip:** If your device doesn't appear, check that the radio is not already connected to another device or out of range. + +The screen names anything on the app's side that is blocking a scan, with the fix attached: + + What you see | What it means | + --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + A card asking for **Nearby devices** | The permission has not been granted. **Grant permission** requests it; once Android stops prompting, the button becomes **Open settings**. | + **Bluetooth is off** | The adapter is disabled — the card opens Bluetooth settings. | + **Bluetooth scanning also needs location services** | Android 11 and older only: the permission is held but the system location toggle is off. | + No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | + +Tapping **Scan** after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. ### Connection Status diff --git a/main/docs/is-rIS/user/onboarding.html b/main/docs/is-rIS/user/onboarding.html index 8b673905d2..0cb9fab9f6 100644 --- a/main/docs/is-rIS/user/onboarding.html +++ b/main/docs/is-rIS/user/onboarding.html @@ -13,7 +13,7 @@ Welcome to Meshtastic! This guide walks you through the initial setup of the Mes ## First Launch -When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from **Settings → Permissions** inside the app. ### Welcome Screen @@ -42,7 +42,7 @@ Grant both permissions when prompted. Without Bluetooth, you'll need to use USB ### Location Permission -> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. +> ⚠️ **Is location required for Bluetooth?** On **Android 11 and older**, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of "Nearby devices", and system **Location Services** must also be switched on for a scan to return anything. There you will see **one** location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the "Don't ask again" checkbox on Android 10 and older). On **Android 12 and newer** the two are separate: "Nearby devices" is declared `neverForLocation`, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: @@ -55,7 +55,7 @@ Grant **"While using the app"** or **"Always"** depending on your preference: - **While using the app** — position updates only when the app is open - **Always** — enables background position updates for always-on mesh presence -If denied, Bluetooth scanning will not function and your node will not report a position. +Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. ### Notifications Permission @@ -76,11 +76,27 @@ On supported devices, the app may request permission for critical alerts: - You can **skip** this step if you don't need breakthrough notifications - Configure or revoke later in Android notification settings +### Reviewing permissions later + +**Settings → Permissions** summarizes where every runtime permission stands. It reads _All allowed_ when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: + + State | What tapping the row does | + ------------------------------------------- | -------------------------------------------------------------------------------------------- | + **Allowed** | Opens the system page, so you can review or revoke it | + **Not asked yet** | Requests it | + **Denied — tap to allow** | Explains what the permission is for, then asks again if you agree | + **Blocked — tap to open system settings** | Android will no longer show its dialog, so this opens the page where you can turn it back on | + **Not required on this version of Android** | Nothing — the permission does not exist on your device | + +This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to **Blocked** and sends you to the system settings page instead. + ## After Setup Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. -> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. +> 💡 **Tip:** If you skipped any permissions during setup, open **Settings → Permissions** in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. + +Features also ask in context. Tapping **Scan** on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ## What's Next? diff --git a/main/docs/it-rIT/user/connections.html b/main/docs/it-rIT/user/connections.html index c21bd64a70..be10729dbf 100644 --- a/main/docs/it-rIT/user/connections.html +++ b/main/docs/it-rIT/user/connections.html @@ -29,7 +29,18 @@ Use the transport selector — a segmented button row below the connection card ![Transport selector](../../assets/screenshots/connections_transport_filters.png) -> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. +> 💡 **Tip:** If your device doesn't appear, check that the radio is not already connected to another device or out of range. + +The screen names anything on the app's side that is blocking a scan, with the fix attached: + + What you see | What it means | + --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + A card asking for **Nearby devices** | The permission has not been granted. **Grant permission** requests it; once Android stops prompting, the button becomes **Open settings**. | + **Bluetooth is off** | The adapter is disabled — the card opens Bluetooth settings. | + **Bluetooth scanning also needs location services** | Android 11 and older only: the permission is held but the system location toggle is off. | + No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | + +Tapping **Scan** after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. ### Connection Status diff --git a/main/docs/it-rIT/user/onboarding.html b/main/docs/it-rIT/user/onboarding.html index 56e145c55a..cfe2437574 100644 --- a/main/docs/it-rIT/user/onboarding.html +++ b/main/docs/it-rIT/user/onboarding.html @@ -13,7 +13,7 @@ Welcome to Meshtastic! This guide walks you through the initial setup of the Mes ## First Launch -When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from **Settings → Permissions** inside the app. ### Welcome Screen @@ -42,7 +42,7 @@ Grant both permissions when prompted. Without Bluetooth, you'll need to use USB ### Location Permission -> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. +> ⚠️ **Is location required for Bluetooth?** On **Android 11 and older**, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of "Nearby devices", and system **Location Services** must also be switched on for a scan to return anything. There you will see **one** location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the "Don't ask again" checkbox on Android 10 and older). On **Android 12 and newer** the two are separate: "Nearby devices" is declared `neverForLocation`, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: @@ -55,7 +55,7 @@ Grant **"While using the app"** or **"Always"** depending on your preference: - **While using the app** — position updates only when the app is open - **Always** — enables background position updates for always-on mesh presence -If denied, Bluetooth scanning will not function and your node will not report a position. +Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. ### Notifications Permission @@ -76,11 +76,27 @@ On supported devices, the app may request permission for critical alerts: - You can **skip** this step if you don't need breakthrough notifications - Configure or revoke later in Android notification settings +### Reviewing permissions later + +**Settings → Permissions** summarizes where every runtime permission stands. It reads _All allowed_ when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: + + State | What tapping the row does | + ------------------------------------------- | -------------------------------------------------------------------------------------------- | + **Allowed** | Opens the system page, so you can review or revoke it | + **Not asked yet** | Requests it | + **Denied — tap to allow** | Explains what the permission is for, then asks again if you agree | + **Blocked — tap to open system settings** | Android will no longer show its dialog, so this opens the page where you can turn it back on | + **Not required on this version of Android** | Nothing — the permission does not exist on your device | + +This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to **Blocked** and sends you to the system settings page instead. + ## After Setup Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. -> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. +> 💡 **Tip:** If you skipped any permissions during setup, open **Settings → Permissions** in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. + +Features also ask in context. Tapping **Scan** on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ## What's Next? diff --git a/main/docs/iw-rIL/user/connections.html b/main/docs/iw-rIL/user/connections.html index d1bea3f3bf..db500c041d 100644 --- a/main/docs/iw-rIL/user/connections.html +++ b/main/docs/iw-rIL/user/connections.html @@ -29,7 +29,18 @@ Use the transport selector — a segmented button row below the connection card ![Transport selector](../../assets/screenshots/connections_transport_filters.png) -> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. +> 💡 **Tip:** If your device doesn't appear, check that the radio is not already connected to another device or out of range. + +The screen names anything on the app's side that is blocking a scan, with the fix attached: + + What you see | What it means | + --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + A card asking for **Nearby devices** | The permission has not been granted. **Grant permission** requests it; once Android stops prompting, the button becomes **Open settings**. | + **Bluetooth is off** | The adapter is disabled — the card opens Bluetooth settings. | + **Bluetooth scanning also needs location services** | Android 11 and older only: the permission is held but the system location toggle is off. | + No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | + +Tapping **Scan** after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. ### Connection Status diff --git a/main/docs/iw-rIL/user/onboarding.html b/main/docs/iw-rIL/user/onboarding.html index 4eb76899d1..b952ab339c 100644 --- a/main/docs/iw-rIL/user/onboarding.html +++ b/main/docs/iw-rIL/user/onboarding.html @@ -13,7 +13,7 @@ Welcome to Meshtastic! This guide walks you through the initial setup of the Mes ## First Launch -When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from **Settings → Permissions** inside the app. ### Welcome Screen @@ -42,7 +42,7 @@ Grant both permissions when prompted. Without Bluetooth, you'll need to use USB ### Location Permission -> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. +> ⚠️ **Is location required for Bluetooth?** On **Android 11 and older**, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of "Nearby devices", and system **Location Services** must also be switched on for a scan to return anything. There you will see **one** location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the "Don't ask again" checkbox on Android 10 and older). On **Android 12 and newer** the two are separate: "Nearby devices" is declared `neverForLocation`, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: @@ -55,7 +55,7 @@ Grant **"While using the app"** or **"Always"** depending on your preference: - **While using the app** — position updates only when the app is open - **Always** — enables background position updates for always-on mesh presence -If denied, Bluetooth scanning will not function and your node will not report a position. +Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. ### Notifications Permission @@ -76,11 +76,27 @@ On supported devices, the app may request permission for critical alerts: - You can **skip** this step if you don't need breakthrough notifications - Configure or revoke later in Android notification settings +### Reviewing permissions later + +**Settings → Permissions** summarizes where every runtime permission stands. It reads _All allowed_ when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: + + State | What tapping the row does | + ------------------------------------------- | -------------------------------------------------------------------------------------------- | + **Allowed** | Opens the system page, so you can review or revoke it | + **Not asked yet** | Requests it | + **Denied — tap to allow** | Explains what the permission is for, then asks again if you agree | + **Blocked — tap to open system settings** | Android will no longer show its dialog, so this opens the page where you can turn it back on | + **Not required on this version of Android** | Nothing — the permission does not exist on your device | + +This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to **Blocked** and sends you to the system settings page instead. + ## After Setup Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. -> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. +> 💡 **Tip:** If you skipped any permissions during setup, open **Settings → Permissions** in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. + +Features also ask in context. Tapping **Scan** on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ## What's Next? diff --git a/main/docs/ja-rJP/user/connections.html b/main/docs/ja-rJP/user/connections.html index 84b177b36c..ba14059196 100644 --- a/main/docs/ja-rJP/user/connections.html +++ b/main/docs/ja-rJP/user/connections.html @@ -29,7 +29,18 @@ Bluetooth Low Energy は、Android で標準的かつ最も一般的な接続方 ![接続方式のセレクター](../../assets/screenshots/connections_transport_filters.png) -> 💡 **ヒント:** デバイスが表示されない場合は、Bluetooth と位置情報の権限が許可されているか、また無線機が別のデバイスにすでに接続されていないかを確認してください。 +> 💡 **Tip:** If your device doesn't appear, check that the radio is not already connected to another device or out of range. + +The screen names anything on the app's side that is blocking a scan, with the fix attached: + + What you see | 意味 | + --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + A card asking for **Nearby devices** | The permission has not been granted. **Grant permission** requests it; once Android stops prompting, the button becomes **Open settings**. | + **Bluetooth is off** | The adapter is disabled — the card opens Bluetooth settings. | + **Bluetooth scanning also needs location services** | Android 11 and older only: the permission is held but the system location toggle is off. | + No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | + +Tapping **Scan** after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. ### 接続ステータス diff --git a/main/docs/ja-rJP/user/onboarding.html b/main/docs/ja-rJP/user/onboarding.html index f19b7337de..4dae4b441d 100644 --- a/main/docs/ja-rJP/user/onboarding.html +++ b/main/docs/ja-rJP/user/onboarding.html @@ -13,7 +13,7 @@ Meshtastic へようこそ! このガイドでは、Meshtastic Android アプ ## 初回起動 -アプリを初めて開くと、必要な権限と設定を構成するための導入フローが案内されます。 各ステップは順番に完了することも、スキップして後で Android の設定で権限を構成することもできます。 +アプリを初めて開くと、必要な権限と設定を構成するための導入フローが案内されます。 Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from **Settings → Permissions** inside the app. ### ようこそ画面 @@ -42,7 +42,7 @@ Bluetooth は、スマートフォンと Meshtastic 無線機の主な接続方 ### 位置情報の権限 -> ⚠️ **なぜ Bluetooth に位置情報が必要なのですか?** Android では、近くの Bluetooth Low Energy デバイスを検出するために位置情報の権限が必要です。 これは Android システムの要件であり、Meshtastic 固有の仕様ではありません。 +> ⚠️ **Is location required for Bluetooth?** On **Android 11 and older**, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of "Nearby devices", and system **Location Services** must also be switched on for a scan to return anything. There you will see **one** location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the "Don't ask again" checkbox on Android 10 and older). On **Android 12 and newer** the two are separate: "Nearby devices" is declared `neverForLocation`, and declining Location does not stop you finding or connecting to a radio. Meshtastic は、次の目的でも位置情報を使用します: @@ -55,7 +55,7 @@ Meshtastic は、次の目的でも位置情報を使用します: - **アプリの使用中のみ**:アプリが開いているときだけ位置情報を更新します - **常に許可**:常時メッシュに存在するために、バックグラウンドでの位置情報更新を有効にします -拒否すると、Bluetooth スキャンが機能せず、ノードは位置情報を報告しません。 +Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. ### 通知の権限 @@ -76,11 +76,27 @@ Meshtastic は、次の目的でも位置情報を使用します: - 突破通知が不要な場合は、このステップを**スキップ**できます - 後で Android の通知設定で構成または取り消しができます +### Reviewing permissions later + +**Settings → Permissions** summarizes where every runtime permission stands. It reads _All allowed_ when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: + + 状態 | What tapping the row does | + ------------------------------------------- | -------------------------------------------------------------------------------------------- | + **Allowed** | Opens the system page, so you can review or revoke it | + **Not asked yet** | Requests it | + **Denied — tap to allow** | Explains what the permission is for, then asks again if you agree | + **Blocked — tap to open system settings** | Android will no longer show its dialog, so this opens the page where you can turn it back on | + **Not required on this version of Android** | Nothing — the permission does not exist on your device | + +This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to **Blocked** and sends you to the system settings page instead. + ## セットアップ後 権限を許可すると、アプリはメイン画面に移行します。 最初に行うべきことは、Meshtastic 無線機への接続です。詳しい手順は[接続](connections)を参照してください。 -> 💡 **ヒント:** セットアップ中に権限をスキップした場合は、後で\*\*「Android 設定 → アプリ → Meshtastic → 権限」\*\*から許可できます。 不足している権限が、使おうとする機能を妨げる場合は、アプリが再度確認を求めます。 +> 💡 **Tip:** If you skipped any permissions during setup, open **Settings → Permissions** in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. + +Features also ask in context. Tapping **Scan** on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ## 次のステップ diff --git a/main/docs/ko-rKR/user/connections.html b/main/docs/ko-rKR/user/connections.html index 096fcbfddd..0033fdb7be 100644 --- a/main/docs/ko-rKR/user/connections.html +++ b/main/docs/ko-rKR/user/connections.html @@ -29,7 +29,18 @@ Use the transport selector — a segmented button row below the connection card ![Transport selector](../../assets/screenshots/connections_transport_filters.png) -> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. +> 💡 **Tip:** If your device doesn't appear, check that the radio is not already connected to another device or out of range. + +The screen names anything on the app's side that is blocking a scan, with the fix attached: + + What you see | What it means | + --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + A card asking for **Nearby devices** | The permission has not been granted. **Grant permission** requests it; once Android stops prompting, the button becomes **Open settings**. | + **Bluetooth is off** | The adapter is disabled — the card opens Bluetooth settings. | + **Bluetooth scanning also needs location services** | Android 11 and older only: the permission is held but the system location toggle is off. | + No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | + +Tapping **Scan** after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. ### Connection Status diff --git a/main/docs/ko-rKR/user/onboarding.html b/main/docs/ko-rKR/user/onboarding.html index ba37be21f4..246a7becf2 100644 --- a/main/docs/ko-rKR/user/onboarding.html +++ b/main/docs/ko-rKR/user/onboarding.html @@ -13,7 +13,7 @@ Welcome to Meshtastic! This guide walks you through the initial setup of the Mes ## First Launch -When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from **Settings → Permissions** inside the app. ### Welcome Screen @@ -42,7 +42,7 @@ Grant both permissions when prompted. Without Bluetooth, you'll need to use USB ### Location Permission -> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. +> ⚠️ **Is location required for Bluetooth?** On **Android 11 and older**, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of "Nearby devices", and system **Location Services** must also be switched on for a scan to return anything. There you will see **one** location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the "Don't ask again" checkbox on Android 10 and older). On **Android 12 and newer** the two are separate: "Nearby devices" is declared `neverForLocation`, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: @@ -55,7 +55,7 @@ Grant **"While using the app"** or **"Always"** depending on your preference: - **While using the app** — position updates only when the app is open - **Always** — enables background position updates for always-on mesh presence -If denied, Bluetooth scanning will not function and your node will not report a position. +Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. ### Notifications Permission @@ -76,11 +76,27 @@ On supported devices, the app may request permission for critical alerts: - You can **skip** this step if you don't need breakthrough notifications - Configure or revoke later in Android notification settings +### Reviewing permissions later + +**Settings → Permissions** summarizes where every runtime permission stands. It reads _All allowed_ when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: + + State | What tapping the row does | + ------------------------------------------- | -------------------------------------------------------------------------------------------- | + **Allowed** | Opens the system page, so you can review or revoke it | + **Not asked yet** | Requests it | + **Denied — tap to allow** | Explains what the permission is for, then asks again if you agree | + **Blocked — tap to open system settings** | Android will no longer show its dialog, so this opens the page where you can turn it back on | + **Not required on this version of Android** | Nothing — the permission does not exist on your device | + +This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to **Blocked** and sends you to the system settings page instead. + ## After Setup Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. -> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. +> 💡 **Tip:** If you skipped any permissions during setup, open **Settings → Permissions** in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. + +Features also ask in context. Tapping **Scan** on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ## What's Next? diff --git a/main/docs/lt-rLT/user/connections.html b/main/docs/lt-rLT/user/connections.html index f263adb201..7123350684 100644 --- a/main/docs/lt-rLT/user/connections.html +++ b/main/docs/lt-rLT/user/connections.html @@ -29,7 +29,18 @@ Use the transport selector — a segmented button row below the connection card ![Transport selector](../../assets/screenshots/connections_transport_filters.png) -> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. +> 💡 **Tip:** If your device doesn't appear, check that the radio is not already connected to another device or out of range. + +The screen names anything on the app's side that is blocking a scan, with the fix attached: + + What you see | What it means | + --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + A card asking for **Nearby devices** | The permission has not been granted. **Grant permission** requests it; once Android stops prompting, the button becomes **Open settings**. | + **Bluetooth is off** | The adapter is disabled — the card opens Bluetooth settings. | + **Bluetooth scanning also needs location services** | Android 11 and older only: the permission is held but the system location toggle is off. | + No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | + +Tapping **Scan** after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. ### Connection Status diff --git a/main/docs/lt-rLT/user/onboarding.html b/main/docs/lt-rLT/user/onboarding.html index c8f54d06f7..8ac7f4e9a5 100644 --- a/main/docs/lt-rLT/user/onboarding.html +++ b/main/docs/lt-rLT/user/onboarding.html @@ -13,7 +13,7 @@ Welcome to Meshtastic! This guide walks you through the initial setup of the Mes ## First Launch -When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from **Settings → Permissions** inside the app. ### Welcome Screen @@ -42,7 +42,7 @@ Grant both permissions when prompted. Without Bluetooth, you'll need to use USB ### Location Permission -> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. +> ⚠️ **Is location required for Bluetooth?** On **Android 11 and older**, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of "Nearby devices", and system **Location Services** must also be switched on for a scan to return anything. There you will see **one** location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the "Don't ask again" checkbox on Android 10 and older). On **Android 12 and newer** the two are separate: "Nearby devices" is declared `neverForLocation`, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: @@ -55,7 +55,7 @@ Grant **"While using the app"** or **"Always"** depending on your preference: - **While using the app** — position updates only when the app is open - **Always** — enables background position updates for always-on mesh presence -If denied, Bluetooth scanning will not function and your node will not report a position. +Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. ### Notifications Permission @@ -76,11 +76,27 @@ On supported devices, the app may request permission for critical alerts: - You can **skip** this step if you don't need breakthrough notifications - Configure or revoke later in Android notification settings +### Reviewing permissions later + +**Settings → Permissions** summarizes where every runtime permission stands. It reads _All allowed_ when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: + + State | What tapping the row does | + ------------------------------------------- | -------------------------------------------------------------------------------------------- | + **Allowed** | Opens the system page, so you can review or revoke it | + **Not asked yet** | Requests it | + **Denied — tap to allow** | Explains what the permission is for, then asks again if you agree | + **Blocked — tap to open system settings** | Android will no longer show its dialog, so this opens the page where you can turn it back on | + **Not required on this version of Android** | Nothing — the permission does not exist on your device | + +This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to **Blocked** and sends you to the system settings page instead. + ## After Setup Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. -> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. +> 💡 **Tip:** If you skipped any permissions during setup, open **Settings → Permissions** in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. + +Features also ask in context. Tapping **Scan** on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ## What's Next? diff --git a/main/docs/nl-rNL/user/connections.html b/main/docs/nl-rNL/user/connections.html index 4d816c63da..870f8708f9 100644 --- a/main/docs/nl-rNL/user/connections.html +++ b/main/docs/nl-rNL/user/connections.html @@ -29,7 +29,18 @@ Use the transport selector — a segmented button row below the connection card ![Transport selector](../../assets/screenshots/connections_transport_filters.png) -> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. +> 💡 **Tip:** If your device doesn't appear, check that the radio is not already connected to another device or out of range. + +The screen names anything on the app's side that is blocking a scan, with the fix attached: + + What you see | What it means | + --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + A card asking for **Nearby devices** | The permission has not been granted. **Grant permission** requests it; once Android stops prompting, the button becomes **Open settings**. | + **Bluetooth is off** | The adapter is disabled — the card opens Bluetooth settings. | + **Bluetooth scanning also needs location services** | Android 11 and older only: the permission is held but the system location toggle is off. | + No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | + +Tapping **Scan** after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. ### Connection Status diff --git a/main/docs/nl-rNL/user/onboarding.html b/main/docs/nl-rNL/user/onboarding.html index 672131249f..3294eb1591 100644 --- a/main/docs/nl-rNL/user/onboarding.html +++ b/main/docs/nl-rNL/user/onboarding.html @@ -13,7 +13,7 @@ Welcome to Meshtastic! This guide walks you through the initial setup of the Mes ## First Launch -When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from **Settings → Permissions** inside the app. ### Welcome Screen @@ -42,7 +42,7 @@ Grant both permissions when prompted. Without Bluetooth, you'll need to use USB ### Location Permission -> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. +> ⚠️ **Is location required for Bluetooth?** On **Android 11 and older**, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of "Nearby devices", and system **Location Services** must also be switched on for a scan to return anything. There you will see **one** location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the "Don't ask again" checkbox on Android 10 and older). On **Android 12 and newer** the two are separate: "Nearby devices" is declared `neverForLocation`, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: @@ -55,7 +55,7 @@ Grant **"While using the app"** or **"Always"** depending on your preference: - **While using the app** — position updates only when the app is open - **Always** — enables background position updates for always-on mesh presence -If denied, Bluetooth scanning will not function and your node will not report a position. +Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. ### Notifications Permission @@ -76,11 +76,27 @@ On supported devices, the app may request permission for critical alerts: - You can **skip** this step if you don't need breakthrough notifications - Configure or revoke later in Android notification settings +### Reviewing permissions later + +**Settings → Permissions** summarizes where every runtime permission stands. It reads _All allowed_ when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: + + State | What tapping the row does | + ------------------------------------------- | -------------------------------------------------------------------------------------------- | + **Allowed** | Opens the system page, so you can review or revoke it | + **Not asked yet** | Requests it | + **Denied — tap to allow** | Explains what the permission is for, then asks again if you agree | + **Blocked — tap to open system settings** | Android will no longer show its dialog, so this opens the page where you can turn it back on | + **Not required on this version of Android** | Nothing — the permission does not exist on your device | + +This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to **Blocked** and sends you to the system settings page instead. + ## After Setup Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. -> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. +> 💡 **Tip:** If you skipped any permissions during setup, open **Settings → Permissions** in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. + +Features also ask in context. Tapping **Scan** on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ## What's Next? diff --git a/main/docs/no-rNO/user/connections.html b/main/docs/no-rNO/user/connections.html index aeab69867a..d6462c153b 100644 --- a/main/docs/no-rNO/user/connections.html +++ b/main/docs/no-rNO/user/connections.html @@ -29,7 +29,18 @@ Use the transport selector — a segmented button row below the connection card ![Transport selector](../../assets/screenshots/connections_transport_filters.png) -> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. +> 💡 **Tip:** If your device doesn't appear, check that the radio is not already connected to another device or out of range. + +The screen names anything on the app's side that is blocking a scan, with the fix attached: + + What you see | What it means | + --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + A card asking for **Nearby devices** | The permission has not been granted. **Grant permission** requests it; once Android stops prompting, the button becomes **Open settings**. | + **Bluetooth is off** | The adapter is disabled — the card opens Bluetooth settings. | + **Bluetooth scanning also needs location services** | Android 11 and older only: the permission is held but the system location toggle is off. | + No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | + +Tapping **Scan** after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. ### Connection Status diff --git a/main/docs/no-rNO/user/onboarding.html b/main/docs/no-rNO/user/onboarding.html index e34289d825..e9548920b3 100644 --- a/main/docs/no-rNO/user/onboarding.html +++ b/main/docs/no-rNO/user/onboarding.html @@ -13,7 +13,7 @@ Welcome to Meshtastic! This guide walks you through the initial setup of the Mes ## First Launch -When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from **Settings → Permissions** inside the app. ### Welcome Screen @@ -42,7 +42,7 @@ Grant both permissions when prompted. Without Bluetooth, you'll need to use USB ### Location Permission -> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. +> ⚠️ **Is location required for Bluetooth?** On **Android 11 and older**, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of "Nearby devices", and system **Location Services** must also be switched on for a scan to return anything. There you will see **one** location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the "Don't ask again" checkbox on Android 10 and older). On **Android 12 and newer** the two are separate: "Nearby devices" is declared `neverForLocation`, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: @@ -55,7 +55,7 @@ Grant **"While using the app"** or **"Always"** depending on your preference: - **While using the app** — position updates only when the app is open - **Always** — enables background position updates for always-on mesh presence -If denied, Bluetooth scanning will not function and your node will not report a position. +Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. ### Notifications Permission @@ -76,11 +76,27 @@ On supported devices, the app may request permission for critical alerts: - You can **skip** this step if you don't need breakthrough notifications - Configure or revoke later in Android notification settings +### Reviewing permissions later + +**Settings → Permissions** summarizes where every runtime permission stands. It reads _All allowed_ when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: + + State | What tapping the row does | + ------------------------------------------- | -------------------------------------------------------------------------------------------- | + **Allowed** | Opens the system page, so you can review or revoke it | + **Not asked yet** | Requests it | + **Denied — tap to allow** | Explains what the permission is for, then asks again if you agree | + **Blocked — tap to open system settings** | Android will no longer show its dialog, so this opens the page where you can turn it back on | + **Not required on this version of Android** | Nothing — the permission does not exist on your device | + +This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to **Blocked** and sends you to the system settings page instead. + ## After Setup Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. -> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. +> 💡 **Tip:** If you skipped any permissions during setup, open **Settings → Permissions** in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. + +Features also ask in context. Tapping **Scan** on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ## What's Next? diff --git a/main/docs/pl-rPL/user/connections.html b/main/docs/pl-rPL/user/connections.html index 2c77c8b271..d8d0a56bb3 100644 --- a/main/docs/pl-rPL/user/connections.html +++ b/main/docs/pl-rPL/user/connections.html @@ -29,7 +29,18 @@ Use the transport selector — a segmented button row below the connection card ![Transport selector](../../assets/screenshots/connections_transport_filters.png) -> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. +> 💡 **Tip:** If your device doesn't appear, check that the radio is not already connected to another device or out of range. + +The screen names anything on the app's side that is blocking a scan, with the fix attached: + + What you see | What it means | + --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + A card asking for **Nearby devices** | The permission has not been granted. **Grant permission** requests it; once Android stops prompting, the button becomes **Open settings**. | + **Bluetooth is off** | The adapter is disabled — the card opens Bluetooth settings. | + **Bluetooth scanning also needs location services** | Android 11 and older only: the permission is held but the system location toggle is off. | + No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | + +Tapping **Scan** after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. ### Connection Status diff --git a/main/docs/pl-rPL/user/onboarding.html b/main/docs/pl-rPL/user/onboarding.html index 61918ef4ee..eb29ed9b37 100644 --- a/main/docs/pl-rPL/user/onboarding.html +++ b/main/docs/pl-rPL/user/onboarding.html @@ -13,7 +13,7 @@ Welcome to Meshtastic! This guide walks you through the initial setup of the Mes ## First Launch -When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from **Settings → Permissions** inside the app. ### Welcome Screen @@ -42,7 +42,7 @@ Grant both permissions when prompted. Without Bluetooth, you'll need to use USB ### Location Permission -> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. +> ⚠️ **Is location required for Bluetooth?** On **Android 11 and older**, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of "Nearby devices", and system **Location Services** must also be switched on for a scan to return anything. There you will see **one** location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the "Don't ask again" checkbox on Android 10 and older). On **Android 12 and newer** the two are separate: "Nearby devices" is declared `neverForLocation`, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: @@ -55,7 +55,7 @@ Grant **"While using the app"** or **"Always"** depending on your preference: - **While using the app** — position updates only when the app is open - **Always** — enables background position updates for always-on mesh presence -If denied, Bluetooth scanning will not function and your node will not report a position. +Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. ### Notifications Permission @@ -76,11 +76,27 @@ On supported devices, the app may request permission for critical alerts: - You can **skip** this step if you don't need breakthrough notifications - Configure or revoke later in Android notification settings +### Reviewing permissions later + +**Settings → Permissions** summarizes where every runtime permission stands. It reads _All allowed_ when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: + + State | What tapping the row does | + ------------------------------------------- | -------------------------------------------------------------------------------------------- | + **Allowed** | Opens the system page, so you can review or revoke it | + **Not asked yet** | Requests it | + **Denied — tap to allow** | Explains what the permission is for, then asks again if you agree | + **Blocked — tap to open system settings** | Android will no longer show its dialog, so this opens the page where you can turn it back on | + **Not required on this version of Android** | Nothing — the permission does not exist on your device | + +This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to **Blocked** and sends you to the system settings page instead. + ## After Setup Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. -> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. +> 💡 **Tip:** If you skipped any permissions during setup, open **Settings → Permissions** in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. + +Features also ask in context. Tapping **Scan** on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ## What's Next? diff --git a/main/docs/pt-rBR/user/connections.html b/main/docs/pt-rBR/user/connections.html index 92368d9d12..daa74dcdb4 100644 --- a/main/docs/pt-rBR/user/connections.html +++ b/main/docs/pt-rBR/user/connections.html @@ -29,7 +29,18 @@ Use the transport selector — a segmented button row below the connection card ![Transport selector](../../assets/screenshots/connections_transport_filters.png) -> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. +> 💡 **Tip:** If your device doesn't appear, check that the radio is not already connected to another device or out of range. + +The screen names anything on the app's side that is blocking a scan, with the fix attached: + + What you see | What it means | + --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + A card asking for **Nearby devices** | The permission has not been granted. **Grant permission** requests it; once Android stops prompting, the button becomes **Open settings**. | + **Bluetooth is off** | The adapter is disabled — the card opens Bluetooth settings. | + **Bluetooth scanning also needs location services** | Android 11 and older only: the permission is held but the system location toggle is off. | + No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | + +Tapping **Scan** after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. ### Connection Status diff --git a/main/docs/pt-rBR/user/onboarding.html b/main/docs/pt-rBR/user/onboarding.html index f482d3325b..3788b2265a 100644 --- a/main/docs/pt-rBR/user/onboarding.html +++ b/main/docs/pt-rBR/user/onboarding.html @@ -13,7 +13,7 @@ Welcome to Meshtastic! This guide walks you through the initial setup of the Mes ## First Launch -When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from **Settings → Permissions** inside the app. ### Welcome Screen @@ -42,7 +42,7 @@ Grant both permissions when prompted. Without Bluetooth, you'll need to use USB ### Location Permission -> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. +> ⚠️ **Is location required for Bluetooth?** On **Android 11 and older**, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of "Nearby devices", and system **Location Services** must also be switched on for a scan to return anything. There you will see **one** location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the "Don't ask again" checkbox on Android 10 and older). On **Android 12 and newer** the two are separate: "Nearby devices" is declared `neverForLocation`, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: @@ -55,7 +55,7 @@ Grant **"While using the app"** or **"Always"** depending on your preference: - **While using the app** — position updates only when the app is open - **Always** — enables background position updates for always-on mesh presence -If denied, Bluetooth scanning will not function and your node will not report a position. +Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. ### Notifications Permission @@ -76,11 +76,27 @@ On supported devices, the app may request permission for critical alerts: - You can **skip** this step if you don't need breakthrough notifications - Configure or revoke later in Android notification settings +### Reviewing permissions later + +**Settings → Permissions** summarizes where every runtime permission stands. It reads _All allowed_ when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: + + State | What tapping the row does | + ------------------------------------------- | -------------------------------------------------------------------------------------------- | + **Allowed** | Opens the system page, so you can review or revoke it | + **Not asked yet** | Requests it | + **Denied — tap to allow** | Explains what the permission is for, then asks again if you agree | + **Blocked — tap to open system settings** | Android will no longer show its dialog, so this opens the page where you can turn it back on | + **Not required on this version of Android** | Nothing — the permission does not exist on your device | + +This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to **Blocked** and sends you to the system settings page instead. + ## After Setup Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. -> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. +> 💡 **Tip:** If you skipped any permissions during setup, open **Settings → Permissions** in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. + +Features also ask in context. Tapping **Scan** on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ## What's Next? diff --git a/main/docs/pt-rPT/user/connections.html b/main/docs/pt-rPT/user/connections.html index b67be2d5e3..7cb42c7253 100644 --- a/main/docs/pt-rPT/user/connections.html +++ b/main/docs/pt-rPT/user/connections.html @@ -29,7 +29,18 @@ Use the transport selector — a segmented button row below the connection card ![Transport selector](../../assets/screenshots/connections_transport_filters.png) -> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. +> 💡 **Tip:** If your device doesn't appear, check that the radio is not already connected to another device or out of range. + +The screen names anything on the app's side that is blocking a scan, with the fix attached: + + What you see | What it means | + --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + A card asking for **Nearby devices** | The permission has not been granted. **Grant permission** requests it; once Android stops prompting, the button becomes **Open settings**. | + **Bluetooth is off** | The adapter is disabled — the card opens Bluetooth settings. | + **Bluetooth scanning also needs location services** | Android 11 and older only: the permission is held but the system location toggle is off. | + No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | + +Tapping **Scan** after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. ### Connection Status diff --git a/main/docs/pt-rPT/user/onboarding.html b/main/docs/pt-rPT/user/onboarding.html index 4cce2cdb31..3c706da4a3 100644 --- a/main/docs/pt-rPT/user/onboarding.html +++ b/main/docs/pt-rPT/user/onboarding.html @@ -13,7 +13,7 @@ Welcome to Meshtastic! This guide walks you through the initial setup of the Mes ## First Launch -When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from **Settings → Permissions** inside the app. ### Welcome Screen @@ -42,7 +42,7 @@ Grant both permissions when prompted. Without Bluetooth, you'll need to use USB ### Location Permission -> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. +> ⚠️ **Is location required for Bluetooth?** On **Android 11 and older**, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of "Nearby devices", and system **Location Services** must also be switched on for a scan to return anything. There you will see **one** location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the "Don't ask again" checkbox on Android 10 and older). On **Android 12 and newer** the two are separate: "Nearby devices" is declared `neverForLocation`, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: @@ -55,7 +55,7 @@ Grant **"While using the app"** or **"Always"** depending on your preference: - **While using the app** — position updates only when the app is open - **Always** — enables background position updates for always-on mesh presence -If denied, Bluetooth scanning will not function and your node will not report a position. +Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. ### Notifications Permission @@ -76,11 +76,27 @@ On supported devices, the app may request permission for critical alerts: - You can **skip** this step if you don't need breakthrough notifications - Configure or revoke later in Android notification settings +### Reviewing permissions later + +**Settings → Permissions** summarizes where every runtime permission stands. It reads _All allowed_ when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: + + State | What tapping the row does | + ------------------------------------------- | -------------------------------------------------------------------------------------------- | + **Allowed** | Opens the system page, so you can review or revoke it | + **Not asked yet** | Requests it | + **Denied — tap to allow** | Explains what the permission is for, then asks again if you agree | + **Blocked — tap to open system settings** | Android will no longer show its dialog, so this opens the page where you can turn it back on | + **Not required on this version of Android** | Nothing — the permission does not exist on your device | + +This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to **Blocked** and sends you to the system settings page instead. + ## After Setup Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. -> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. +> 💡 **Tip:** If you skipped any permissions during setup, open **Settings → Permissions** in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. + +Features also ask in context. Tapping **Scan** on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ## What's Next? diff --git a/main/docs/ro-rRO/user/connections.html b/main/docs/ro-rRO/user/connections.html index 200413ddf1..def7ce92aa 100644 --- a/main/docs/ro-rRO/user/connections.html +++ b/main/docs/ro-rRO/user/connections.html @@ -29,7 +29,18 @@ Use the transport selector — a segmented button row below the connection card ![Transport selector](../../assets/screenshots/connections_transport_filters.png) -> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. +> 💡 **Tip:** If your device doesn't appear, check that the radio is not already connected to another device or out of range. + +The screen names anything on the app's side that is blocking a scan, with the fix attached: + + What you see | What it means | + --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + A card asking for **Nearby devices** | The permission has not been granted. **Grant permission** requests it; once Android stops prompting, the button becomes **Open settings**. | + **Bluetooth is off** | The adapter is disabled — the card opens Bluetooth settings. | + **Bluetooth scanning also needs location services** | Android 11 and older only: the permission is held but the system location toggle is off. | + No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | + +Tapping **Scan** after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. ### Connection Status diff --git a/main/docs/ro-rRO/user/onboarding.html b/main/docs/ro-rRO/user/onboarding.html index 0367d3a476..f05fbafcd6 100644 --- a/main/docs/ro-rRO/user/onboarding.html +++ b/main/docs/ro-rRO/user/onboarding.html @@ -13,7 +13,7 @@ Welcome to Meshtastic! This guide walks you through the initial setup of the Mes ## First Launch -When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from **Settings → Permissions** inside the app. ### Welcome Screen @@ -42,7 +42,7 @@ Grant both permissions when prompted. Without Bluetooth, you'll need to use USB ### Location Permission -> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. +> ⚠️ **Is location required for Bluetooth?** On **Android 11 and older**, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of "Nearby devices", and system **Location Services** must also be switched on for a scan to return anything. There you will see **one** location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the "Don't ask again" checkbox on Android 10 and older). On **Android 12 and newer** the two are separate: "Nearby devices" is declared `neverForLocation`, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: @@ -55,7 +55,7 @@ Grant **"While using the app"** or **"Always"** depending on your preference: - **While using the app** — position updates only when the app is open - **Always** — enables background position updates for always-on mesh presence -If denied, Bluetooth scanning will not function and your node will not report a position. +Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. ### Notifications Permission @@ -76,11 +76,27 @@ On supported devices, the app may request permission for critical alerts: - You can **skip** this step if you don't need breakthrough notifications - Configure or revoke later in Android notification settings +### Reviewing permissions later + +**Settings → Permissions** summarizes where every runtime permission stands. It reads _All allowed_ when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: + + State | What tapping the row does | + ------------------------------------------- | -------------------------------------------------------------------------------------------- | + **Allowed** | Opens the system page, so you can review or revoke it | + **Not asked yet** | Requests it | + **Denied — tap to allow** | Explains what the permission is for, then asks again if you agree | + **Blocked — tap to open system settings** | Android will no longer show its dialog, so this opens the page where you can turn it back on | + **Not required on this version of Android** | Nothing — the permission does not exist on your device | + +This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to **Blocked** and sends you to the system settings page instead. + ## After Setup Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. -> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. +> 💡 **Tip:** If you skipped any permissions during setup, open **Settings → Permissions** in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. + +Features also ask in context. Tapping **Scan** on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ## What's Next? diff --git a/main/docs/ru-rRU/user/connections.html b/main/docs/ru-rRU/user/connections.html index a42d3454da..f5270c80d1 100644 --- a/main/docs/ru-rRU/user/connections.html +++ b/main/docs/ru-rRU/user/connections.html @@ -29,7 +29,18 @@ Bluetooth Low Energy является наиболее распростране ![Селектор транспорта](../../assets/screenshots/connections_transport_filters.png) -> 💡 **Подсказка:** Если ваше радио Meshtastic не отображается, проверьте, предоставлены ли разрешения на Bluetooth и геолокацию, а также не подключено ли ваше радио к другому устройству. +> 💡 **Tip:** If your device doesn't appear, check that the radio is not already connected to another device or out of range. + +The screen names anything on the app's side that is blocking a scan, with the fix attached: + + What you see | Что это значит | + --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + A card asking for **Nearby devices** | The permission has not been granted. **Grant permission** requests it; once Android stops prompting, the button becomes **Open settings**. | + **Bluetooth is off** | The adapter is disabled — the card opens Bluetooth settings. | + **Bluetooth scanning also needs location services** | Android 11 and older only: the permission is held but the system location toggle is off. | + No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | + +Tapping **Scan** after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. ### Статус подключения diff --git a/main/docs/ru-rRU/user/onboarding.html b/main/docs/ru-rRU/user/onboarding.html index a27e2bd72f..2a4fba1f67 100644 --- a/main/docs/ru-rRU/user/onboarding.html +++ b/main/docs/ru-rRU/user/onboarding.html @@ -13,7 +13,7 @@ ## Первый запуск -Когда ты запускаешь приложение впервые, то будет предложено пройти через начальный процесс, который поможет настроить основные разрешения и параметры. Каждый шаг нужно выполнить по порядку, или же можешь пропустить его и настроить разрешения позже в настройках Android. +Когда ты запускаешь приложение впервые, то будет предложено пройти через начальный процесс, который поможет настроить основные разрешения и параметры. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from **Settings → Permissions** inside the app. ### Экран приветствия @@ -42,7 +42,7 @@ Bluetooth является основным методом соединения ### Разрешение на доступ к местоположению -> ⚠️ **Почему для Bluetooth требуется местоположение?** Android требует разрешение на определение местоположения для обнаружения устройств Bluetooth Low Energy поблизости. Это требование системы Android, а не специфический выбор Meshtastic. +> ⚠️ **Is location required for Bluetooth?** On **Android 11 and older**, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of "Nearby devices", and system **Location Services** must also be switched on for a scan to return anything. There you will see **one** location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the "Don't ask again" checkbox on Android 10 and older). On **Android 12 and newer** the two are separate: "Nearby devices" is declared `neverForLocation`, and declining Location does not stop you finding or connecting to a radio. Meshtastic также использует местоположение для: @@ -55,7 +55,7 @@ Meshtastic также использует местоположение для: - **При использовании приложения** — обновление местоположения происходит только когда приложение открыто - **Всегда** — включает обновления позиции в фоновом режиме для активного присутствия в сети -Если доступ будет запрещен, сканирование Bluetooth не будет работать, и нода не будет сообщать о положении. +Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. ### Разрешение на уведомления @@ -76,11 +76,27 @@ Meshtastic также использует местоположение для: - Вы можете **пропустить** этот шаг, если не нужны уведомления о прорывах - Настроить или отменить можно позже в настройках уведомлений Android +### Reviewing permissions later + +**Settings → Permissions** summarizes where every runtime permission stands. It reads _All allowed_ when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: + + Состояние | What tapping the row does | + ------------------------------------------- | -------------------------------------------------------------------------------------------- | + **Allowed** | Opens the system page, so you can review or revoke it | + **Not asked yet** | Requests it | + **Denied — tap to allow** | Explains what the permission is for, then asks again if you agree | + **Blocked — tap to open system settings** | Android will no longer show its dialog, so this opens the page where you can turn it back on | + **Not required on this version of Android** | Nothing — the permission does not exist on your device | + +This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to **Blocked** and sends you to the system settings page instead. + ## После настройки Как только разрешения предоставлены, приложение переходит к основному интерфейсу. Ваше первое действие должно заключаться в подключении к радиостанции Meshtastic — см. [Подключения](connections) для подробных инструкций. -> 💡 **Совет:** Если ты пропустил какие-либо разрешения во время настройки, то можешь выдать их позже через **Настройки Android → Приложения → Meshtastic → Разрешения**. Приложение снова запросит у тебя разрешение, если отсутствующее разрешение блокирует функцию, которую ты пытаешься использовать. +> 💡 **Tip:** If you skipped any permissions during setup, open **Settings → Permissions** in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. + +Features also ask in context. Tapping **Scan** on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ## Что дальше? diff --git a/main/docs/sk-rSK/user/connections.html b/main/docs/sk-rSK/user/connections.html index 9bb3f5befb..b507ea3c40 100644 --- a/main/docs/sk-rSK/user/connections.html +++ b/main/docs/sk-rSK/user/connections.html @@ -29,7 +29,18 @@ Use the transport selector — a segmented button row below the connection card ![Transport selector](../../assets/screenshots/connections_transport_filters.png) -> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. +> 💡 **Tip:** If your device doesn't appear, check that the radio is not already connected to another device or out of range. + +The screen names anything on the app's side that is blocking a scan, with the fix attached: + + What you see | What it means | + --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + A card asking for **Nearby devices** | The permission has not been granted. **Grant permission** requests it; once Android stops prompting, the button becomes **Open settings**. | + **Bluetooth is off** | The adapter is disabled — the card opens Bluetooth settings. | + **Bluetooth scanning also needs location services** | Android 11 and older only: the permission is held but the system location toggle is off. | + No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | + +Tapping **Scan** after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. ### Connection Status diff --git a/main/docs/sk-rSK/user/onboarding.html b/main/docs/sk-rSK/user/onboarding.html index f5bc159505..fdf298480d 100644 --- a/main/docs/sk-rSK/user/onboarding.html +++ b/main/docs/sk-rSK/user/onboarding.html @@ -13,7 +13,7 @@ Welcome to Meshtastic! This guide walks you through the initial setup of the Mes ## First Launch -When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from **Settings → Permissions** inside the app. ### Welcome Screen @@ -42,7 +42,7 @@ Grant both permissions when prompted. Without Bluetooth, you'll need to use USB ### Location Permission -> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. +> ⚠️ **Is location required for Bluetooth?** On **Android 11 and older**, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of "Nearby devices", and system **Location Services** must also be switched on for a scan to return anything. There you will see **one** location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the "Don't ask again" checkbox on Android 10 and older). On **Android 12 and newer** the two are separate: "Nearby devices" is declared `neverForLocation`, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: @@ -55,7 +55,7 @@ Grant **"While using the app"** or **"Always"** depending on your preference: - **While using the app** — position updates only when the app is open - **Always** — enables background position updates for always-on mesh presence -If denied, Bluetooth scanning will not function and your node will not report a position. +Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. ### Notifications Permission @@ -76,11 +76,27 @@ On supported devices, the app may request permission for critical alerts: - You can **skip** this step if you don't need breakthrough notifications - Configure or revoke later in Android notification settings +### Reviewing permissions later + +**Settings → Permissions** summarizes where every runtime permission stands. It reads _All allowed_ when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: + + State | What tapping the row does | + ------------------------------------------- | -------------------------------------------------------------------------------------------- | + **Allowed** | Opens the system page, so you can review or revoke it | + **Not asked yet** | Requests it | + **Denied — tap to allow** | Explains what the permission is for, then asks again if you agree | + **Blocked — tap to open system settings** | Android will no longer show its dialog, so this opens the page where you can turn it back on | + **Not required on this version of Android** | Nothing — the permission does not exist on your device | + +This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to **Blocked** and sends you to the system settings page instead. + ## After Setup Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. -> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. +> 💡 **Tip:** If you skipped any permissions during setup, open **Settings → Permissions** in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. + +Features also ask in context. Tapping **Scan** on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ## What's Next? diff --git a/main/docs/sl-rSI/user/connections.html b/main/docs/sl-rSI/user/connections.html index e713b1d960..fb1b8c686d 100644 --- a/main/docs/sl-rSI/user/connections.html +++ b/main/docs/sl-rSI/user/connections.html @@ -29,7 +29,18 @@ Use the transport selector — a segmented button row below the connection card ![Transport selector](../../assets/screenshots/connections_transport_filters.png) -> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. +> 💡 **Tip:** If your device doesn't appear, check that the radio is not already connected to another device or out of range. + +The screen names anything on the app's side that is blocking a scan, with the fix attached: + + What you see | What it means | + --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + A card asking for **Nearby devices** | The permission has not been granted. **Grant permission** requests it; once Android stops prompting, the button becomes **Open settings**. | + **Bluetooth is off** | The adapter is disabled — the card opens Bluetooth settings. | + **Bluetooth scanning also needs location services** | Android 11 and older only: the permission is held but the system location toggle is off. | + No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | + +Tapping **Scan** after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. ### Connection Status diff --git a/main/docs/sl-rSI/user/onboarding.html b/main/docs/sl-rSI/user/onboarding.html index bf337dda92..de97ec5589 100644 --- a/main/docs/sl-rSI/user/onboarding.html +++ b/main/docs/sl-rSI/user/onboarding.html @@ -13,7 +13,7 @@ Welcome to Meshtastic! This guide walks you through the initial setup of the Mes ## First Launch -When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from **Settings → Permissions** inside the app. ### Welcome Screen @@ -42,7 +42,7 @@ Grant both permissions when prompted. Without Bluetooth, you'll need to use USB ### Location Permission -> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. +> ⚠️ **Is location required for Bluetooth?** On **Android 11 and older**, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of "Nearby devices", and system **Location Services** must also be switched on for a scan to return anything. There you will see **one** location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the "Don't ask again" checkbox on Android 10 and older). On **Android 12 and newer** the two are separate: "Nearby devices" is declared `neverForLocation`, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: @@ -55,7 +55,7 @@ Grant **"While using the app"** or **"Always"** depending on your preference: - **While using the app** — position updates only when the app is open - **Always** — enables background position updates for always-on mesh presence -If denied, Bluetooth scanning will not function and your node will not report a position. +Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. ### Notifications Permission @@ -76,11 +76,27 @@ On supported devices, the app may request permission for critical alerts: - You can **skip** this step if you don't need breakthrough notifications - Configure or revoke later in Android notification settings +### Reviewing permissions later + +**Settings → Permissions** summarizes where every runtime permission stands. It reads _All allowed_ when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: + + State | What tapping the row does | + ------------------------------------------- | -------------------------------------------------------------------------------------------- | + **Allowed** | Opens the system page, so you can review or revoke it | + **Not asked yet** | Requests it | + **Denied — tap to allow** | Explains what the permission is for, then asks again if you agree | + **Blocked — tap to open system settings** | Android will no longer show its dialog, so this opens the page where you can turn it back on | + **Not required on this version of Android** | Nothing — the permission does not exist on your device | + +This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to **Blocked** and sends you to the system settings page instead. + ## After Setup Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. -> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. +> 💡 **Tip:** If you skipped any permissions during setup, open **Settings → Permissions** in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. + +Features also ask in context. Tapping **Scan** on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ## What's Next? diff --git a/main/docs/sq-rAL/user/connections.html b/main/docs/sq-rAL/user/connections.html index 4a96895796..259962c5e6 100644 --- a/main/docs/sq-rAL/user/connections.html +++ b/main/docs/sq-rAL/user/connections.html @@ -29,7 +29,18 @@ Use the transport selector — a segmented button row below the connection card ![Transport selector](../../assets/screenshots/connections_transport_filters.png) -> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. +> 💡 **Tip:** If your device doesn't appear, check that the radio is not already connected to another device or out of range. + +The screen names anything on the app's side that is blocking a scan, with the fix attached: + + What you see | What it means | + --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + A card asking for **Nearby devices** | The permission has not been granted. **Grant permission** requests it; once Android stops prompting, the button becomes **Open settings**. | + **Bluetooth is off** | The adapter is disabled — the card opens Bluetooth settings. | + **Bluetooth scanning also needs location services** | Android 11 and older only: the permission is held but the system location toggle is off. | + No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | + +Tapping **Scan** after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. ### Connection Status diff --git a/main/docs/sq-rAL/user/onboarding.html b/main/docs/sq-rAL/user/onboarding.html index 0203114ea3..301d4eebd8 100644 --- a/main/docs/sq-rAL/user/onboarding.html +++ b/main/docs/sq-rAL/user/onboarding.html @@ -13,7 +13,7 @@ Welcome to Meshtastic! This guide walks you through the initial setup of the Mes ## First Launch -When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from **Settings → Permissions** inside the app. ### Welcome Screen @@ -42,7 +42,7 @@ Grant both permissions when prompted. Without Bluetooth, you'll need to use USB ### Location Permission -> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. +> ⚠️ **Is location required for Bluetooth?** On **Android 11 and older**, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of "Nearby devices", and system **Location Services** must also be switched on for a scan to return anything. There you will see **one** location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the "Don't ask again" checkbox on Android 10 and older). On **Android 12 and newer** the two are separate: "Nearby devices" is declared `neverForLocation`, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: @@ -55,7 +55,7 @@ Grant **"While using the app"** or **"Always"** depending on your preference: - **While using the app** — position updates only when the app is open - **Always** — enables background position updates for always-on mesh presence -If denied, Bluetooth scanning will not function and your node will not report a position. +Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. ### Notifications Permission @@ -76,11 +76,27 @@ On supported devices, the app may request permission for critical alerts: - You can **skip** this step if you don't need breakthrough notifications - Configure or revoke later in Android notification settings +### Reviewing permissions later + +**Settings → Permissions** summarizes where every runtime permission stands. It reads _All allowed_ when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: + + State | What tapping the row does | + ------------------------------------------- | -------------------------------------------------------------------------------------------- | + **Allowed** | Opens the system page, so you can review or revoke it | + **Not asked yet** | Requests it | + **Denied — tap to allow** | Explains what the permission is for, then asks again if you agree | + **Blocked — tap to open system settings** | Android will no longer show its dialog, so this opens the page where you can turn it back on | + **Not required on this version of Android** | Nothing — the permission does not exist on your device | + +This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to **Blocked** and sends you to the system settings page instead. + ## After Setup Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. -> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. +> 💡 **Tip:** If you skipped any permissions during setup, open **Settings → Permissions** in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. + +Features also ask in context. Tapping **Scan** on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ## What's Next? diff --git a/main/docs/srp/user/connections.html b/main/docs/srp/user/connections.html index 0dc99e4031..eba21c7375 100644 --- a/main/docs/srp/user/connections.html +++ b/main/docs/srp/user/connections.html @@ -29,7 +29,18 @@ Use the transport selector — a segmented button row below the connection card ![Transport selector](../../assets/screenshots/connections_transport_filters.png) -> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. +> 💡 **Tip:** If your device doesn't appear, check that the radio is not already connected to another device or out of range. + +The screen names anything on the app's side that is blocking a scan, with the fix attached: + + What you see | What it means | + --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + A card asking for **Nearby devices** | The permission has not been granted. **Grant permission** requests it; once Android stops prompting, the button becomes **Open settings**. | + **Bluetooth is off** | The adapter is disabled — the card opens Bluetooth settings. | + **Bluetooth scanning also needs location services** | Android 11 and older only: the permission is held but the system location toggle is off. | + No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | + +Tapping **Scan** after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. ### Connection Status diff --git a/main/docs/srp/user/onboarding.html b/main/docs/srp/user/onboarding.html index d202fab45b..a424e9f197 100644 --- a/main/docs/srp/user/onboarding.html +++ b/main/docs/srp/user/onboarding.html @@ -13,7 +13,7 @@ Welcome to Meshtastic! This guide walks you through the initial setup of the Mes ## First Launch -When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from **Settings → Permissions** inside the app. ### Welcome Screen @@ -42,7 +42,7 @@ Grant both permissions when prompted. Without Bluetooth, you'll need to use USB ### Location Permission -> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. +> ⚠️ **Is location required for Bluetooth?** On **Android 11 and older**, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of "Nearby devices", and system **Location Services** must also be switched on for a scan to return anything. There you will see **one** location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the "Don't ask again" checkbox on Android 10 and older). On **Android 12 and newer** the two are separate: "Nearby devices" is declared `neverForLocation`, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: @@ -55,7 +55,7 @@ Grant **"While using the app"** or **"Always"** depending on your preference: - **While using the app** — position updates only when the app is open - **Always** — enables background position updates for always-on mesh presence -If denied, Bluetooth scanning will not function and your node will not report a position. +Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. ### Notifications Permission @@ -76,11 +76,27 @@ On supported devices, the app may request permission for critical alerts: - You can **skip** this step if you don't need breakthrough notifications - Configure or revoke later in Android notification settings +### Reviewing permissions later + +**Settings → Permissions** summarizes where every runtime permission stands. It reads _All allowed_ when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: + + State | What tapping the row does | + ------------------------------------------- | -------------------------------------------------------------------------------------------- | + **Allowed** | Opens the system page, so you can review or revoke it | + **Not asked yet** | Requests it | + **Denied — tap to allow** | Explains what the permission is for, then asks again if you agree | + **Blocked — tap to open system settings** | Android will no longer show its dialog, so this opens the page where you can turn it back on | + **Not required on this version of Android** | Nothing — the permission does not exist on your device | + +This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to **Blocked** and sends you to the system settings page instead. + ## After Setup Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. -> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. +> 💡 **Tip:** If you skipped any permissions during setup, open **Settings → Permissions** in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. + +Features also ask in context. Tapping **Scan** on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ## What's Next? diff --git a/main/docs/sv-rSE/user/connections.html b/main/docs/sv-rSE/user/connections.html index e964f05a4c..791033a900 100644 --- a/main/docs/sv-rSE/user/connections.html +++ b/main/docs/sv-rSE/user/connections.html @@ -29,7 +29,18 @@ Use the transport selector — a segmented button row below the connection card ![Transport selector](../../assets/screenshots/connections_transport_filters.png) -> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. +> 💡 **Tip:** If your device doesn't appear, check that the radio is not already connected to another device or out of range. + +The screen names anything on the app's side that is blocking a scan, with the fix attached: + + What you see | What it means | + --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + A card asking for **Nearby devices** | The permission has not been granted. **Grant permission** requests it; once Android stops prompting, the button becomes **Open settings**. | + **Bluetooth is off** | The adapter is disabled — the card opens Bluetooth settings. | + **Bluetooth scanning also needs location services** | Android 11 and older only: the permission is held but the system location toggle is off. | + No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | + +Tapping **Scan** after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. ### Connection Status diff --git a/main/docs/sv-rSE/user/onboarding.html b/main/docs/sv-rSE/user/onboarding.html index 5c9fd9fb88..f39a0325da 100644 --- a/main/docs/sv-rSE/user/onboarding.html +++ b/main/docs/sv-rSE/user/onboarding.html @@ -13,7 +13,7 @@ Welcome to Meshtastic! This guide walks you through the initial setup of the Mes ## First Launch -When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from **Settings → Permissions** inside the app. ### Welcome Screen @@ -42,7 +42,7 @@ Grant both permissions when prompted. Without Bluetooth, you'll need to use USB ### Location Permission -> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. +> ⚠️ **Is location required for Bluetooth?** On **Android 11 and older**, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of "Nearby devices", and system **Location Services** must also be switched on for a scan to return anything. There you will see **one** location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the "Don't ask again" checkbox on Android 10 and older). On **Android 12 and newer** the two are separate: "Nearby devices" is declared `neverForLocation`, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: @@ -55,7 +55,7 @@ Grant **"While using the app"** or **"Always"** depending on your preference: - **While using the app** — position updates only when the app is open - **Always** — enables background position updates for always-on mesh presence -If denied, Bluetooth scanning will not function and your node will not report a position. +Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. ### Notifications Permission @@ -76,11 +76,27 @@ On supported devices, the app may request permission for critical alerts: - You can **skip** this step if you don't need breakthrough notifications - Configure or revoke later in Android notification settings +### Reviewing permissions later + +**Settings → Permissions** summarizes where every runtime permission stands. It reads _All allowed_ when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: + + State | What tapping the row does | + ------------------------------------------- | -------------------------------------------------------------------------------------------- | + **Allowed** | Opens the system page, so you can review or revoke it | + **Not asked yet** | Requests it | + **Denied — tap to allow** | Explains what the permission is for, then asks again if you agree | + **Blocked — tap to open system settings** | Android will no longer show its dialog, so this opens the page where you can turn it back on | + **Not required on this version of Android** | Nothing — the permission does not exist on your device | + +This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to **Blocked** and sends you to the system settings page instead. + ## After Setup Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. -> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. +> 💡 **Tip:** If you skipped any permissions during setup, open **Settings → Permissions** in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. + +Features also ask in context. Tapping **Scan** on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ## What's Next? diff --git a/main/docs/tr-rTR/user/connections.html b/main/docs/tr-rTR/user/connections.html index 6f380efe30..2e066f47d1 100644 --- a/main/docs/tr-rTR/user/connections.html +++ b/main/docs/tr-rTR/user/connections.html @@ -29,7 +29,18 @@ Use the transport selector — a segmented button row below the connection card ![Transport selector](../../assets/screenshots/connections_transport_filters.png) -> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. +> 💡 **Tip:** If your device doesn't appear, check that the radio is not already connected to another device or out of range. + +The screen names anything on the app's side that is blocking a scan, with the fix attached: + + What you see | What it means | + --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + A card asking for **Nearby devices** | The permission has not been granted. **Grant permission** requests it; once Android stops prompting, the button becomes **Open settings**. | + **Bluetooth is off** | The adapter is disabled — the card opens Bluetooth settings. | + **Bluetooth scanning also needs location services** | Android 11 and older only: the permission is held but the system location toggle is off. | + No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | + +Tapping **Scan** after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. ### Connection Status diff --git a/main/docs/tr-rTR/user/onboarding.html b/main/docs/tr-rTR/user/onboarding.html index a827889d35..990f5c9a99 100644 --- a/main/docs/tr-rTR/user/onboarding.html +++ b/main/docs/tr-rTR/user/onboarding.html @@ -13,7 +13,7 @@ Welcome to Meshtastic! This guide walks you through the initial setup of the Mes ## First Launch -When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from **Settings → Permissions** inside the app. ### Welcome Screen @@ -42,7 +42,7 @@ Grant both permissions when prompted. Without Bluetooth, you'll need to use USB ### Location Permission -> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. +> ⚠️ **Is location required for Bluetooth?** On **Android 11 and older**, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of "Nearby devices", and system **Location Services** must also be switched on for a scan to return anything. There you will see **one** location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the "Don't ask again" checkbox on Android 10 and older). On **Android 12 and newer** the two are separate: "Nearby devices" is declared `neverForLocation`, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: @@ -55,7 +55,7 @@ Grant **"While using the app"** or **"Always"** depending on your preference: - **While using the app** — position updates only when the app is open - **Always** — enables background position updates for always-on mesh presence -If denied, Bluetooth scanning will not function and your node will not report a position. +Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. ### Notifications Permission @@ -76,11 +76,27 @@ On supported devices, the app may request permission for critical alerts: - You can **skip** this step if you don't need breakthrough notifications - Configure or revoke later in Android notification settings +### Reviewing permissions later + +**Settings → Permissions** summarizes where every runtime permission stands. It reads _All allowed_ when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: + + State | What tapping the row does | + ------------------------------------------- | -------------------------------------------------------------------------------------------- | + **Allowed** | Opens the system page, so you can review or revoke it | + **Not asked yet** | Requests it | + **Denied — tap to allow** | Explains what the permission is for, then asks again if you agree | + **Blocked — tap to open system settings** | Android will no longer show its dialog, so this opens the page where you can turn it back on | + **Not required on this version of Android** | Nothing — the permission does not exist on your device | + +This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to **Blocked** and sends you to the system settings page instead. + ## After Setup Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. -> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. +> 💡 **Tip:** If you skipped any permissions during setup, open **Settings → Permissions** in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. + +Features also ask in context. Tapping **Scan** on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ## What's Next? diff --git a/main/docs/uk-rUA/user/connections.html b/main/docs/uk-rUA/user/connections.html index 0b620ce2e1..37552fd4ea 100644 --- a/main/docs/uk-rUA/user/connections.html +++ b/main/docs/uk-rUA/user/connections.html @@ -29,7 +29,18 @@ Use the transport selector — a segmented button row below the connection card ![Transport selector](../../assets/screenshots/connections_transport_filters.png) -> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. +> 💡 **Tip:** If your device doesn't appear, check that the radio is not already connected to another device or out of range. + +The screen names anything on the app's side that is blocking a scan, with the fix attached: + + What you see | What it means | + --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + A card asking for **Nearby devices** | The permission has not been granted. **Grant permission** requests it; once Android stops prompting, the button becomes **Open settings**. | + **Bluetooth is off** | The adapter is disabled — the card opens Bluetooth settings. | + **Bluetooth scanning also needs location services** | Android 11 and older only: the permission is held but the system location toggle is off. | + No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | + +Tapping **Scan** after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. ### Connection Status diff --git a/main/docs/uk-rUA/user/onboarding.html b/main/docs/uk-rUA/user/onboarding.html index b556baf983..5f65a0b922 100644 --- a/main/docs/uk-rUA/user/onboarding.html +++ b/main/docs/uk-rUA/user/onboarding.html @@ -13,7 +13,7 @@ Welcome to Meshtastic! This guide walks you through the initial setup of the Mes ## First Launch -When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from **Settings → Permissions** inside the app. ### Welcome Screen @@ -42,7 +42,7 @@ Grant both permissions when prompted. Without Bluetooth, you'll need to use USB ### Location Permission -> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. +> ⚠️ **Is location required for Bluetooth?** On **Android 11 and older**, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of "Nearby devices", and system **Location Services** must also be switched on for a scan to return anything. There you will see **one** location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the "Don't ask again" checkbox on Android 10 and older). On **Android 12 and newer** the two are separate: "Nearby devices" is declared `neverForLocation`, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: @@ -55,7 +55,7 @@ Grant **"While using the app"** or **"Always"** depending on your preference: - **While using the app** — position updates only when the app is open - **Always** — enables background position updates for always-on mesh presence -If denied, Bluetooth scanning will not function and your node will not report a position. +Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. ### Notifications Permission @@ -76,11 +76,27 @@ On supported devices, the app may request permission for critical alerts: - You can **skip** this step if you don't need breakthrough notifications - Configure or revoke later in Android notification settings +### Reviewing permissions later + +**Settings → Permissions** summarizes where every runtime permission stands. It reads _All allowed_ when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: + + State | What tapping the row does | + ------------------------------------------- | -------------------------------------------------------------------------------------------- | + **Allowed** | Opens the system page, so you can review or revoke it | + **Not asked yet** | Requests it | + **Denied — tap to allow** | Explains what the permission is for, then asks again if you agree | + **Blocked — tap to open system settings** | Android will no longer show its dialog, so this opens the page where you can turn it back on | + **Not required on this version of Android** | Nothing — the permission does not exist on your device | + +This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to **Blocked** and sends you to the system settings page instead. + ## After Setup Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. -> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. +> 💡 **Tip:** If you skipped any permissions during setup, open **Settings → Permissions** in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. + +Features also ask in context. Tapping **Scan** on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ## What's Next? diff --git a/main/docs/zh-rCN/user/connections.html b/main/docs/zh-rCN/user/connections.html index 66d352b134..3590931bea 100644 --- a/main/docs/zh-rCN/user/connections.html +++ b/main/docs/zh-rCN/user/connections.html @@ -29,7 +29,18 @@ Use the transport selector — a segmented button row below the connection card ![Transport selector](../../assets/screenshots/connections_transport_filters.png) -> 💡 **Tip:** If your device doesn't appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device. +> 💡 **Tip:** If your device doesn't appear, check that the radio is not already connected to another device or out of range. + +The screen names anything on the app's side that is blocking a scan, with the fix attached: + + What you see | What it means | + --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + A card asking for **Nearby devices** | The permission has not been granted. **Grant permission** requests it; once Android stops prompting, the button becomes **Open settings**. | + **Bluetooth is off** | The adapter is disabled — the card opens Bluetooth settings. | + **Bluetooth scanning also needs location services** | Android 11 and older only: the permission is held but the system location toggle is off. | + No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | + +Tapping **Scan** after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. ### Connection Status diff --git a/main/docs/zh-rCN/user/onboarding.html b/main/docs/zh-rCN/user/onboarding.html index 79f362f163..9b0abd1cf6 100644 --- a/main/docs/zh-rCN/user/onboarding.html +++ b/main/docs/zh-rCN/user/onboarding.html @@ -13,7 +13,7 @@ Welcome to Meshtastic! This guide walks you through the initial setup of the Mes ## First Launch -When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from **Settings → Permissions** inside the app. ### Welcome Screen @@ -42,7 +42,7 @@ Grant both permissions when prompted. Without Bluetooth, you'll need to use USB ### Location Permission -> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. +> ⚠️ **Is location required for Bluetooth?** On **Android 11 and older**, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of "Nearby devices", and system **Location Services** must also be switched on for a scan to return anything. There you will see **one** location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the "Don't ask again" checkbox on Android 10 and older). On **Android 12 and newer** the two are separate: "Nearby devices" is declared `neverForLocation`, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: @@ -55,7 +55,7 @@ Grant **"While using the app"** or **"Always"** depending on your preference: - **While using the app** — position updates only when the app is open - **Always** — enables background position updates for always-on mesh presence -If denied, Bluetooth scanning will not function and your node will not report a position. +Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. ### Notifications Permission @@ -76,11 +76,27 @@ On supported devices, the app may request permission for critical alerts: - You can **skip** this step if you don't need breakthrough notifications - Configure or revoke later in Android notification settings +### Reviewing permissions later + +**Settings → Permissions** summarizes where every runtime permission stands. It reads _All allowed_ when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: + + State | What tapping the row does | + ------------------------------------------- | -------------------------------------------------------------------------------------------- | + **Allowed** | Opens the system page, so you can review or revoke it | + **Not asked yet** | Requests it | + **Denied — tap to allow** | Explains what the permission is for, then asks again if you agree | + **Blocked — tap to open system settings** | Android will no longer show its dialog, so this opens the page where you can turn it back on | + **Not required on this version of Android** | Nothing — the permission does not exist on your device | + +This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to **Blocked** and sends you to the system settings page instead. + ## After Setup Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. -> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. +> 💡 **Tip:** If you skipped any permissions during setup, open **Settings → Permissions** in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. + +Features also ask in context. Tapping **Scan** on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ## What's Next? diff --git a/main/docs/zh-rTW/user/connections.html b/main/docs/zh-rTW/user/connections.html index 659fbb767a..fb86d02600 100644 --- a/main/docs/zh-rTW/user/connections.html +++ b/main/docs/zh-rTW/user/connections.html @@ -29,7 +29,18 @@ Use the transport selector — a segmented button row below the connection card ![Transport selector](../../assets/screenshots/connections_transport_filters.png) -> 💡 提示:若裝置未顯示,請確認已授予藍牙與位置權限,且該無線電裝置尚未連接至其他裝置。 +> 💡 **Tip:** If your device doesn't appear, check that the radio is not already connected to another device or out of range. + +The screen names anything on the app's side that is blocking a scan, with the fix attached: + + What you see | 代表意義 | + --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | + A card asking for **Nearby devices** | The permission has not been granted. **Grant permission** requests it; once Android stops prompting, the button becomes **Open settings**. | + **Bluetooth is off** | The adapter is disabled — the card opens Bluetooth settings. | + **Bluetooth scanning also needs location services** | Android 11 and older only: the permission is held but the system location toggle is off. | + No card, empty list | Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere. | + +Tapping **Scan** after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered. ### 連線狀態 diff --git a/main/docs/zh-rTW/user/onboarding.html b/main/docs/zh-rTW/user/onboarding.html index bca306cbe0..1708060c5a 100644 --- a/main/docs/zh-rTW/user/onboarding.html +++ b/main/docs/zh-rTW/user/onboarding.html @@ -13,7 +13,7 @@ Welcome to Meshtastic! This guide walks you through the initial setup of the Mes ## First Launch -When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings. +When you open the app for the first time, you'll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from **Settings → Permissions** inside the app. ### Welcome Screen @@ -42,7 +42,7 @@ Grant both permissions when prompted. Without Bluetooth, you'll need to use USB ### Location Permission -> ⚠️ **Why is location required for Bluetooth?** Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice. +> ⚠️ **Is location required for Bluetooth?** On **Android 11 and older**, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of "Nearby devices", and system **Location Services** must also be switched on for a scan to return anything. There you will see **one** location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the "Don't ask again" checkbox on Android 10 and older). On **Android 12 and newer** the two are separate: "Nearby devices" is declared `neverForLocation`, and declining Location does not stop you finding or connecting to a radio. Meshtastic also uses your location for: @@ -55,7 +55,7 @@ Grant **"While using the app"** or **"Always"** depending on your preference: - **While using the app** — position updates only when the app is open - **Always** — enables background position updates for always-on mesh presence -If denied, Bluetooth scanning will not function and your node will not report a position. +Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind. ### Notifications Permission @@ -76,11 +76,27 @@ On supported devices, the app may request permission for critical alerts: - You can **skip** this step if you don't need breakthrough notifications - Configure or revoke later in Android notification settings +### Reviewing permissions later + +**Settings → Permissions** summarizes where every runtime permission stands. It reads _All allowed_ when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time: + + 狀態 | What tapping the row does | + ------------------------------------------- | -------------------------------------------------------------------------------------------- | + **Allowed** | Opens the system page, so you can review or revoke it | + **Not asked yet** | Requests it | + **Denied — tap to allow** | Explains what the permission is for, then asks again if you agree | + **Blocked — tap to open system settings** | Android will no longer show its dialog, so this opens the page where you can turn it back on | + **Not required on this version of Android** | Nothing — the permission does not exist on your device | + +This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to **Blocked** and sends you to the system settings page instead. + ## After Setup Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see [Connections](connections) for detailed instructions. -> 💡 **Tip:** If you skipped any permissions during setup, you can grant them later through **Android Settings → Apps → Meshtastic → Permissions**. The app will prompt you again if a missing permission blocks a feature you try to use. +> 💡 **Tip:** If you skipped any permissions during setup, open **Settings → Permissions** in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own. + +Features also ask in context. Tapping **Scan** on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing. ## What's Next? diff --git a/main/el-rGR/user/connections.html b/main/el-rGR/user/connections.html index 066b9b6b3b..d9efa9ed19 100644 --- a/main/el-rGR/user/connections.html +++ b/main/el-rGR/user/connections.html @@ -1 +1 @@ - Connections | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
🌐 Ελληνικά
Meshtastic Docs ↗

🌐 Ελληνικά — Community translation View in English

Connections

Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

Bluetooth (BLE)

Bluetooth Low Energy is the default and most common connection method on Android.

Pairing a Device

  1. Ensure your Meshtastic radio is powered on and in pairing mode.
  2. Open the app and navigate to the Connect tab.
  3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
  4. Select your device from the list.
  5. Accept the Bluetooth pairing prompt if shown.

Scanning for Bluetooth devices, with a discovered radio in the list

Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

Transport selector

💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device.

Connection Status

Icon State Περιγραφή
🟢 Connected Active radio link established
🟡 Connecting Handshake in progress
🔴 Αποσυνδεδεμένο No active connection
Not configured No device selected

When connecting, a status indicator shows the current connection state:

Connecting status

If no devices are found, the app shows an empty state with instructions:

No devices found

Troubleshooting Bluetooth

  • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
  • Connection drops: Move closer to the radio; check for interference.
  • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

USB Serial

USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

Setup

  1. Connect your radio via USB cable to your device.
  2. The app will prompt for USB permission — tap Allow.
  3. The connection is established automatically.

⚠️ Note: USB connections require OTG support on Android devices.

TCP/IP (Network)

Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

Connecting over the Network

  1. Make sure the radio is on the same local network as your phone/desktop.
  2. On the Connect screen, select Network in the transport selector.
  3. Choose the radio one of two ways:
    • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
    • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
  4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

When to Use TCP

  • Radio is on the same local network
  • Testing with a simulated radio
  • Environments where Bluetooth has interference issues

Reconnection Behavior

The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

To disconnect, tap the disconnect button on the Connect screen:

Disconnect from radio

Desktop Connections

On Desktop (Linux/macOS/Windows), the app supports:

  • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
  • USB Serial — primary wired connection method
  • TCP/IP — for network-connected radios

See Desktop App for platform-specific details and keyboard shortcuts.



+ Connections | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
🌐 Ελληνικά
Meshtastic Docs ↗

🌐 Ελληνικά — Community translation View in English

Connections

Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

Bluetooth (BLE)

Bluetooth Low Energy is the default and most common connection method on Android.

Pairing a Device

  1. Ensure your Meshtastic radio is powered on and in pairing mode.
  2. Open the app and navigate to the Connect tab.
  3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
  4. Select your device from the list.
  5. Accept the Bluetooth pairing prompt if shown.

Scanning for Bluetooth devices, with a discovered radio in the list

Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

Transport selector

💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range.

The screen names anything on the app’s side that is blocking a scan, with the fix attached:

What you see What it means
A card asking for Nearby devices The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings.
Bluetooth is off The adapter is disabled — the card opens Bluetooth settings.
Bluetooth scanning also needs location services Android 11 and older only: the permission is held but the system location toggle is off.
No card, empty list Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere.

Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered.

Connection Status

Icon State Περιγραφή
🟢 Connected Active radio link established
🟡 Connecting Handshake in progress
🔴 Αποσυνδεδεμένο No active connection
Not configured No device selected

When connecting, a status indicator shows the current connection state:

Connecting status

If no devices are found, the app shows an empty state with instructions:

No devices found

Troubleshooting Bluetooth

  • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
  • Connection drops: Move closer to the radio; check for interference.
  • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

USB Serial

USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

Setup

  1. Connect your radio via USB cable to your device.
  2. The app will prompt for USB permission — tap Allow.
  3. The connection is established automatically.

⚠️ Note: USB connections require OTG support on Android devices.

TCP/IP (Network)

Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

Connecting over the Network

  1. Make sure the radio is on the same local network as your phone/desktop.
  2. On the Connect screen, select Network in the transport selector.
  3. Choose the radio one of two ways:
    • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
    • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
  4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

When to Use TCP

  • Radio is on the same local network
  • Testing with a simulated radio
  • Environments where Bluetooth has interference issues

Reconnection Behavior

The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

To disconnect, tap the disconnect button on the Connect screen:

Disconnect from radio

Desktop Connections

On Desktop (Linux/macOS/Windows), the app supports:

  • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
  • USB Serial — primary wired connection method
  • TCP/IP — for network-connected radios

See Desktop App for platform-specific details and keyboard shortcuts.



diff --git a/main/el-rGR/user/onboarding.html b/main/el-rGR/user/onboarding.html index ba1f727a91..1d664b06f2 100644 --- a/main/el-rGR/user/onboarding.html +++ b/main/el-rGR/user/onboarding.html @@ -1 +1 @@ - Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
🌐 Ελληνικά
Meshtastic Docs ↗

🌐 Ελληνικά — Community translation View in English

Getting Started

Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

First Launch

When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings.

Welcome Screen

The welcome screen introduces Meshtastic and its core capabilities:

  • Off-grid mesh communication
  • No cellular or internet required
  • End-to-end encrypted messaging

Tap Get Started to proceed through the setup flow.

Welcome screen

Permissions

The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

Bluetooth Permission

Bluetooth is the primary connection method between your phone and Meshtastic radio:

  • Bluetooth scanning — discover nearby Meshtastic radios
  • Bluetooth connect — establish and maintain connections with paired radios

Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

Location Permission

⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice.

Meshtastic also uses your location for:

  • Showing your position on the mesh map
  • Calculating distances to other nodes
  • Sharing your GPS coordinates with other mesh members (if enabled)

Grant “While using the app” or “Always” depending on your preference:

  • While using the app — position updates only when the app is open
  • Always — enables background position updates for always-on mesh presence

If denied, Bluetooth scanning will not function and your node will not report a position.

Notifications Permission

Notifications alert you to:

  • Incoming messages from channels and direct messages
  • New nodes joining the mesh
  • Low battery on a remote node

💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

Critical Alerts Permission

On supported devices, the app may request permission for critical alerts:

  • These are high-priority notifications that can break through Do Not Disturb mode
  • Useful for emergency mesh alerts or urgent messages
  • You can skip this step if you don’t need breakthrough notifications
  • Configure or revoke later in Android notification settings

After Setup

Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use.

What’s Next?

Once connected to a radio, explore:

New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



+ Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
🌐 Ελληνικά
Meshtastic Docs ↗

🌐 Ελληνικά — Community translation View in English

Getting Started

Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

First Launch

When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app.

Welcome Screen

The welcome screen introduces Meshtastic and its core capabilities:

  • Off-grid mesh communication
  • No cellular or internet required
  • End-to-end encrypted messaging

Tap Get Started to proceed through the setup flow.

Welcome screen

Permissions

The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

Bluetooth Permission

Bluetooth is the primary connection method between your phone and Meshtastic radio:

  • Bluetooth scanning — discover nearby Meshtastic radios
  • Bluetooth connect — establish and maintain connections with paired radios

Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

Location Permission

⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio.

Meshtastic also uses your location for:

  • Showing your position on the mesh map
  • Calculating distances to other nodes
  • Sharing your GPS coordinates with other mesh members (if enabled)

Grant “While using the app” or “Always” depending on your preference:

  • While using the app — position updates only when the app is open
  • Always — enables background position updates for always-on mesh presence

Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind.

Notifications Permission

Notifications alert you to:

  • Incoming messages from channels and direct messages
  • New nodes joining the mesh
  • Low battery on a remote node

💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

Critical Alerts Permission

On supported devices, the app may request permission for critical alerts:

  • These are high-priority notifications that can break through Do Not Disturb mode
  • Useful for emergency mesh alerts or urgent messages
  • You can skip this step if you don’t need breakthrough notifications
  • Configure or revoke later in Android notification settings

Reviewing permissions later

Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time:

State What tapping the row does
Allowed Opens the system page, so you can review or revoke it
Not asked yet Requests it
Denied — tap to allow Explains what the permission is for, then asks again if you agree
Blocked — tap to open system settings Android will no longer show its dialog, so this opens the page where you can turn it back on
Not required on this version of Android Nothing — the permission does not exist on your device

This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead.

After Setup

Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own.

Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing.

What’s Next?

Once connected to a radio, explore:

New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



diff --git a/main/es-rES/user/connections.html b/main/es-rES/user/connections.html index 4f86bfeca9..628cbfe7fb 100644 --- a/main/es-rES/user/connections.html +++ b/main/es-rES/user/connections.html @@ -1 +1 @@ - Conexiones | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
🌐 Español
Meshtastic Docs ↗

🌐 Español — Community translation View in English

Conexiones

Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

Bluetooth (BLE)

Bluetooth Low Energy is the default and most common connection method on Android.

Pairing a Device

  1. Ensure your Meshtastic radio is powered on and in pairing mode.
  2. Open the app and navigate to the Connect tab.
  3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
  4. Select your device from the list.
  5. Accept the Bluetooth pairing prompt if shown.

Scanning for Bluetooth devices, with a discovered radio in the list

Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

Transport selector

💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device.

Connection Status

Icon State Descripción
🟢 Conectado Active radio link established
🟡 Conectando Handshake in progress
🔴 Desconectado No active connection
Not configured No device selected

When connecting, a status indicator shows the current connection state:

Connecting status

If no devices are found, the app shows an empty state with instructions:

No devices found

Troubleshooting Bluetooth

  • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
  • Connection drops: Move closer to the radio; check for interference.
  • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

USB Serial

USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

Setup

  1. Connect your radio via USB cable to your device.
  2. The app will prompt for USB permission — tap Allow.
  3. The connection is established automatically.

⚠️ Note: USB connections require OTG support on Android devices.

TCP/IP (Network)

Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

Connecting over the Network

  1. Make sure the radio is on the same local network as your phone/desktop.
  2. On the Connect screen, select Network in the transport selector.
  3. Choose the radio one of two ways:
    • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
    • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
  4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

When to Use TCP

  • Radio is on the same local network
  • Testing with a simulated radio
  • Environments where Bluetooth has interference issues

Reconnection Behavior

The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

To disconnect, tap the disconnect button on the Connect screen:

Disconnect from radio

Desktop Connections

On Desktop (Linux/macOS/Windows), the app supports:

  • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
  • USB Serial — primary wired connection method
  • TCP/IP — for network-connected radios

See Desktop App for platform-specific details and keyboard shortcuts.



+ Conexiones | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
🌐 Español
Meshtastic Docs ↗

🌐 Español — Community translation View in English

Conexiones

Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

Bluetooth (BLE)

Bluetooth Low Energy is the default and most common connection method on Android.

Pairing a Device

  1. Ensure your Meshtastic radio is powered on and in pairing mode.
  2. Open the app and navigate to the Connect tab.
  3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
  4. Select your device from the list.
  5. Accept the Bluetooth pairing prompt if shown.

Scanning for Bluetooth devices, with a discovered radio in the list

Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

Transport selector

💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range.

The screen names anything on the app’s side that is blocking a scan, with the fix attached:

What you see What it means
A card asking for Nearby devices The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings.
Bluetooth is off The adapter is disabled — the card opens Bluetooth settings.
Bluetooth scanning also needs location services Android 11 and older only: the permission is held but the system location toggle is off.
No card, empty list Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere.

Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered.

Connection Status

Icon State Descripción
🟢 Conectado Active radio link established
🟡 Conectando Handshake in progress
🔴 Desconectado No active connection
Not configured No device selected

When connecting, a status indicator shows the current connection state:

Connecting status

If no devices are found, the app shows an empty state with instructions:

No devices found

Troubleshooting Bluetooth

  • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
  • Connection drops: Move closer to the radio; check for interference.
  • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

USB Serial

USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

Setup

  1. Connect your radio via USB cable to your device.
  2. The app will prompt for USB permission — tap Allow.
  3. The connection is established automatically.

⚠️ Note: USB connections require OTG support on Android devices.

TCP/IP (Network)

Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

Connecting over the Network

  1. Make sure the radio is on the same local network as your phone/desktop.
  2. On the Connect screen, select Network in the transport selector.
  3. Choose the radio one of two ways:
    • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
    • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
  4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

When to Use TCP

  • Radio is on the same local network
  • Testing with a simulated radio
  • Environments where Bluetooth has interference issues

Reconnection Behavior

The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

To disconnect, tap the disconnect button on the Connect screen:

Disconnect from radio

Desktop Connections

On Desktop (Linux/macOS/Windows), the app supports:

  • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
  • USB Serial — primary wired connection method
  • TCP/IP — for network-connected radios

See Desktop App for platform-specific details and keyboard shortcuts.



diff --git a/main/es-rES/user/onboarding.html b/main/es-rES/user/onboarding.html index 2e54628163..622eb05af4 100644 --- a/main/es-rES/user/onboarding.html +++ b/main/es-rES/user/onboarding.html @@ -1 +1 @@ - Primeros Pasos | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
🌐 Español
Meshtastic Docs ↗

🌐 Español — Community translation View in English

Primeros Pasos

Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

First Launch

When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings.

Welcome Screen

The welcome screen introduces Meshtastic and its core capabilities:

  • Off-grid mesh communication
  • No cellular or internet required
  • End-to-end encrypted messaging

Tap Get Started to proceed through the setup flow.

Welcome screen

Permissions

The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

Bluetooth Permission

Bluetooth is the primary connection method between your phone and Meshtastic radio:

  • Bluetooth scanning — discover nearby Meshtastic radios
  • Bluetooth connect — establish and maintain connections with paired radios

Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

Location Permission

⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice.

Meshtastic also uses your location for:

  • Showing your position on the mesh map
  • Calculating distances to other nodes
  • Sharing your GPS coordinates with other mesh members (if enabled)

Grant “While using the app” or “Always” depending on your preference:

  • While using the app — position updates only when the app is open
  • Always — enables background position updates for always-on mesh presence

If denied, Bluetooth scanning will not function and your node will not report a position.

Notifications Permission

Notifications alert you to:

  • Incoming messages from channels and direct messages
  • New nodes joining the mesh
  • Low battery on a remote node

💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

Critical Alerts Permission

On supported devices, the app may request permission for critical alerts:

  • These are high-priority notifications that can break through Do Not Disturb mode
  • Useful for emergency mesh alerts or urgent messages
  • You can skip this step if you don’t need breakthrough notifications
  • Configure or revoke later in Android notification settings

After Setup

Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use.

What’s Next?

Once connected to a radio, explore:

New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



+ Primeros Pasos | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
🌐 Español
Meshtastic Docs ↗

🌐 Español — Community translation View in English

Primeros Pasos

Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

First Launch

When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app.

Welcome Screen

The welcome screen introduces Meshtastic and its core capabilities:

  • Off-grid mesh communication
  • No cellular or internet required
  • End-to-end encrypted messaging

Tap Get Started to proceed through the setup flow.

Welcome screen

Permissions

The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

Bluetooth Permission

Bluetooth is the primary connection method between your phone and Meshtastic radio:

  • Bluetooth scanning — discover nearby Meshtastic radios
  • Bluetooth connect — establish and maintain connections with paired radios

Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

Location Permission

⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio.

Meshtastic also uses your location for:

  • Showing your position on the mesh map
  • Calculating distances to other nodes
  • Sharing your GPS coordinates with other mesh members (if enabled)

Grant “While using the app” or “Always” depending on your preference:

  • While using the app — position updates only when the app is open
  • Always — enables background position updates for always-on mesh presence

Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind.

Notifications Permission

Notifications alert you to:

  • Incoming messages from channels and direct messages
  • New nodes joining the mesh
  • Low battery on a remote node

💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

Critical Alerts Permission

On supported devices, the app may request permission for critical alerts:

  • These are high-priority notifications that can break through Do Not Disturb mode
  • Useful for emergency mesh alerts or urgent messages
  • You can skip this step if you don’t need breakthrough notifications
  • Configure or revoke later in Android notification settings

Reviewing permissions later

Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time:

State What tapping the row does
Allowed Opens the system page, so you can review or revoke it
Not asked yet Requests it
Denied — tap to allow Explains what the permission is for, then asks again if you agree
Blocked — tap to open system settings Android will no longer show its dialog, so this opens the page where you can turn it back on
Not required on this version of Android Nothing — the permission does not exist on your device

This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead.

After Setup

Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own.

Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing.

What’s Next?

Once connected to a radio, explore:

New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



diff --git a/main/et-rEE/user/connections.html b/main/et-rEE/user/connections.html index d829d7269f..04ddb94093 100644 --- a/main/et-rEE/user/connections.html +++ b/main/et-rEE/user/connections.html @@ -1 +1 @@ - Ühendus | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
🌐 Eesti
Meshtastic Docs ↗

🌐 Eesti — Community translation View in English

Ühendus

Meshtastic toetab mitut transpordimeetodit telefoni/arvuti ja raadiosõlme vaheliseks suhtluseks.

Sinihammas (BLE)

Sinihamba madal voolutarve on Androidi vaike- ja levinuim ühendusviis.

Seadme sidumine

  1. Veendu, et Meshtastic seade on sisse lülitatud ja sidumisrežiimis.
  2. Ava rakendus ja navigeeri vahekaardile Ühendused.
  3. Puuduta valikut Otsi sinihamba seadmeid – kuvatakse lähedalasuvad Meshtasticu raadiod.
  4. Vali loendist oma seade.
  5. Nõustu Bluetoothi ​​sidumise taotlusega, kui see kuvatakse.

Sinihamba seadmete otsimine, leitud raadio on loendis

Sinihamba, võrgu ja USB-transpordi vahel vahetamiseks (üks on korraga aktiivne) kasutage transpordivalijat – ühenduskaardi all asuvat segmenteeritud nuppude rida:

Transpordi valik

💡 Vihje: Kui sinu seadet ei kuvata, kontrolli, kas sinihamba ​​ja asukoha load on antud ning et raadio poleks juba teise seadmega ühendatud.

Ühenduse olek

Ikoon Olek Kirjeldus
🟢 Ühendatud Aktiivne raadioside loodud
🟡 Ühendan Kätlemine on pooleli
🔴 Ühendus katkenud Aktiivset ühendust pole
Pole seadistatud Seadet pole valitud

Ühenduse loomisel näitab olekuindikaator ühenduse praegust olekut:

Ühenduse olek

Kui seadmeid ei leita, kuvab rakendus tühja oleku koos juhistega:

Ühtegi seadet ei leitud

Sinihamba veaotsing

  • Seadet ei leitud: Lülita sinihammas sisse/välja ja veendu, et asukoha määramine on lubatud.
  • Connection drops: Move closer to the radio; check for interference.
  • Sidumine tagasi lükatud: Unusta seade Androidi sinihamba ​​seadetes ja proovi uuesti.

USB port

USB ühendused pakuvad juhtmega alternatiivi, mis on kasulik lauaarvutite puhul või kui sinihammas pole saadaval.

Seadistamine

  1. Connect your radio via USB cable to your device.
  2. Rakendus küsib USB luba – puuduta Luba.
  3. The connection is established automatically.

⚠️ Märkus: USB ühenduste jaoks on Android-seadmetes vaja OTG tuge.

TCP/IP (võrk)

Mõned Meshtastic raadiod toetavad WiFi/Etherneti ühendust, võimaldades TCP-põhiseid ühendusi kohaliku võrgu kaudu. Ühenda raadio esmalt oma võrku – kasutades raadio enda WiFi-seadeid (püsivara veebiliidese või muu ühenduse kaudu) – ja seejärel loo ühendus rakenduse kaudu.

Connecting over the Network

  1. Veendu, et raadio on samas kohtvõrgus kui sinu telefon/lauaarvuti.
  2. Valige ühenduse loomise ekraanil transpordivalikus Võrk.
  3. Choose the radio one of two ways:
    • Võrguseadmete otsimine – lülita see sisse, et automaatselt avastada raadioid, mis reklaamivad end kohalikus võrgus (mDNS / _meshtastic._tcp). Leitud seadmed kuvatakse loendis; ühenduse loomiseks puuduta neist ühte.
    • Lisa seade käsitsi… — Sisesta raadio IP-aadress (või hostinimi) ja port (vaikimisi: 4403).
  4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

💡 Vihje: Võrgu tuvastamine kasutab mDNS-i, mis töötab ainult siis, kui mõlemad seadmed on samas alamvõrgus. Android 17+ puhul vajab rakendus skanniks kohaliku võrgu luba; kui otsing ei leia midagi, lisa seade käsitsi IP-aadressi järgi.

Millal kasutada TCP

  • Raadio on samas kohalikus võrgus
  • Testing with a simulated radio
  • Asukohad kus sinihambal on häireid

Reconnection Behavior

Rakendus loob käivitamisel uuesti ühenduse viimati valitud seadmega. Transporti saab ühenduskuvalt igal ajal vahetada.

Ühenduse katkestamiseks puuduta ühenduse loomise ekraanil katkestamise nuppu:

Katkesta ühendus raadioga

Desktop Connections

On Desktop (Linux/macOS/Windows), the app supports:

  • Sinihammas (BLE) — Kable’i teegi kaudu; töötab macOS-is, Linuxis ja Windowsis
  • USB port – peamine juhtmega ühendusmeetod
  • TCP/IP – võrguühendusega raadiote jaoks

Platvormipõhiste üksikasjade ja kiirklahvide kohta vaata [Töölauarakendus] (desktop).

Seotud teemad



+ Ühendus | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
🌐 Eesti
Meshtastic Docs ↗

🌐 Eesti — Community translation View in English

Ühendus

Meshtastic toetab mitut transpordimeetodit telefoni/arvuti ja raadiosõlme vaheliseks suhtluseks.

Sinihammas (BLE)

Sinihamba madal voolutarve on Androidi vaike- ja levinuim ühendusviis.

Seadme sidumine

  1. Veendu, et Meshtastic seade on sisse lülitatud ja sidumisrežiimis.
  2. Ava rakendus ja navigeeri vahekaardile Ühendused.
  3. Puuduta valikut Otsi sinihamba seadmeid – kuvatakse lähedalasuvad Meshtasticu raadiod.
  4. Vali loendist oma seade.
  5. Nõustu Bluetoothi ​​sidumise taotlusega, kui see kuvatakse.

Sinihamba seadmete otsimine, leitud raadio on loendis

Sinihamba, võrgu ja USB-transpordi vahel vahetamiseks (üks on korraga aktiivne) kasutage transpordivalijat – ühenduskaardi all asuvat segmenteeritud nuppude rida:

Transpordi valik

💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range.

The screen names anything on the app’s side that is blocking a scan, with the fix attached:

What you see What it means
A card asking for Nearby devices The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings.
Bluetooth is off The adapter is disabled — the card opens Bluetooth settings.
Bluetooth scanning also needs location services Android 11 and older only: the permission is held but the system location toggle is off.
No card, empty list Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere.

Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered.

Ühenduse olek

Ikoon Olek Kirjeldus
🟢 Ühendatud Aktiivne raadioside loodud
🟡 Ühendan Kätlemine on pooleli
🔴 Ühendus katkenud Aktiivset ühendust pole
Pole seadistatud Seadet pole valitud

Ühenduse loomisel näitab olekuindikaator ühenduse praegust olekut:

Ühenduse olek

Kui seadmeid ei leita, kuvab rakendus tühja oleku koos juhistega:

Ühtegi seadet ei leitud

Sinihamba veaotsing

  • Seadet ei leitud: Lülita sinihammas sisse/välja ja veendu, et asukoha määramine on lubatud.
  • Connection drops: Move closer to the radio; check for interference.
  • Sidumine tagasi lükatud: Unusta seade Androidi sinihamba ​​seadetes ja proovi uuesti.

USB port

USB ühendused pakuvad juhtmega alternatiivi, mis on kasulik lauaarvutite puhul või kui sinihammas pole saadaval.

Seadistamine

  1. Connect your radio via USB cable to your device.
  2. Rakendus küsib USB luba – puuduta Luba.
  3. The connection is established automatically.

⚠️ Märkus: USB ühenduste jaoks on Android-seadmetes vaja OTG tuge.

TCP/IP (võrk)

Mõned Meshtastic raadiod toetavad WiFi/Etherneti ühendust, võimaldades TCP-põhiseid ühendusi kohaliku võrgu kaudu. Ühenda raadio esmalt oma võrku – kasutades raadio enda WiFi-seadeid (püsivara veebiliidese või muu ühenduse kaudu) – ja seejärel loo ühendus rakenduse kaudu.

Connecting over the Network

  1. Veendu, et raadio on samas kohtvõrgus kui sinu telefon/lauaarvuti.
  2. Valige ühenduse loomise ekraanil transpordivalikus Võrk.
  3. Choose the radio one of two ways:
    • Võrguseadmete otsimine – lülita see sisse, et automaatselt avastada raadioid, mis reklaamivad end kohalikus võrgus (mDNS / _meshtastic._tcp). Leitud seadmed kuvatakse loendis; ühenduse loomiseks puuduta neist ühte.
    • Lisa seade käsitsi… — Sisesta raadio IP-aadress (või hostinimi) ja port (vaikimisi: 4403).
  4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

💡 Vihje: Võrgu tuvastamine kasutab mDNS-i, mis töötab ainult siis, kui mõlemad seadmed on samas alamvõrgus. Android 17+ puhul vajab rakendus skanniks kohaliku võrgu luba; kui otsing ei leia midagi, lisa seade käsitsi IP-aadressi järgi.

Millal kasutada TCP

  • Raadio on samas kohalikus võrgus
  • Testing with a simulated radio
  • Asukohad kus sinihambal on häireid

Reconnection Behavior

Rakendus loob käivitamisel uuesti ühenduse viimati valitud seadmega. Transporti saab ühenduskuvalt igal ajal vahetada.

Ühenduse katkestamiseks puuduta ühenduse loomise ekraanil katkestamise nuppu:

Katkesta ühendus raadioga

Desktop Connections

On Desktop (Linux/macOS/Windows), the app supports:

  • Sinihammas (BLE) — Kable’i teegi kaudu; töötab macOS-is, Linuxis ja Windowsis
  • USB port – peamine juhtmega ühendusmeetod
  • TCP/IP – võrguühendusega raadiote jaoks

Platvormipõhiste üksikasjade ja kiirklahvide kohta vaata [Töölauarakendus] (desktop).

Seotud teemad



diff --git a/main/et-rEE/user/onboarding.html b/main/et-rEE/user/onboarding.html index 2e0307a5b2..c4f3ef318e 100644 --- a/main/et-rEE/user/onboarding.html +++ b/main/et-rEE/user/onboarding.html @@ -1 +1 @@ - Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
🌐 Eesti
Meshtastic Docs ↗

🌐 Eesti — Community translation View in English

Getting Started

Tere tulemast Meshtasticusse! See juhend juhendab sind Meshtastic Androidi rakenduse esmasel seadistamisel.

First Launch

Rakenduse esmakordsel avamisel juhendatakse sind sissejuhatavas voos, mis aitab konfigureerida olulisi õigusi ja sätteid. Iga sammu saab läbida järjekorras või võid selle vahele jätta ja õigused hiljem Androidi seadetes konfigureerida.

Tervituskuva

Tervituskuval tutvustatakse Meshtasticut ja selle põhifunktsioone:

  • Off-grid mesh communication
  • No cellular or internet required
  • End-to-end encrypted messaging

Puuduta Alusta seadistusvoo jätkamiseks.

Tervituskuva

Permissions

Rakendus küsib seadistamise ajal mitmeid lube. Igal neist on kindel eesmärk ja mõned on vajalikud põhifunktsioonide täitmiseks.

Sinihamba load

Sinihammas on peamine ühendusmeetod sinu telefoni ja Meshtastic raadio vahel:

  • Bluetoothi ​​skann – avasta lähedalasuvad Meshtastic raadiod
  • Sinihamba ühendus – loo ja halda seotud seadmete ühendusi

Grant both permissions when prompted. Ilma sinihambata peate kasutama USB- või TCP-ühendusi.

Asukoha luba

⚠️ Miks on sinihamba ​​jaoks vaja asukohateavet? Android vajab lähedalasuvate sinihamba madala energia seadmete avastamiseks asukohale juurdepääsu luba. See on Androidi süsteeminõue, mitte Meshtastic põhine valik.

Meshtastic kasutab sinu asukohta ka järgmiseks:

  • Kuvatakse asukoht kärgvõrgu kaardil
  • Calculating distances to other nodes
  • GPS koordinaatide jagamine teiste kärgvõrgu liikmetega (kui lubatud)

Grant “While using the app” or “Always” depending on your preference:

  • Rakenduse kasutamise ajal – asukohta uuendatakse kui rakendus on avatud
  • Alati – lubab taustal asukoha värskendusi, et kärgvõrgu oleks alati sisse lülitatud

Kui keelatud, siis sinihamba otsing ei toimi ja sõlm ei edasta asukohta.

Märguannete load

Märguanded teavitavad teid järgmisest:

  • Sissetulevad sõnumid kanalitelt ja otsesõnumid
  • New nodes joining the mesh
  • Kaugsõlmel on aku tühjenenud

💡 Vihje: Teavituste eelistusi saab hiljem Androidi süsteemiseadetes täpsustada – rakendus loob iga kategooria kohta eraldi teavituskanali (lisaks mõned sisemised, näiteks taustateenus), nii et saad need eraldi lubada või vaigistada.

Critical Alerts Permission

On supported devices, the app may request permission for critical alerts:

  • Need on kõrge prioriteediga märguanded, mis võivad režiimist „Ära sega” läbi murda
  • Kasulik hädaolukorra võrguhoiatuste või kiireloomuliste sõnumite jaoks
  • Võid selle sammu vahele jätta, kui te kõrge prioriteediga märguandeid ei vaja
  • Seadistada või tühistada hiljem Androidi teavitusseadetes

Peale seadistamist

Kui load on antud, läheb rakendus üle põhiliidesele. Esimene samm peaks olema ühenduse loomine Meshtastic raadioga – üksikasjalike juhiste saamiseks vaata [Ühendused] (connections).

💡 Vihje: Kui jätsid seadistamise ajal mõne õiguse andmata, saad selle hiljem anda jaotises Androidi seaded → Rakendused → Meshtastic → Load. The app will prompt you again if a missing permission blocks a feature you try to use.

What’s Next?

Kui raadioga on ühendus loodud, uuri:

Kas oled Meshtasticus algaja? Meshtastic.org lehel olev alustusjuhend käsitleb riistvara valimist, raadio esialgset seadistamist ja esimest võrgu seadistamist.



+ Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
🌐 Eesti
Meshtastic Docs ↗

🌐 Eesti — Community translation View in English

Getting Started

Tere tulemast Meshtasticusse! See juhend juhendab sind Meshtastic Androidi rakenduse esmasel seadistamisel.

First Launch

Rakenduse esmakordsel avamisel juhendatakse sind sissejuhatavas voos, mis aitab konfigureerida olulisi õigusi ja sätteid. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app.

Tervituskuva

Tervituskuval tutvustatakse Meshtasticut ja selle põhifunktsioone:

  • Off-grid mesh communication
  • No cellular or internet required
  • End-to-end encrypted messaging

Puuduta Alusta seadistusvoo jätkamiseks.

Tervituskuva

Permissions

Rakendus küsib seadistamise ajal mitmeid lube. Igal neist on kindel eesmärk ja mõned on vajalikud põhifunktsioonide täitmiseks.

Sinihamba load

Sinihammas on peamine ühendusmeetod sinu telefoni ja Meshtastic raadio vahel:

  • Bluetoothi ​​skann – avasta lähedalasuvad Meshtastic raadiod
  • Sinihamba ühendus – loo ja halda seotud seadmete ühendusi

Grant both permissions when prompted. Ilma sinihambata peate kasutama USB- või TCP-ühendusi.

Asukoha luba

⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio.

Meshtastic kasutab sinu asukohta ka järgmiseks:

  • Kuvatakse asukoht kärgvõrgu kaardil
  • Calculating distances to other nodes
  • GPS koordinaatide jagamine teiste kärgvõrgu liikmetega (kui lubatud)

Grant “While using the app” or “Always” depending on your preference:

  • Rakenduse kasutamise ajal – asukohta uuendatakse kui rakendus on avatud
  • Alati – lubab taustal asukoha värskendusi, et kärgvõrgu oleks alati sisse lülitatud

Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind.

Märguannete load

Märguanded teavitavad teid järgmisest:

  • Sissetulevad sõnumid kanalitelt ja otsesõnumid
  • New nodes joining the mesh
  • Kaugsõlmel on aku tühjenenud

💡 Vihje: Teavituste eelistusi saab hiljem Androidi süsteemiseadetes täpsustada – rakendus loob iga kategooria kohta eraldi teavituskanali (lisaks mõned sisemised, näiteks taustateenus), nii et saad need eraldi lubada või vaigistada.

Critical Alerts Permission

On supported devices, the app may request permission for critical alerts:

  • Need on kõrge prioriteediga märguanded, mis võivad režiimist „Ära sega” läbi murda
  • Kasulik hädaolukorra võrguhoiatuste või kiireloomuliste sõnumite jaoks
  • Võid selle sammu vahele jätta, kui te kõrge prioriteediga märguandeid ei vaja
  • Seadistada või tühistada hiljem Androidi teavitusseadetes

Reviewing permissions later

Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time:

Olek What tapping the row does
Allowed Opens the system page, so you can review or revoke it
Not asked yet Requests it
Denied — tap to allow Explains what the permission is for, then asks again if you agree
Blocked — tap to open system settings Android will no longer show its dialog, so this opens the page where you can turn it back on
Not required on this version of Android Nothing — the permission does not exist on your device

This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead.

Peale seadistamist

Kui load on antud, läheb rakendus üle põhiliidesele. Esimene samm peaks olema ühenduse loomine Meshtastic raadioga – üksikasjalike juhiste saamiseks vaata [Ühendused] (connections).

💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own.

Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing.

What’s Next?

Kui raadioga on ühendus loodud, uuri:

Kas oled Meshtasticus algaja? Meshtastic.org lehel olev alustusjuhend käsitleb riistvara valimist, raadio esialgset seadistamist ja esimest võrgu seadistamist.



diff --git a/main/fi-rFI/user/connections.html b/main/fi-rFI/user/connections.html index 0b4a0e2953..dc5d8ba082 100644 --- a/main/fi-rFI/user/connections.html +++ b/main/fi-rFI/user/connections.html @@ -1 +1 @@ - Yhteydet | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
🌐 Suomi
Meshtastic Docs ↗

🌐 Suomi — Community translation View in English

Yhteydet

Meshtastic tukee useita siirtotapoja puhelimen/työpöydän ja radion välillä viestimiseen.

Bluetooth (BLE)

Bluetooth Low Energy on oletus ja yleisin yhteystapa Androidilla.

Laitteen pariliitos

  1. Varmista, että Meshtastic-radio on päällä ja paritustilassa.
  2. Avaa sovellus ja siirry Yhdistä-välilehdelle.
  3. Napauta Hae bluetooth-laitteita — lähellä olevat Meshtastic-radiot ilmestyvät näkyville.
  4. Valitse laitteesi listasta.
  5. Hyväksy Bluetooth-pariliitospyyntö, jos se tulee näkyviin.

Bluetooth-laitteiden haku, jossa löytynyt radio näkyy luettelossa

Vaihda bluetooth-, verkko- ja USB-yhteyksien välillä käyttämällä yhteyskortin alapuolella olevaa yhteysvalitsinta (vain yksi yhteystapa voi olla aktiivinen kerrallaan):

Yhteysvalitsin

💡 Vinkki: Jos laitteesi ei näy, varmista että Bluetooth ja sijaintiluvat on myönnetty ja että radio ei ole jo yhdistettynä toiseen laitteeseen.

Yhteyden tila

Ikoni Tila Kuvaus
🟢 Yhdistetty Aktiivinen radiolinkki muodostettu
🟡 Yhdistetään Yhteyden muodostus käynnissä
🔴 Ei yhdistetty Ei aktiivista yhteyttä
Ei määritetty Ei laitetta valittuna

Yhdistettäessä tilailmaisin näyttää nykyisen yhteyden tilan:

Yhdistämisen tila

Jos laitteita ei löydy, sovellus näyttää tyhjän näkymän ohjeiden kanssa:

Laitteita ei löytynyt

Bluetoothin vianmääritys

  • Laitetta ei löydy: Kytke Bluetooth pois/päälle ja varmista, että sijainti on käytössä.
  • Yhteys katkeaa: Siirry lähemmäs radiota ja tarkista mahdolliset häiriöt.
  • Paritus hylätty: Poista laite Androidin Bluetooth-asetuksista ja yritä uudelleen.

USB-sarjaporttiyhteys

USB-yhteydet tarjoavat langallisen vaihtoehdon, hyödyllinen työpöytäkäytössä tai kun Bluetooth ei ole käytettävissä.

Asetukset

  1. Yhdistä radio USB-kaapelilla laitteeseesi.
  2. Sovellus pyytää USB-oikeuksia — paina Salli.
  3. Yhteys muodostetaan automaattisesti.

⚠️ Huom: USB-yhteydet vaativat OTG-tuen Android-laitteissa.

TCP/IP (Verkko)

Jotkin Meshtastic-radiot tukevat WiFi tai Ethernet-yhteyttä, mikä mahdollistaa TCP-pohjaiset yhteydet lähiverkkosi kautta. Liitä radio ensin verkkoon käyttämällä radion omia WiFi-asetuksia (laiteohjelmiston verkkokäyttöliittymän tai muun yhteystavan kautta) — yhdistä siihen sitten sovelluksesta.

Yhdistäminen verkon kautta

  1. Varmista, että radio on samassa lähiverkossa kuin puhelimesi tai tietokoneesi.
  2. Valitse yhdistä-näytössä yhteysvalitsimesta Verkko.
  3. Valitse radio jommallakummalla seuraavista tavoista:
    • Hae verkkolaitteita — ota tämä käyttöön, jotta lähiverkossa itsensä ilmoittavat radiot löytyvät automaattisesti (mDNS / _meshtastic._tcp). Löydetyt laitteet näkyvät luettelossa; yhdistä napauttamalla haluamaasi laitetta.
    • Lisää laite manuaalisesti — anna radion IP-osoite (tai isäntänimi) ja portti (oletus: 4403).
  4. Aiemmin käytetyt verkko-osoitteet tallennetaan Viimeisimmät verkkolaitteet -osioon nopeaa uudelleenyhdistämistä varten (poista pitämällä painettuna).

💡 Vinkki: Verkkolaitteiden haku käyttää mDNS:ää, joka toimii vain, kun molemmat laitteet ovat samassa aliverkossa. Android 17:ssä ja uudemmissa versioissa sovellus tarvitsee lähiverkon käyttöoikeuden laitteiden hakuun. Jos haku ei löydä mitään, lisää laite manuaalisesti IP-osoitteella.

Milloin TCP-yhteyttä kannattaa käyttää

  • Radio on samassa lähiverkossa
  • Testaus simuloidulla radiolla
  • Ympäristöt, joissa Bluetoothissa on häiriöongelmia

Uudelleenyhdistämisen toiminta

Sovellus yhdistyy käynnistyksen yhteydessä viimeksi valittuun laitteeseen. Voit vaihtaa yhteystapaa Yhdistä-näkymästä milloin tahansa.

Yhteyden katkaisemiseksi paina Yhdistä-näkymän katkaisupainiketta:

Katkaise yhteys radiosta

Työpöytäyhteydet

Työpöydällä (Linux/macOS/Windows) sovellus tukee:

  • Bluetooth (BLE) — Kable-kirjaston kautta; toimii macOS:llä, Linuxilla ja Windowsilla
  • USB-sarjaportti — ensisijainen langallinen yhteystapa
  • TCP/IP — verkkoyhteydellä oleville radioille

Katso Työpöytäsovellus alustakohtaiset tiedot ja pikanäppäimet.

Aiheeseen liittyvät aiheet



+ Yhteydet | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
🌐 Suomi
Meshtastic Docs ↗

🌐 Suomi — Community translation View in English

Yhteydet

Meshtastic tukee useita siirtotapoja puhelimen/työpöydän ja radion välillä viestimiseen.

Bluetooth (BLE)

Bluetooth Low Energy on oletus ja yleisin yhteystapa Androidilla.

Laitteen pariliitos

  1. Varmista, että Meshtastic-radio on päällä ja paritustilassa.
  2. Avaa sovellus ja siirry Yhdistä-välilehdelle.
  3. Napauta Hae bluetooth-laitteita — lähellä olevat Meshtastic-radiot ilmestyvät näkyville.
  4. Valitse laitteesi listasta.
  5. Hyväksy Bluetooth-pariliitospyyntö, jos se tulee näkyviin.

Bluetooth-laitteiden haku, jossa löytynyt radio näkyy luettelossa

Vaihda bluetooth-, verkko- ja USB-yhteyksien välillä käyttämällä yhteyskortin alapuolella olevaa yhteysvalitsinta (vain yksi yhteystapa voi olla aktiivinen kerrallaan):

Yhteysvalitsin

💡 Vinkki: Jos laitettasi ei näy, tarkista, ettei radio ole jo yhdistetty toiseen laitteeseen tai kantaman ulkopuolella.

Näytössä kerrotaan kaikki sovelluksen puolella olevat syyt, jotka estävät haun, sekä niiden ratkaisut:

Näet seuraavan Mitä se tarkoittaa
Kortti pyytää Lähistön laitteet -käyttöoikeutta Käyttöoikeutta ei ole myönnetty. Myönnä käyttöoikeus pyytää sitä. Kun Android lakkaa kysymästä, painikkeeksi muuttuu Avaa asetukset.
Bluetooth on pois käytöstä Bluetooth-sovitin on poistettu käytöstä – kortti avaa Bluetooth-asetukset.
Bluetooth-laitteiden haku edellyttää myös sijaintipalvelujen käyttöä Vain Android 11:ssä ja vanhemmissa versioissa: käyttöoikeus on myönnetty, mutta järjestelmän sijaintipalvelut ovat pois käytöstä.
Ei korttia, tyhjä luettelo Mikään sovelluksen puolella ei estä hakua – radio on kantaman ulkopuolella, pois käytöstä tai jo yhdistetty toiseen laitteeseen.

Kun napautat Hae sen jälkeen, kun olet kerran hylännyt käyttöoikeuspyynnön, sovellus kertoo ensin, mihin käyttöoikeutta tarvitaan, ennen kuin pyytää sitä uudelleen. Näin voit myös kieltäytyä rauhassa ilman painostusta.

Yhteyden tila

Ikoni Tila Kuvaus
🟢 Yhdistetty Aktiivinen radiolinkki muodostettu
🟡 Yhdistetään Yhteyden muodostus käynnissä
🔴 Ei yhdistetty Ei aktiivista yhteyttä
Ei määritetty Ei laitetta valittuna

Yhdistettäessä tilailmaisin näyttää nykyisen yhteyden tilan:

Yhdistämisen tila

Jos laitteita ei löydy, sovellus näyttää tyhjän näkymän ohjeiden kanssa:

Laitteita ei löytynyt

Bluetoothin vianmääritys

  • Laitetta ei löydy: Kytke Bluetooth pois/päälle ja varmista, että sijainti on käytössä.
  • Yhteys katkeaa: Siirry lähemmäs radiota ja tarkista mahdolliset häiriöt.
  • Paritus hylätty: Poista laite Androidin Bluetooth-asetuksista ja yritä uudelleen.

USB-sarjaporttiyhteys

USB-yhteydet tarjoavat langallisen vaihtoehdon, hyödyllinen työpöytäkäytössä tai kun Bluetooth ei ole käytettävissä.

Asetukset

  1. Yhdistä radio USB-kaapelilla laitteeseesi.
  2. Sovellus pyytää USB-oikeuksia — paina Salli.
  3. Yhteys muodostetaan automaattisesti.

⚠️ Huom: USB-yhteydet vaativat OTG-tuen Android-laitteissa.

TCP/IP (Verkko)

Jotkin Meshtastic-radiot tukevat WiFi tai Ethernet-yhteyttä, mikä mahdollistaa TCP-pohjaiset yhteydet lähiverkkosi kautta. Liitä radio ensin verkkoon käyttämällä radion omia WiFi-asetuksia (laiteohjelmiston verkkokäyttöliittymän tai muun yhteystavan kautta) — yhdistä siihen sitten sovelluksesta.

Yhdistäminen verkon kautta

  1. Varmista, että radio on samassa lähiverkossa kuin puhelimesi tai tietokoneesi.
  2. Valitse yhdistä-näytössä yhteysvalitsimesta Verkko.
  3. Valitse radio jommallakummalla seuraavista tavoista:
    • Hae verkkolaitteita — ota tämä käyttöön, jotta lähiverkossa itsensä ilmoittavat radiot löytyvät automaattisesti (mDNS / _meshtastic._tcp). Löydetyt laitteet näkyvät luettelossa; yhdistä napauttamalla haluamaasi laitetta.
    • Lisää laite manuaalisesti — anna radion IP-osoite (tai isäntänimi) ja portti (oletus: 4403).
  4. Aiemmin käytetyt verkko-osoitteet tallennetaan Viimeisimmät verkkolaitteet -osioon nopeaa uudelleenyhdistämistä varten (poista pitämällä painettuna).

💡 Vinkki: Verkkolaitteiden haku käyttää mDNS:ää, joka toimii vain, kun molemmat laitteet ovat samassa aliverkossa. Android 17:ssä ja uudemmissa versioissa sovellus tarvitsee lähiverkon käyttöoikeuden laitteiden hakuun. Jos haku ei löydä mitään, lisää laite manuaalisesti IP-osoitteella.

Milloin TCP-yhteyttä kannattaa käyttää

  • Radio on samassa lähiverkossa
  • Testaus simuloidulla radiolla
  • Ympäristöt, joissa Bluetoothissa on häiriöongelmia

Uudelleenyhdistämisen toiminta

Sovellus yhdistyy käynnistyksen yhteydessä viimeksi valittuun laitteeseen. Voit vaihtaa yhteystapaa Yhdistä-näkymästä milloin tahansa.

Yhteyden katkaisemiseksi paina Yhdistä-näkymän katkaisupainiketta:

Katkaise yhteys radiosta

Työpöytäyhteydet

Työpöydällä (Linux/macOS/Windows) sovellus tukee:

  • Bluetooth (BLE) — Kable-kirjaston kautta; toimii macOS:llä, Linuxilla ja Windowsilla
  • USB-sarjaportti — ensisijainen langallinen yhteystapa
  • TCP/IP — verkkoyhteydellä oleville radioille

Katso Työpöytäsovellus alustakohtaiset tiedot ja pikanäppäimet.

Aiheeseen liittyvät aiheet



diff --git a/main/fi-rFI/user/onboarding.html b/main/fi-rFI/user/onboarding.html index 6f9587aaea..4d71e63b75 100644 --- a/main/fi-rFI/user/onboarding.html +++ b/main/fi-rFI/user/onboarding.html @@ -1 +1 @@ - Aloittaminen | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
🌐 Suomi
Meshtastic Docs ↗

🌐 Suomi — Community translation View in English

Aloittaminen

Tervetuloa Meshtasticiin! Tämä opas opastaa sinut Meshtastic Android -sovelluksen alkuasetusten läpi.

Ensimmäinen käynnistys

Kun avaat sovelluksen ensimmäistä kertaa, sinut ohjataan käyttöönottoprosessin läpi, joka auttaa määrittämään tarvittavat käyttöoikeudet ja asetukset. Voit suorittaa jokaisen vaiheen järjestyksessä tai ohittaa ne ja määrittää käyttöoikeudet myöhemmin Androidin asetuksissa.

Aloitusnäkymä

Tervetulonäyttö esittelee Meshtasticin ja sen tärkeimmät ominaisuudet:

  • Matkapuhelinverkosta riippumaton mesh-viestintä
  • Ei vaadi matkapuhelinverkkoa tai internetyhteyttä
  • Päästä päähän salattu viestintä

Napauta “Aloita” jatkaaksesi käyttöönottoprosessia.

Tervetulonäyttö

Käyttöoikeudet

Sovellus pyytää määrityksen aikana useita käyttöoikeuksia. Jokaisella niistä on oma tarkoituksensa, ja osa niistä on välttämättömiä perustoimintojen kannalta.

Bluetooth-käyttöoikeus

Bluetooth on ensisijainen yhteystapa puhelimesi ja Meshtastic-radion välillä:

  • Bluetooth-skannaus — etsi lähellä olevia Meshtastic-radioita
  • Bluetooth-yhteys — muodosta ja ylläpidä yhteyksiä pariliitettyihin radioihin

Myönnä molemmat käyttöoikeudet pyydettäessä. Ilman Bluetoothia sinun on käytettävä sen sijaan USB- tai TCP-yhteyksiä.

Sijaintikäyttöoikeus

⚠️ Miksi sijaintikäyttöoikeus tarvitaan Bluetoothille? Android vaatii sijaintikäyttöoikeuden lähellä olevien Bluetooth Low Energy -laitteiden löytämiseen. Tämä on Android-järjestelmän vaatimus, eikä Meshtasticin erityinen valinta.

Meshtastic käyttää sijaintiasi myös seuraaviin tarkoituksiin:

  • Sijaintisi näyttäminen mesh-kartalla
  • Etäisyyksien laskeminen muihin radioihin
  • GPS-koordinaattiesi jakaminen muiden verkon jäsenten kanssa (jos käytössä)

Myönnä “Sovelluksen käytön aikana” tai “Aina” oman mieltymyksesi mukaan:

  • Sovelluksen käytön aikana — sijainti päivittyy vain silloin, kun sovellus on avoinna
  • Aina — mahdollistaa sijainnin päivittämisen taustalla jatkuvaa verkon läsnäoloa varten

Jos käyttöoikeus evätään, Bluetooth-skannaus ei toimi eikä radiosi raportoi sijaintia.

Ilmoituskäyttöoikeus

Ilmoitukset kertovat sinulle:

  • Saapuvista viesteistä kanavilta ja yksityisviesteistä
  • Uusista mesh-verkkoon liittyvistä radioista
  • Etäradion akun vähäisestä virrasta

💡 Vinkki: Voit myöhemmin säätää ilmoitusasetuksia Androidin järjestelmäasetuksissa. Sovellus luo jokaiselle ilmoitusluokalle oman ilmoituskanavan (sekä muutamia sisäisiä kanavia, kuten taustapalvelulle), joten voit ottaa ne käyttöön tai mykistää ne yksitellen.

Kriittisten hälytysten käyttöoikeus

Tuetuilla laitteilla sovellus voi pyytää käyttöoikeutta kriittisiin hälytyksiin:

  • Nämä ovat korkean prioriteetin ilmoituksia, jotka voivat ohittaa Älä häiritse -tilan
  • Hyödyllinen hätätilanteiden verkkohälytyksille tai kiireellisille viesteille
  • Voit ohittaa tämän vaiheen, jos et tarvitse ilmoituksia, jotka ohittavat Älä häiritse -tilan
  • Voit määrittää tai peruuttaa tämän myöhemmin Androidin ilmoitusasetuksissa

Määrityksen jälkeen

Kun käyttöoikeudet on myönnetty, sovellus siirtyy pääkäyttöliittymään. Ensimmäinen toimenpiteesi pitäisi olla yhteyden muodostaminen Meshtastic-radioon — katso Yhteydet yksityiskohtaisia ohjeita varten.

💡 Vinkki: Jos ohitit käyttöoikeuksia määrityksen aikana, voit myöntää ne myöhemmin kohdassa Androidin asetukset → Sovellukset → Meshtastic → Käyttöoikeudet. Sovellus pyytää sinulta uudelleen käyttöoikeutta, jos puuttuva käyttöoikeus estää käyttämästä ominaisuutta, jota yrität käyttää.

Mitä seuraavaksi?

Kun olet muodostanut yhteyden radioon, tutustu seuraaviin:

Uusi Meshtasticissa? Aloitusopas meshtastic.org-sivustolla käsittelee laitteiston valintaa, radion alkuasetuksia ja ensimmäisen verkon käyttöönottoa.



+ Aloittaminen | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
🌐 Suomi
Meshtastic Docs ↗

🌐 Suomi — Community translation View in English

Aloittaminen

Tervetuloa Meshtasticiin! Tämä opas opastaa sinut Meshtastic Android -sovelluksen alkuasetusten läpi.

Ensimmäinen käynnistys

Kun avaat sovelluksen ensimmäistä kertaa, sinut ohjataan käyttöönottoprosessin läpi, joka auttaa määrittämään tarvittavat käyttöoikeudet ja asetukset. Jokainen vaihe voidaan suorittaa järjestyksessä tai ohittaa – mikään niistä ei ole kertaluonteinen mahdollisuus. Kaikki käyttöoikeudet voidaan tarkistaa ja myöntää myöhemmin sovelluksen Asetukset → Käyttöoikeudet -kohdassa.

Aloitusnäkymä

Tervetulonäyttö esittelee Meshtasticin ja sen tärkeimmät ominaisuudet:

  • Matkapuhelinverkosta riippumaton mesh-viestintä
  • Ei vaadi matkapuhelinverkkoa tai internetyhteyttä
  • Päästä päähän salattu viestintä

Napauta “Aloita” jatkaaksesi käyttöönottoprosessia.

Tervetulonäyttö

Käyttöoikeudet

Sovellus pyytää määrityksen aikana useita käyttöoikeuksia. Jokaisella niistä on oma tarkoituksensa, ja osa niistä on välttämättömiä perustoimintojen kannalta.

Bluetooth-käyttöoikeus

Bluetooth on ensisijainen yhteystapa puhelimesi ja Meshtastic-radion välillä:

  • Bluetooth-skannaus — etsi lähellä olevia Meshtastic-radioita
  • Bluetooth-yhteys — muodosta ja ylläpidä yhteyksiä pariliitettyihin radioihin

Myönnä molemmat käyttöoikeudet pyydettäessä. Ilman Bluetoothia sinun on käytettävä sen sijaan USB- tai TCP-yhteyksiä.

Sijaintikäyttöoikeus

⚠️ Tarvitaanko Bluetoothiin sijaintia? Android 11:ssä ja sitä vanhemmissa versioissa kyllä. Niissä Bluetooth-laitteiden haku käsitellään sijaintiominaisuutena, joten sovellus pyytää Lähistön laitteet -käyttöoikeuden sijaan sijaintikäyttöoikeutta, ja myös Sijaintipalvelut on oltava käytössä, jotta haku toimii. Näissä versioissa Bluetooth-näytössä näkyy kaksi sijaan vain yksi sijaintikäyttöoikeuden vaihe, koska kyseessä on yksi järjestelmän käyttöoikeus. Sen pyytäminen kahdesti voisi johtaa siihen, että Android lakkaa näyttämästä käyttöoikeusikkunaa kokonaan (toisen hylkäyksen jälkeen Android 11:ssä tai “Älä kysy uudelleen” -valinnan jälkeen Android 10:ssä ja vanhemmissa versioissa). Android 12:ssa ja uudemmissa versioissa nämä ovat erillisiä: “Lähistön laitteet” on määritelty asetuksella neverForLocation, eikä sijaintikäyttöoikeuden hylkääminen estä radion löytämistä tai siihen yhdistämistä.

Meshtastic käyttää sijaintiasi myös seuraaviin tarkoituksiin:

  • Sijaintisi näyttäminen mesh-kartalla
  • Etäisyyksien laskeminen muihin radioihin
  • GPS-koordinaattiesi jakaminen muiden verkon jäsenten kanssa (jos käytössä)

Myönnä “Sovelluksen käytön aikana” tai “Aina” oman mieltymyksesi mukaan:

  • Sovelluksen käytön aikana — sijainti päivittyy vain silloin, kun sovellus on avoinna
  • Aina — mahdollistaa sijainnin päivittämisen taustalla jatkuvaa verkon läsnäoloa varten

Sijaintikäyttöoikeuden hylkääminen ei estä sovelluksen muuta toimintaa. Android 12:ssa ja uudemmissa versioissa Bluetooth toimii edelleen, ja vain kartta, sijainnin näyttäminen ja sijainnin jakaminen poistuvat käytöstä. Android 11:ssä ja sitä vanhemmissa versioissa myös Bluetooth-laitteiden haku lakkaa toimimasta, koska Android edellyttää siihen sijaintikäyttöoikeutta.

Ilmoituskäyttöoikeus

Ilmoitukset kertovat sinulle:

  • Saapuvista viesteistä kanavilta ja yksityisviesteistä
  • Uusista mesh-verkkoon liittyvistä radioista
  • Etäradion akun vähäisestä virrasta

💡 Vinkki: Voit myöhemmin säätää ilmoitusasetuksia Androidin järjestelmäasetuksissa. Sovellus luo jokaiselle ilmoitusluokalle oman ilmoituskanavan (sekä muutamia sisäisiä kanavia, kuten taustapalvelulle), joten voit ottaa ne käyttöön tai mykistää ne yksitellen.

Kriittisten hälytysten käyttöoikeus

Tuetuilla laitteilla sovellus voi pyytää käyttöoikeutta kriittisiin hälytyksiin:

  • Nämä ovat korkean prioriteetin ilmoituksia, jotka voivat ohittaa Älä häiritse -tilan
  • Hyödyllinen hätätilanteiden verkkohälytyksille tai kiireellisille viesteille
  • Voit ohittaa tämän vaiheen, jos et tarvitse ilmoituksia, jotka ohittavat Älä häiritse -tilan
  • Voit määrittää tai peruuttaa tämän myöhemmin Androidin ilmoitusasetuksissa

Käyttöoikeuksien tarkistaminen myöhemmin

Asetukset → Käyttöoikeudet näyttää kaikkien käyttöaikaisten käyttöoikeuksien tilan. Kun mikään käyttöoikeus ei vaadi huomiotasi, siinä lukee Kaikki sallittu. Jos jokin käyttöoikeus vaatii huomiota, siinä näytetään niiden määrä, ja näkymä avautuu automaattisesti. Napauta riviä nähdäksesi koko luettelon milloin tahansa:

Tila Mitä rivin napauttaminen tekee
Sallittu Avaa järjestelmän sivun, jossa voit tarkistaa tai peruuttaa käyttöoikeuden
Ei kysytty vielä Pyytää sitä
Estetty - napauta salliaksesi Selittää, mihin käyttöoikeutta tarvitaan, ja pyytää sitä uudelleen, jos hyväksyt
Estetty - napauta avataksesi järjestelmäasetukset Android ei enää näytä käyttöoikeusikkunaa, joten tämä avaa sivun, jossa voit ottaa käyttöoikeuden uudelleen käyttöön
Ei tarvita tässä Android-versiossa Ei mitään – tätä käyttöoikeutta ei ole laitteessasi

Tämä koskee erityisesti ilmoituksia. Aiemmin sovellus pyysi tätä käyttöoikeutta vain yhdessä paikassa – käyttöönottovaiheessa – joten sen hylkääminen esti viesti-, uusi radio- ja akun alhaisen varaustason ilmoitukset, eikä sovellus voinut pyytää käyttöoikeutta uudelleen. Kun olet hylännyt käyttöoikeuspyynnön lopullisesti (Android 11:ssä ja uudemmissa versioissa toisen hylkäyksen jälkeen), Android ei enää näytä käyttöoikeusikkunaa. Tällöin tämä rivi muuttuu tilaan Estetty ja avaa sen sijaan järjestelmän asetussivun.

Määrityksen jälkeen

Kun käyttöoikeudet on myönnetty, sovellus siirtyy pääkäyttöliittymään. Ensimmäinen toimenpiteesi pitäisi olla yhteyden muodostaminen Meshtastic-radioon — katso Yhteydet yksityiskohtaisia ohjeita varten.

💡 Vinkki: Jos ohitit käyttöoikeuksia käyttöönottovaiheessa, avaa sovelluksessa Asetukset → Käyttöoikeudet. Kaikki käyttöaikaiset käyttöoikeudet näkyvät siellä nykyisessä tilassaan sekä linkkinä niiden hallintaan, mukaan lukien ilmoitukset, joita järjestelmä ei pyydä toista kertaa automaattisesti.

Sovelluksen toiminnot pyytävät käyttöoikeuksia myös tarpeen mukaan. Kun Yhteydet-näytössä napautat Hae ilman Bluetooth-käyttöoikeutta, sovellus kertoo, mihin käyttöoikeutta tarvitaan, ja tarjoaa mahdollisuuden pyytää sitä. Kun Android ei enää näytä käyttöoikeusikkunaa, sama painike avaa sen sijaan järjestelmän asetussivun eikä jää toimettomaksi.

Mitä seuraavaksi?

Kun olet muodostanut yhteyden radioon, tutustu seuraaviin:

Uusi Meshtasticissa? Aloitusopas meshtastic.org-sivustolla käsittelee laitteiston valintaa, radion alkuasetuksia ja ensimmäisen verkon käyttöönottoa.



diff --git a/main/fr-rCA/user/connections.html b/main/fr-rCA/user/connections.html index be2df8ef32..5d62061570 100644 --- a/main/fr-rCA/user/connections.html +++ b/main/fr-rCA/user/connections.html @@ -23,9 +23,40 @@

Transport selector

-

💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device.

+

💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range.

+

The screen names anything on the app’s side that is blocking a scan, with the fix attached:

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
What you seeWhat it means
A card asking for Nearby devicesThe permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings.
Bluetooth is offThe adapter is disabled — the card opens Bluetooth settings.
Bluetooth scanning also needs location servicesAndroid 11 and older only: the permission is held but the system location toggle is off.
No card, empty listNothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere.
+ +

Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered.

+

Connection Status

diff --git a/main/fr-rCA/user/onboarding.html b/main/fr-rCA/user/onboarding.html index d7724dbf95..18a7ad8087 100644 --- a/main/fr-rCA/user/onboarding.html +++ b/main/fr-rCA/user/onboarding.html @@ -4,7 +4,7 @@

First Launch

-

When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings.

+

When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app.

Welcome Screen

@@ -38,7 +38,7 @@

Location Permission

-

⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice.

+

⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio.

Meshtastic also uses your location for:

@@ -56,7 +56,7 @@
  • Always — enables background position updates for always-on mesh presence
  • -

    If denied, Bluetooth scanning will not function and your node will not report a position.

    +

    Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind.

    Notifications Permission

    @@ -83,14 +83,53 @@
  • Configure or revoke later in Android notification settings
  • +

    Reviewing permissions later

    + +

    Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time:

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    StateWhat tapping the row does
    AllowedOpens the system page, so you can review or revoke it
    Not asked yetRequests it
    Denied — tap to allowExplains what the permission is for, then asks again if you agree
    Blocked — tap to open system settingsAndroid will no longer show its dialog, so this opens the page where you can turn it back on
    Not required on this version of AndroidNothing — the permission does not exist on your device
    + +

    This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead.

    +

    After Setup

    Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

    -

    💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use.

    +

    💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own.

    +

    Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing.

    +

    What’s Next?

    Once connected to a radio, explore:

    diff --git a/main/fr-rFR/user/connections.html b/main/fr-rFR/user/connections.html index 19f60930f4..2ed726f5fa 100644 --- a/main/fr-rFR/user/connections.html +++ b/main/fr-rFR/user/connections.html @@ -1 +1 @@ - Connexions | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Français
    Meshtastic Docs ↗

    🌐 Français — Community translation View in English

    Connexions

    Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

    Bluetooth (BLE)

    Bluetooth Low Energy is the default and most common connection method on Android.

    Pairing a Device

    1. Ensure your Meshtastic radio is powered on and in pairing mode.
    2. Open the app and navigate to the Connect tab.
    3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
    4. Select your device from the list.
    5. Accept the Bluetooth pairing prompt if shown.

    Scanning for Bluetooth devices, with a discovered radio in the list

    Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

    Transport selector

    💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device.

    Connection Status

    Icon State Description
    🟢 Connecté Active radio link established
    🟡 Connexion en cours Handshake in progress
    🔴 Déconnecté No active connection
    Not configured Aucun appareil sélectionné

    When connecting, a status indicator shows the current connection state:

    Connecting status

    If no devices are found, the app shows an empty state with instructions:

    No devices found

    Troubleshooting Bluetooth

    • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
    • Connection drops: Move closer to the radio; check for interference.
    • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

    USB Serial

    USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

    Setup

    1. Connect your radio via USB cable to your device.
    2. The app will prompt for USB permission — tap Allow.
    3. The connection is established automatically.

    ⚠️ Note: USB connections require OTG support on Android devices.

    TCP/IP (Network)

    Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

    Connecting over the Network

    1. Make sure the radio is on the same local network as your phone/desktop.
    2. On the Connect screen, select Network in the transport selector.
    3. Choose the radio one of two ways:
      • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
      • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
    4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

    💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

    When to Use TCP

    • Radio is on the same local network
    • Testing with a simulated radio
    • Environments where Bluetooth has interference issues

    Reconnection Behavior

    The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

    To disconnect, tap the disconnect button on the Connect screen:

    Disconnect from radio

    Desktop Connections

    On Desktop (Linux/macOS/Windows), the app supports:

    • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
    • USB Serial — primary wired connection method
    • TCP/IP — for network-connected radios

    See Desktop App for platform-specific details and keyboard shortcuts.



    + Connexions | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Français
    Meshtastic Docs ↗

    🌐 Français — Community translation View in English

    Connexions

    Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

    Bluetooth (BLE)

    Bluetooth Low Energy is the default and most common connection method on Android.

    Pairing a Device

    1. Ensure your Meshtastic radio is powered on and in pairing mode.
    2. Open the app and navigate to the Connect tab.
    3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
    4. Select your device from the list.
    5. Accept the Bluetooth pairing prompt if shown.

    Scanning for Bluetooth devices, with a discovered radio in the list

    Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

    Transport selector

    💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range.

    The screen names anything on the app’s side that is blocking a scan, with the fix attached:

    What you see What it means
    A card asking for Nearby devices The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings.
    Bluetooth is off The adapter is disabled — the card opens Bluetooth settings.
    Bluetooth scanning also needs location services Android 11 and older only: the permission is held but the system location toggle is off.
    No card, empty list Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere.

    Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered.

    Connection Status

    Icon State Description
    🟢 Connecté Active radio link established
    🟡 Connexion en cours Handshake in progress
    🔴 Déconnecté No active connection
    Not configured Aucun appareil sélectionné

    When connecting, a status indicator shows the current connection state:

    Connecting status

    If no devices are found, the app shows an empty state with instructions:

    No devices found

    Troubleshooting Bluetooth

    • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
    • Connection drops: Move closer to the radio; check for interference.
    • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

    USB Serial

    USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

    Setup

    1. Connect your radio via USB cable to your device.
    2. The app will prompt for USB permission — tap Allow.
    3. The connection is established automatically.

    ⚠️ Note: USB connections require OTG support on Android devices.

    TCP/IP (Network)

    Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

    Connecting over the Network

    1. Make sure the radio is on the same local network as your phone/desktop.
    2. On the Connect screen, select Network in the transport selector.
    3. Choose the radio one of two ways:
      • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
      • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
    4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

    💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

    When to Use TCP

    • Radio is on the same local network
    • Testing with a simulated radio
    • Environments where Bluetooth has interference issues

    Reconnection Behavior

    The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

    To disconnect, tap the disconnect button on the Connect screen:

    Disconnect from radio

    Desktop Connections

    On Desktop (Linux/macOS/Windows), the app supports:

    • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
    • USB Serial — primary wired connection method
    • TCP/IP — for network-connected radios

    See Desktop App for platform-specific details and keyboard shortcuts.



    diff --git a/main/fr-rFR/user/onboarding.html b/main/fr-rFR/user/onboarding.html index 26af6e5524..c23b44c5bf 100644 --- a/main/fr-rFR/user/onboarding.html +++ b/main/fr-rFR/user/onboarding.html @@ -1 +1 @@ - Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Français
    Meshtastic Docs ↗

    🌐 Français — Community translation View in English

    Getting Started

    Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

    First Launch

    When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings.

    Welcome Screen

    The welcome screen introduces Meshtastic and its core capabilities:

    • Off-grid mesh communication
    • No cellular or internet required
    • End-to-end encrypted messaging

    Tap Get Started to proceed through the setup flow.

    Welcome screen

    Permissions

    The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

    Bluetooth Permission

    Bluetooth is the primary connection method between your phone and Meshtastic radio:

    • Bluetooth scanning — discover nearby Meshtastic radios
    • Bluetooth connect — establish and maintain connections with paired radios

    Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

    Location Permission

    ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice.

    Meshtastic also uses your location for:

    • Showing your position on the mesh map
    • Calculating distances to other nodes
    • Sharing your GPS coordinates with other mesh members (if enabled)

    Grant “While using the app” or “Always” depending on your preference:

    • While using the app — position updates only when the app is open
    • Always — enables background position updates for always-on mesh presence

    If denied, Bluetooth scanning will not function and your node will not report a position.

    Notifications Permission

    Notifications alert you to:

    • Incoming messages from channels and direct messages
    • New nodes joining the mesh
    • Low battery on a remote node

    💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

    Critical Alerts Permission

    On supported devices, the app may request permission for critical alerts:

    • These are high-priority notifications that can break through Do Not Disturb mode
    • Useful for emergency mesh alerts or urgent messages
    • You can skip this step if you don’t need breakthrough notifications
    • Configure or revoke later in Android notification settings

    After Setup

    Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

    💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use.

    What’s Next?

    Once connected to a radio, explore:

    New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



    + Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Français
    Meshtastic Docs ↗

    🌐 Français — Community translation View in English

    Getting Started

    Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

    First Launch

    When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app.

    Welcome Screen

    The welcome screen introduces Meshtastic and its core capabilities:

    • Off-grid mesh communication
    • No cellular or internet required
    • End-to-end encrypted messaging

    Tap Get Started to proceed through the setup flow.

    Welcome screen

    Permissions

    The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

    Bluetooth Permission

    Bluetooth is the primary connection method between your phone and Meshtastic radio:

    • Bluetooth scanning — discover nearby Meshtastic radios
    • Bluetooth connect — establish and maintain connections with paired radios

    Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

    Location Permission

    ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio.

    Meshtastic also uses your location for:

    • Showing your position on the mesh map
    • Calculating distances to other nodes
    • Sharing your GPS coordinates with other mesh members (if enabled)

    Grant “While using the app” or “Always” depending on your preference:

    • While using the app — position updates only when the app is open
    • Always — enables background position updates for always-on mesh presence

    Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind.

    Notifications Permission

    Notifications alert you to:

    • Incoming messages from channels and direct messages
    • New nodes joining the mesh
    • Low battery on a remote node

    💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

    Critical Alerts Permission

    On supported devices, the app may request permission for critical alerts:

    • These are high-priority notifications that can break through Do Not Disturb mode
    • Useful for emergency mesh alerts or urgent messages
    • You can skip this step if you don’t need breakthrough notifications
    • Configure or revoke later in Android notification settings

    Reviewing permissions later

    Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time:

    State What tapping the row does
    Allowed Opens the system page, so you can review or revoke it
    Not asked yet Requests it
    Denied — tap to allow Explains what the permission is for, then asks again if you agree
    Blocked — tap to open system settings Android will no longer show its dialog, so this opens the page where you can turn it back on
    Not required on this version of Android Nothing — the permission does not exist on your device

    This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead.

    After Setup

    Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

    💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own.

    Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing.

    What’s Next?

    Once connected to a radio, explore:

    New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



    diff --git a/main/ga-rIE/user/connections.html b/main/ga-rIE/user/connections.html index 4ca66b4515..73a056b5a3 100644 --- a/main/ga-rIE/user/connections.html +++ b/main/ga-rIE/user/connections.html @@ -1 +1 @@ - Connections | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Gaeilge
    Meshtastic Docs ↗

    🌐 Gaeilge — Community translation View in English

    Connections

    Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

    Bluetooth (BLE)

    Bluetooth Low Energy is the default and most common connection method on Android.

    Pairing a Device

    1. Ensure your Meshtastic radio is powered on and in pairing mode.
    2. Open the app and navigate to the Connect tab.
    3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
    4. Select your device from the list.
    5. Accept the Bluetooth pairing prompt if shown.

    Scanning for Bluetooth devices, with a discovered radio in the list

    Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

    Transport selector

    💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device.

    Connection Status

    Icon State Cur síos
    🟢 Connected Active radio link established
    🟡 Connecting Handshake in progress
    🔴 Na ceangailte No active connection
    Not configured No device selected

    When connecting, a status indicator shows the current connection state:

    Connecting status

    If no devices are found, the app shows an empty state with instructions:

    No devices found

    Troubleshooting Bluetooth

    • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
    • Connection drops: Move closer to the radio; check for interference.
    • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

    USB Serial

    USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

    Setup

    1. Connect your radio via USB cable to your device.
    2. The app will prompt for USB permission — tap Allow.
    3. The connection is established automatically.

    ⚠️ Note: USB connections require OTG support on Android devices.

    TCP/IP (Network)

    Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

    Connecting over the Network

    1. Make sure the radio is on the same local network as your phone/desktop.
    2. On the Connect screen, select Network in the transport selector.
    3. Choose the radio one of two ways:
      • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
      • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
    4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

    💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

    When to Use TCP

    • Radio is on the same local network
    • Testing with a simulated radio
    • Environments where Bluetooth has interference issues

    Reconnection Behavior

    The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

    To disconnect, tap the disconnect button on the Connect screen:

    Disconnect from radio

    Desktop Connections

    On Desktop (Linux/macOS/Windows), the app supports:

    • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
    • USB Serial — primary wired connection method
    • TCP/IP — for network-connected radios

    See Desktop App for platform-specific details and keyboard shortcuts.



    + Connections | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Gaeilge
    Meshtastic Docs ↗

    🌐 Gaeilge — Community translation View in English

    Connections

    Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

    Bluetooth (BLE)

    Bluetooth Low Energy is the default and most common connection method on Android.

    Pairing a Device

    1. Ensure your Meshtastic radio is powered on and in pairing mode.
    2. Open the app and navigate to the Connect tab.
    3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
    4. Select your device from the list.
    5. Accept the Bluetooth pairing prompt if shown.

    Scanning for Bluetooth devices, with a discovered radio in the list

    Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

    Transport selector

    💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range.

    The screen names anything on the app’s side that is blocking a scan, with the fix attached:

    What you see What it means
    A card asking for Nearby devices The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings.
    Bluetooth is off The adapter is disabled — the card opens Bluetooth settings.
    Bluetooth scanning also needs location services Android 11 and older only: the permission is held but the system location toggle is off.
    No card, empty list Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere.

    Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered.

    Connection Status

    Icon State Cur síos
    🟢 Connected Active radio link established
    🟡 Connecting Handshake in progress
    🔴 Na ceangailte No active connection
    Not configured No device selected

    When connecting, a status indicator shows the current connection state:

    Connecting status

    If no devices are found, the app shows an empty state with instructions:

    No devices found

    Troubleshooting Bluetooth

    • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
    • Connection drops: Move closer to the radio; check for interference.
    • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

    USB Serial

    USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

    Setup

    1. Connect your radio via USB cable to your device.
    2. The app will prompt for USB permission — tap Allow.
    3. The connection is established automatically.

    ⚠️ Note: USB connections require OTG support on Android devices.

    TCP/IP (Network)

    Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

    Connecting over the Network

    1. Make sure the radio is on the same local network as your phone/desktop.
    2. On the Connect screen, select Network in the transport selector.
    3. Choose the radio one of two ways:
      • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
      • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
    4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

    💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

    When to Use TCP

    • Radio is on the same local network
    • Testing with a simulated radio
    • Environments where Bluetooth has interference issues

    Reconnection Behavior

    The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

    To disconnect, tap the disconnect button on the Connect screen:

    Disconnect from radio

    Desktop Connections

    On Desktop (Linux/macOS/Windows), the app supports:

    • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
    • USB Serial — primary wired connection method
    • TCP/IP — for network-connected radios

    See Desktop App for platform-specific details and keyboard shortcuts.



    diff --git a/main/ga-rIE/user/onboarding.html b/main/ga-rIE/user/onboarding.html index 71e117bc6f..64bae989cb 100644 --- a/main/ga-rIE/user/onboarding.html +++ b/main/ga-rIE/user/onboarding.html @@ -1 +1 @@ - Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Gaeilge
    Meshtastic Docs ↗

    🌐 Gaeilge — Community translation View in English

    Getting Started

    Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

    First Launch

    When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings.

    Welcome Screen

    The welcome screen introduces Meshtastic and its core capabilities:

    • Off-grid mesh communication
    • No cellular or internet required
    • End-to-end encrypted messaging

    Tap Get Started to proceed through the setup flow.

    Welcome screen

    Permissions

    The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

    Bluetooth Permission

    Bluetooth is the primary connection method between your phone and Meshtastic radio:

    • Bluetooth scanning — discover nearby Meshtastic radios
    • Bluetooth connect — establish and maintain connections with paired radios

    Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

    Location Permission

    ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice.

    Meshtastic also uses your location for:

    • Showing your position on the mesh map
    • Calculating distances to other nodes
    • Sharing your GPS coordinates with other mesh members (if enabled)

    Grant “While using the app” or “Always” depending on your preference:

    • While using the app — position updates only when the app is open
    • Always — enables background position updates for always-on mesh presence

    If denied, Bluetooth scanning will not function and your node will not report a position.

    Notifications Permission

    Notifications alert you to:

    • Incoming messages from channels and direct messages
    • New nodes joining the mesh
    • Low battery on a remote node

    💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

    Critical Alerts Permission

    On supported devices, the app may request permission for critical alerts:

    • These are high-priority notifications that can break through Do Not Disturb mode
    • Useful for emergency mesh alerts or urgent messages
    • You can skip this step if you don’t need breakthrough notifications
    • Configure or revoke later in Android notification settings

    After Setup

    Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

    💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use.

    What’s Next?

    Once connected to a radio, explore:

    New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



    + Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Gaeilge
    Meshtastic Docs ↗

    🌐 Gaeilge — Community translation View in English

    Getting Started

    Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

    First Launch

    When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app.

    Welcome Screen

    The welcome screen introduces Meshtastic and its core capabilities:

    • Off-grid mesh communication
    • No cellular or internet required
    • End-to-end encrypted messaging

    Tap Get Started to proceed through the setup flow.

    Welcome screen

    Permissions

    The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

    Bluetooth Permission

    Bluetooth is the primary connection method between your phone and Meshtastic radio:

    • Bluetooth scanning — discover nearby Meshtastic radios
    • Bluetooth connect — establish and maintain connections with paired radios

    Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

    Location Permission

    ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio.

    Meshtastic also uses your location for:

    • Showing your position on the mesh map
    • Calculating distances to other nodes
    • Sharing your GPS coordinates with other mesh members (if enabled)

    Grant “While using the app” or “Always” depending on your preference:

    • While using the app — position updates only when the app is open
    • Always — enables background position updates for always-on mesh presence

    Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind.

    Notifications Permission

    Notifications alert you to:

    • Incoming messages from channels and direct messages
    • New nodes joining the mesh
    • Low battery on a remote node

    💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

    Critical Alerts Permission

    On supported devices, the app may request permission for critical alerts:

    • These are high-priority notifications that can break through Do Not Disturb mode
    • Useful for emergency mesh alerts or urgent messages
    • You can skip this step if you don’t need breakthrough notifications
    • Configure or revoke later in Android notification settings

    Reviewing permissions later

    Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time:

    State What tapping the row does
    Allowed Opens the system page, so you can review or revoke it
    Not asked yet Requests it
    Denied — tap to allow Explains what the permission is for, then asks again if you agree
    Blocked — tap to open system settings Android will no longer show its dialog, so this opens the page where you can turn it back on
    Not required on this version of Android Nothing — the permission does not exist on your device

    This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead.

    After Setup

    Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

    💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own.

    Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing.

    What’s Next?

    Once connected to a radio, explore:

    New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



    diff --git a/main/gl-rES/user/connections.html b/main/gl-rES/user/connections.html index 43d65d6ffe..6b6a0de042 100644 --- a/main/gl-rES/user/connections.html +++ b/main/gl-rES/user/connections.html @@ -1 +1 @@ - Connections | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Galego
    Meshtastic Docs ↗

    🌐 Galego — Community translation View in English

    Connections

    Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

    Bluetooth (BLE)

    Bluetooth Low Energy is the default and most common connection method on Android.

    Pairing a Device

    1. Ensure your Meshtastic radio is powered on and in pairing mode.
    2. Open the app and navigate to the Connect tab.
    3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
    4. Select your device from the list.
    5. Accept the Bluetooth pairing prompt if shown.

    Scanning for Bluetooth devices, with a discovered radio in the list

    Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

    Transport selector

    💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device.

    Connection Status

    Icon State Descrición
    🟢 Connected Active radio link established
    🟡 Connecting Handshake in progress
    🔴 Desconectado No active connection
    Not configured No device selected

    When connecting, a status indicator shows the current connection state:

    Connecting status

    If no devices are found, the app shows an empty state with instructions:

    No devices found

    Troubleshooting Bluetooth

    • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
    • Connection drops: Move closer to the radio; check for interference.
    • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

    USB Serial

    USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

    Setup

    1. Connect your radio via USB cable to your device.
    2. The app will prompt for USB permission — tap Allow.
    3. The connection is established automatically.

    ⚠️ Note: USB connections require OTG support on Android devices.

    TCP/IP (Network)

    Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

    Connecting over the Network

    1. Make sure the radio is on the same local network as your phone/desktop.
    2. On the Connect screen, select Network in the transport selector.
    3. Choose the radio one of two ways:
      • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
      • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
    4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

    💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

    When to Use TCP

    • Radio is on the same local network
    • Testing with a simulated radio
    • Environments where Bluetooth has interference issues

    Reconnection Behavior

    The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

    To disconnect, tap the disconnect button on the Connect screen:

    Disconnect from radio

    Desktop Connections

    On Desktop (Linux/macOS/Windows), the app supports:

    • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
    • USB Serial — primary wired connection method
    • TCP/IP — for network-connected radios

    See Desktop App for platform-specific details and keyboard shortcuts.



    + Connections | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Galego
    Meshtastic Docs ↗

    🌐 Galego — Community translation View in English

    Connections

    Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

    Bluetooth (BLE)

    Bluetooth Low Energy is the default and most common connection method on Android.

    Pairing a Device

    1. Ensure your Meshtastic radio is powered on and in pairing mode.
    2. Open the app and navigate to the Connect tab.
    3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
    4. Select your device from the list.
    5. Accept the Bluetooth pairing prompt if shown.

    Scanning for Bluetooth devices, with a discovered radio in the list

    Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

    Transport selector

    💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range.

    The screen names anything on the app’s side that is blocking a scan, with the fix attached:

    What you see What it means
    A card asking for Nearby devices The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings.
    Bluetooth is off The adapter is disabled — the card opens Bluetooth settings.
    Bluetooth scanning also needs location services Android 11 and older only: the permission is held but the system location toggle is off.
    No card, empty list Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere.

    Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered.

    Connection Status

    Icon State Descrición
    🟢 Connected Active radio link established
    🟡 Connecting Handshake in progress
    🔴 Desconectado No active connection
    Not configured No device selected

    When connecting, a status indicator shows the current connection state:

    Connecting status

    If no devices are found, the app shows an empty state with instructions:

    No devices found

    Troubleshooting Bluetooth

    • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
    • Connection drops: Move closer to the radio; check for interference.
    • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

    USB Serial

    USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

    Setup

    1. Connect your radio via USB cable to your device.
    2. The app will prompt for USB permission — tap Allow.
    3. The connection is established automatically.

    ⚠️ Note: USB connections require OTG support on Android devices.

    TCP/IP (Network)

    Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

    Connecting over the Network

    1. Make sure the radio is on the same local network as your phone/desktop.
    2. On the Connect screen, select Network in the transport selector.
    3. Choose the radio one of two ways:
      • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
      • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
    4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

    💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

    When to Use TCP

    • Radio is on the same local network
    • Testing with a simulated radio
    • Environments where Bluetooth has interference issues

    Reconnection Behavior

    The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

    To disconnect, tap the disconnect button on the Connect screen:

    Disconnect from radio

    Desktop Connections

    On Desktop (Linux/macOS/Windows), the app supports:

    • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
    • USB Serial — primary wired connection method
    • TCP/IP — for network-connected radios

    See Desktop App for platform-specific details and keyboard shortcuts.



    diff --git a/main/gl-rES/user/onboarding.html b/main/gl-rES/user/onboarding.html index 2380bd5c8d..633c42b3eb 100644 --- a/main/gl-rES/user/onboarding.html +++ b/main/gl-rES/user/onboarding.html @@ -1 +1 @@ - Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Galego
    Meshtastic Docs ↗

    🌐 Galego — Community translation View in English

    Getting Started

    Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

    First Launch

    When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings.

    Welcome Screen

    The welcome screen introduces Meshtastic and its core capabilities:

    • Off-grid mesh communication
    • No cellular or internet required
    • End-to-end encrypted messaging

    Tap Get Started to proceed through the setup flow.

    Welcome screen

    Permissions

    The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

    Bluetooth Permission

    Bluetooth is the primary connection method between your phone and Meshtastic radio:

    • Bluetooth scanning — discover nearby Meshtastic radios
    • Bluetooth connect — establish and maintain connections with paired radios

    Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

    Location Permission

    ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice.

    Meshtastic also uses your location for:

    • Showing your position on the mesh map
    • Calculating distances to other nodes
    • Sharing your GPS coordinates with other mesh members (if enabled)

    Grant “While using the app” or “Always” depending on your preference:

    • While using the app — position updates only when the app is open
    • Always — enables background position updates for always-on mesh presence

    If denied, Bluetooth scanning will not function and your node will not report a position.

    Notifications Permission

    Notifications alert you to:

    • Incoming messages from channels and direct messages
    • New nodes joining the mesh
    • Low battery on a remote node

    💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

    Critical Alerts Permission

    On supported devices, the app may request permission for critical alerts:

    • These are high-priority notifications that can break through Do Not Disturb mode
    • Useful for emergency mesh alerts or urgent messages
    • You can skip this step if you don’t need breakthrough notifications
    • Configure or revoke later in Android notification settings

    After Setup

    Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

    💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use.

    What’s Next?

    Once connected to a radio, explore:

    New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



    + Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Galego
    Meshtastic Docs ↗

    🌐 Galego — Community translation View in English

    Getting Started

    Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

    First Launch

    When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app.

    Welcome Screen

    The welcome screen introduces Meshtastic and its core capabilities:

    • Off-grid mesh communication
    • No cellular or internet required
    • End-to-end encrypted messaging

    Tap Get Started to proceed through the setup flow.

    Welcome screen

    Permissions

    The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

    Bluetooth Permission

    Bluetooth is the primary connection method between your phone and Meshtastic radio:

    • Bluetooth scanning — discover nearby Meshtastic radios
    • Bluetooth connect — establish and maintain connections with paired radios

    Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

    Location Permission

    ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio.

    Meshtastic also uses your location for:

    • Showing your position on the mesh map
    • Calculating distances to other nodes
    • Sharing your GPS coordinates with other mesh members (if enabled)

    Grant “While using the app” or “Always” depending on your preference:

    • While using the app — position updates only when the app is open
    • Always — enables background position updates for always-on mesh presence

    Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind.

    Notifications Permission

    Notifications alert you to:

    • Incoming messages from channels and direct messages
    • New nodes joining the mesh
    • Low battery on a remote node

    💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

    Critical Alerts Permission

    On supported devices, the app may request permission for critical alerts:

    • These are high-priority notifications that can break through Do Not Disturb mode
    • Useful for emergency mesh alerts or urgent messages
    • You can skip this step if you don’t need breakthrough notifications
    • Configure or revoke later in Android notification settings

    Reviewing permissions later

    Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time:

    State What tapping the row does
    Allowed Opens the system page, so you can review or revoke it
    Not asked yet Requests it
    Denied — tap to allow Explains what the permission is for, then asks again if you agree
    Blocked — tap to open system settings Android will no longer show its dialog, so this opens the page where you can turn it back on
    Not required on this version of Android Nothing — the permission does not exist on your device

    This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead.

    After Setup

    Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

    💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own.

    Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing.

    What’s Next?

    Once connected to a radio, explore:

    New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



    diff --git a/main/hr-rHR/user/connections.html b/main/hr-rHR/user/connections.html index 2551f0a88f..5ed84d2a53 100644 --- a/main/hr-rHR/user/connections.html +++ b/main/hr-rHR/user/connections.html @@ -1 +1 @@ - Connections | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Hrvatski
    Meshtastic Docs ↗

    🌐 Hrvatski — Community translation View in English

    Connections

    Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

    Bluetooth (BLE)

    Bluetooth Low Energy is the default and most common connection method on Android.

    Pairing a Device

    1. Ensure your Meshtastic radio is powered on and in pairing mode.
    2. Open the app and navigate to the Connect tab.
    3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
    4. Select your device from the list.
    5. Accept the Bluetooth pairing prompt if shown.

    Scanning for Bluetooth devices, with a discovered radio in the list

    Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

    Transport selector

    💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device.

    Connection Status

    Icon State Opis
    🟢 Connected Active radio link established
    🟡 Connecting Handshake in progress
    🔴 Odspojeno No active connection
    Not configured No device selected

    When connecting, a status indicator shows the current connection state:

    Connecting status

    If no devices are found, the app shows an empty state with instructions:

    No devices found

    Troubleshooting Bluetooth

    • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
    • Connection drops: Move closer to the radio; check for interference.
    • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

    USB Serial

    USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

    Setup

    1. Connect your radio via USB cable to your device.
    2. The app will prompt for USB permission — tap Allow.
    3. The connection is established automatically.

    ⚠️ Note: USB connections require OTG support on Android devices.

    TCP/IP (Network)

    Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

    Connecting over the Network

    1. Make sure the radio is on the same local network as your phone/desktop.
    2. On the Connect screen, select Network in the transport selector.
    3. Choose the radio one of two ways:
      • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
      • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
    4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

    💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

    When to Use TCP

    • Radio is on the same local network
    • Testing with a simulated radio
    • Environments where Bluetooth has interference issues

    Reconnection Behavior

    The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

    To disconnect, tap the disconnect button on the Connect screen:

    Disconnect from radio

    Desktop Connections

    On Desktop (Linux/macOS/Windows), the app supports:

    • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
    • USB Serial — primary wired connection method
    • TCP/IP — for network-connected radios

    See Desktop App for platform-specific details and keyboard shortcuts.



    + Connections | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Hrvatski
    Meshtastic Docs ↗

    🌐 Hrvatski — Community translation View in English

    Connections

    Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

    Bluetooth (BLE)

    Bluetooth Low Energy is the default and most common connection method on Android.

    Pairing a Device

    1. Ensure your Meshtastic radio is powered on and in pairing mode.
    2. Open the app and navigate to the Connect tab.
    3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
    4. Select your device from the list.
    5. Accept the Bluetooth pairing prompt if shown.

    Scanning for Bluetooth devices, with a discovered radio in the list

    Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

    Transport selector

    💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range.

    The screen names anything on the app’s side that is blocking a scan, with the fix attached:

    What you see What it means
    A card asking for Nearby devices The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings.
    Bluetooth is off The adapter is disabled — the card opens Bluetooth settings.
    Bluetooth scanning also needs location services Android 11 and older only: the permission is held but the system location toggle is off.
    No card, empty list Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere.

    Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered.

    Connection Status

    Icon State Opis
    🟢 Connected Active radio link established
    🟡 Connecting Handshake in progress
    🔴 Odspojeno No active connection
    Not configured No device selected

    When connecting, a status indicator shows the current connection state:

    Connecting status

    If no devices are found, the app shows an empty state with instructions:

    No devices found

    Troubleshooting Bluetooth

    • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
    • Connection drops: Move closer to the radio; check for interference.
    • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

    USB Serial

    USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

    Setup

    1. Connect your radio via USB cable to your device.
    2. The app will prompt for USB permission — tap Allow.
    3. The connection is established automatically.

    ⚠️ Note: USB connections require OTG support on Android devices.

    TCP/IP (Network)

    Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

    Connecting over the Network

    1. Make sure the radio is on the same local network as your phone/desktop.
    2. On the Connect screen, select Network in the transport selector.
    3. Choose the radio one of two ways:
      • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
      • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
    4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

    💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

    When to Use TCP

    • Radio is on the same local network
    • Testing with a simulated radio
    • Environments where Bluetooth has interference issues

    Reconnection Behavior

    The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

    To disconnect, tap the disconnect button on the Connect screen:

    Disconnect from radio

    Desktop Connections

    On Desktop (Linux/macOS/Windows), the app supports:

    • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
    • USB Serial — primary wired connection method
    • TCP/IP — for network-connected radios

    See Desktop App for platform-specific details and keyboard shortcuts.



    diff --git a/main/hr-rHR/user/onboarding.html b/main/hr-rHR/user/onboarding.html index f674bd1d29..2a1dd2a1c2 100644 --- a/main/hr-rHR/user/onboarding.html +++ b/main/hr-rHR/user/onboarding.html @@ -1 +1 @@ - Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Hrvatski
    Meshtastic Docs ↗

    🌐 Hrvatski — Community translation View in English

    Getting Started

    Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

    First Launch

    When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings.

    Welcome Screen

    The welcome screen introduces Meshtastic and its core capabilities:

    • Off-grid mesh communication
    • No cellular or internet required
    • End-to-end encrypted messaging

    Tap Get Started to proceed through the setup flow.

    Welcome screen

    Permissions

    The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

    Bluetooth Permission

    Bluetooth is the primary connection method between your phone and Meshtastic radio:

    • Bluetooth scanning — discover nearby Meshtastic radios
    • Bluetooth connect — establish and maintain connections with paired radios

    Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

    Location Permission

    ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice.

    Meshtastic also uses your location for:

    • Showing your position on the mesh map
    • Calculating distances to other nodes
    • Sharing your GPS coordinates with other mesh members (if enabled)

    Grant “While using the app” or “Always” depending on your preference:

    • While using the app — position updates only when the app is open
    • Always — enables background position updates for always-on mesh presence

    If denied, Bluetooth scanning will not function and your node will not report a position.

    Notifications Permission

    Notifications alert you to:

    • Incoming messages from channels and direct messages
    • New nodes joining the mesh
    • Low battery on a remote node

    💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

    Critical Alerts Permission

    On supported devices, the app may request permission for critical alerts:

    • These are high-priority notifications that can break through Do Not Disturb mode
    • Useful for emergency mesh alerts or urgent messages
    • You can skip this step if you don’t need breakthrough notifications
    • Configure or revoke later in Android notification settings

    After Setup

    Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

    💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use.

    What’s Next?

    Once connected to a radio, explore:

    New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



    + Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Hrvatski
    Meshtastic Docs ↗

    🌐 Hrvatski — Community translation View in English

    Getting Started

    Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

    First Launch

    When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app.

    Welcome Screen

    The welcome screen introduces Meshtastic and its core capabilities:

    • Off-grid mesh communication
    • No cellular or internet required
    • End-to-end encrypted messaging

    Tap Get Started to proceed through the setup flow.

    Welcome screen

    Permissions

    The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

    Bluetooth Permission

    Bluetooth is the primary connection method between your phone and Meshtastic radio:

    • Bluetooth scanning — discover nearby Meshtastic radios
    • Bluetooth connect — establish and maintain connections with paired radios

    Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

    Location Permission

    ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio.

    Meshtastic also uses your location for:

    • Showing your position on the mesh map
    • Calculating distances to other nodes
    • Sharing your GPS coordinates with other mesh members (if enabled)

    Grant “While using the app” or “Always” depending on your preference:

    • While using the app — position updates only when the app is open
    • Always — enables background position updates for always-on mesh presence

    Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind.

    Notifications Permission

    Notifications alert you to:

    • Incoming messages from channels and direct messages
    • New nodes joining the mesh
    • Low battery on a remote node

    💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

    Critical Alerts Permission

    On supported devices, the app may request permission for critical alerts:

    • These are high-priority notifications that can break through Do Not Disturb mode
    • Useful for emergency mesh alerts or urgent messages
    • You can skip this step if you don’t need breakthrough notifications
    • Configure or revoke later in Android notification settings

    Reviewing permissions later

    Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time:

    State What tapping the row does
    Allowed Opens the system page, so you can review or revoke it
    Not asked yet Requests it
    Denied — tap to allow Explains what the permission is for, then asks again if you agree
    Blocked — tap to open system settings Android will no longer show its dialog, so this opens the page where you can turn it back on
    Not required on this version of Android Nothing — the permission does not exist on your device

    This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead.

    After Setup

    Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

    💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own.

    Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing.

    What’s Next?

    Once connected to a radio, explore:

    New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



    diff --git a/main/ht-rHT/user/connections.html b/main/ht-rHT/user/connections.html index 8e81b73079..21b510b8df 100644 --- a/main/ht-rHT/user/connections.html +++ b/main/ht-rHT/user/connections.html @@ -1 +1 @@ - Connections | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Kreyòl Ayisyen
    Meshtastic Docs ↗

    🌐 Kreyòl Ayisyen — Community translation View in English

    Connections

    Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

    Bluetooth (BLE)

    Bluetooth Low Energy is the default and most common connection method on Android.

    Pairing a Device

    1. Ensure your Meshtastic radio is powered on and in pairing mode.
    2. Open the app and navigate to the Connect tab.
    3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
    4. Select your device from the list.
    5. Accept the Bluetooth pairing prompt if shown.

    Scanning for Bluetooth devices, with a discovered radio in the list

    Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

    Transport selector

    💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device.

    Connection Status

    Icon State Deskripsyon
    🟢 Connected Active radio link established
    🟡 Connecting Handshake in progress
    🔴 Dekonekte No active connection
    Not configured No device selected

    When connecting, a status indicator shows the current connection state:

    Connecting status

    If no devices are found, the app shows an empty state with instructions:

    No devices found

    Troubleshooting Bluetooth

    • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
    • Connection drops: Move closer to the radio; check for interference.
    • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

    USB Serial

    USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

    Setup

    1. Connect your radio via USB cable to your device.
    2. The app will prompt for USB permission — tap Allow.
    3. The connection is established automatically.

    ⚠️ Note: USB connections require OTG support on Android devices.

    TCP/IP (Network)

    Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

    Connecting over the Network

    1. Make sure the radio is on the same local network as your phone/desktop.
    2. On the Connect screen, select Network in the transport selector.
    3. Choose the radio one of two ways:
      • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
      • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
    4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

    💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

    When to Use TCP

    • Radio is on the same local network
    • Testing with a simulated radio
    • Environments where Bluetooth has interference issues

    Reconnection Behavior

    The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

    To disconnect, tap the disconnect button on the Connect screen:

    Disconnect from radio

    Desktop Connections

    On Desktop (Linux/macOS/Windows), the app supports:

    • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
    • USB Serial — primary wired connection method
    • TCP/IP — for network-connected radios

    See Desktop App for platform-specific details and keyboard shortcuts.



    + Connections | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Kreyòl Ayisyen
    Meshtastic Docs ↗

    🌐 Kreyòl Ayisyen — Community translation View in English

    Connections

    Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

    Bluetooth (BLE)

    Bluetooth Low Energy is the default and most common connection method on Android.

    Pairing a Device

    1. Ensure your Meshtastic radio is powered on and in pairing mode.
    2. Open the app and navigate to the Connect tab.
    3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
    4. Select your device from the list.
    5. Accept the Bluetooth pairing prompt if shown.

    Scanning for Bluetooth devices, with a discovered radio in the list

    Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

    Transport selector

    💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range.

    The screen names anything on the app’s side that is blocking a scan, with the fix attached:

    What you see What it means
    A card asking for Nearby devices The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings.
    Bluetooth is off The adapter is disabled — the card opens Bluetooth settings.
    Bluetooth scanning also needs location services Android 11 and older only: the permission is held but the system location toggle is off.
    No card, empty list Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere.

    Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered.

    Connection Status

    Icon State Deskripsyon
    🟢 Connected Active radio link established
    🟡 Connecting Handshake in progress
    🔴 Dekonekte No active connection
    Not configured No device selected

    When connecting, a status indicator shows the current connection state:

    Connecting status

    If no devices are found, the app shows an empty state with instructions:

    No devices found

    Troubleshooting Bluetooth

    • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
    • Connection drops: Move closer to the radio; check for interference.
    • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

    USB Serial

    USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

    Setup

    1. Connect your radio via USB cable to your device.
    2. The app will prompt for USB permission — tap Allow.
    3. The connection is established automatically.

    ⚠️ Note: USB connections require OTG support on Android devices.

    TCP/IP (Network)

    Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

    Connecting over the Network

    1. Make sure the radio is on the same local network as your phone/desktop.
    2. On the Connect screen, select Network in the transport selector.
    3. Choose the radio one of two ways:
      • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
      • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
    4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

    💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

    When to Use TCP

    • Radio is on the same local network
    • Testing with a simulated radio
    • Environments where Bluetooth has interference issues

    Reconnection Behavior

    The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

    To disconnect, tap the disconnect button on the Connect screen:

    Disconnect from radio

    Desktop Connections

    On Desktop (Linux/macOS/Windows), the app supports:

    • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
    • USB Serial — primary wired connection method
    • TCP/IP — for network-connected radios

    See Desktop App for platform-specific details and keyboard shortcuts.



    diff --git a/main/ht-rHT/user/onboarding.html b/main/ht-rHT/user/onboarding.html index 3390ca8791..97c35adbdf 100644 --- a/main/ht-rHT/user/onboarding.html +++ b/main/ht-rHT/user/onboarding.html @@ -1 +1 @@ - Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Kreyòl Ayisyen
    Meshtastic Docs ↗

    🌐 Kreyòl Ayisyen — Community translation View in English

    Getting Started

    Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

    First Launch

    When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings.

    Welcome Screen

    The welcome screen introduces Meshtastic and its core capabilities:

    • Off-grid mesh communication
    • No cellular or internet required
    • End-to-end encrypted messaging

    Tap Get Started to proceed through the setup flow.

    Welcome screen

    Permissions

    The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

    Bluetooth Permission

    Bluetooth is the primary connection method between your phone and Meshtastic radio:

    • Bluetooth scanning — discover nearby Meshtastic radios
    • Bluetooth connect — establish and maintain connections with paired radios

    Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

    Location Permission

    ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice.

    Meshtastic also uses your location for:

    • Showing your position on the mesh map
    • Calculating distances to other nodes
    • Sharing your GPS coordinates with other mesh members (if enabled)

    Grant “While using the app” or “Always” depending on your preference:

    • While using the app — position updates only when the app is open
    • Always — enables background position updates for always-on mesh presence

    If denied, Bluetooth scanning will not function and your node will not report a position.

    Notifications Permission

    Notifications alert you to:

    • Incoming messages from channels and direct messages
    • New nodes joining the mesh
    • Low battery on a remote node

    💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

    Critical Alerts Permission

    On supported devices, the app may request permission for critical alerts:

    • These are high-priority notifications that can break through Do Not Disturb mode
    • Useful for emergency mesh alerts or urgent messages
    • You can skip this step if you don’t need breakthrough notifications
    • Configure or revoke later in Android notification settings

    After Setup

    Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

    💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use.

    What’s Next?

    Once connected to a radio, explore:

    New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



    + Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Kreyòl Ayisyen
    Meshtastic Docs ↗

    🌐 Kreyòl Ayisyen — Community translation View in English

    Getting Started

    Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

    First Launch

    When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app.

    Welcome Screen

    The welcome screen introduces Meshtastic and its core capabilities:

    • Off-grid mesh communication
    • No cellular or internet required
    • End-to-end encrypted messaging

    Tap Get Started to proceed through the setup flow.

    Welcome screen

    Permissions

    The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

    Bluetooth Permission

    Bluetooth is the primary connection method between your phone and Meshtastic radio:

    • Bluetooth scanning — discover nearby Meshtastic radios
    • Bluetooth connect — establish and maintain connections with paired radios

    Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

    Location Permission

    ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio.

    Meshtastic also uses your location for:

    • Showing your position on the mesh map
    • Calculating distances to other nodes
    • Sharing your GPS coordinates with other mesh members (if enabled)

    Grant “While using the app” or “Always” depending on your preference:

    • While using the app — position updates only when the app is open
    • Always — enables background position updates for always-on mesh presence

    Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind.

    Notifications Permission

    Notifications alert you to:

    • Incoming messages from channels and direct messages
    • New nodes joining the mesh
    • Low battery on a remote node

    💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

    Critical Alerts Permission

    On supported devices, the app may request permission for critical alerts:

    • These are high-priority notifications that can break through Do Not Disturb mode
    • Useful for emergency mesh alerts or urgent messages
    • You can skip this step if you don’t need breakthrough notifications
    • Configure or revoke later in Android notification settings

    Reviewing permissions later

    Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time:

    State What tapping the row does
    Allowed Opens the system page, so you can review or revoke it
    Not asked yet Requests it
    Denied — tap to allow Explains what the permission is for, then asks again if you agree
    Blocked — tap to open system settings Android will no longer show its dialog, so this opens the page where you can turn it back on
    Not required on this version of Android Nothing — the permission does not exist on your device

    This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead.

    After Setup

    Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

    💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own.

    Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing.

    What’s Next?

    Once connected to a radio, explore:

    New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



    diff --git a/main/hu-rHU/user/connections.html b/main/hu-rHU/user/connections.html index e7b8c874b2..aca9f0052a 100644 --- a/main/hu-rHU/user/connections.html +++ b/main/hu-rHU/user/connections.html @@ -1 +1 @@ - Connections | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Magyar
    Meshtastic Docs ↗

    🌐 Magyar — Community translation View in English

    Connections

    Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

    Bluetooth (BLE)

    Bluetooth Low Energy is the default and most common connection method on Android.

    Pairing a Device

    1. Ensure your Meshtastic radio is powered on and in pairing mode.
    2. Open the app and navigate to the Connect tab.
    3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
    4. Select your device from the list.
    5. Accept the Bluetooth pairing prompt if shown.

    Scanning for Bluetooth devices, with a discovered radio in the list

    Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

    Transport selector

    💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device.

    Connection Status

    Icon State Leírás
    🟢 Csatlakoztatva Active radio link established
    🟡 Csatlakozás… Handshake in progress
    🔴 Szétkapcsolva No active connection
    Not configured No device selected

    When connecting, a status indicator shows the current connection state:

    Connecting status

    If no devices are found, the app shows an empty state with instructions:

    No devices found

    Troubleshooting Bluetooth

    • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
    • Connection drops: Move closer to the radio; check for interference.
    • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

    USB Serial

    USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

    Setup

    1. Connect your radio via USB cable to your device.
    2. The app will prompt for USB permission — tap Allow.
    3. The connection is established automatically.

    ⚠️ Note: USB connections require OTG support on Android devices.

    TCP/IP (Network)

    Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

    Connecting over the Network

    1. Make sure the radio is on the same local network as your phone/desktop.
    2. On the Connect screen, select Network in the transport selector.
    3. Choose the radio one of two ways:
      • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
      • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
    4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

    💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

    When to Use TCP

    • Radio is on the same local network
    • Testing with a simulated radio
    • Environments where Bluetooth has interference issues

    Reconnection Behavior

    The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

    To disconnect, tap the disconnect button on the Connect screen:

    Disconnect from radio

    Desktop Connections

    On Desktop (Linux/macOS/Windows), the app supports:

    • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
    • USB Serial — primary wired connection method
    • TCP/IP — for network-connected radios

    See Desktop App for platform-specific details and keyboard shortcuts.



    + Connections | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Magyar
    Meshtastic Docs ↗

    🌐 Magyar — Community translation View in English

    Connections

    Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

    Bluetooth (BLE)

    Bluetooth Low Energy is the default and most common connection method on Android.

    Pairing a Device

    1. Ensure your Meshtastic radio is powered on and in pairing mode.
    2. Open the app and navigate to the Connect tab.
    3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
    4. Select your device from the list.
    5. Accept the Bluetooth pairing prompt if shown.

    Scanning for Bluetooth devices, with a discovered radio in the list

    Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

    Transport selector

    💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range.

    The screen names anything on the app’s side that is blocking a scan, with the fix attached:

    What you see What it means
    A card asking for Nearby devices The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings.
    Bluetooth is off The adapter is disabled — the card opens Bluetooth settings.
    Bluetooth scanning also needs location services Android 11 and older only: the permission is held but the system location toggle is off.
    No card, empty list Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere.

    Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered.

    Connection Status

    Icon State Leírás
    🟢 Csatlakoztatva Active radio link established
    🟡 Csatlakozás… Handshake in progress
    🔴 Szétkapcsolva No active connection
    Not configured No device selected

    When connecting, a status indicator shows the current connection state:

    Connecting status

    If no devices are found, the app shows an empty state with instructions:

    No devices found

    Troubleshooting Bluetooth

    • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
    • Connection drops: Move closer to the radio; check for interference.
    • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

    USB Serial

    USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

    Setup

    1. Connect your radio via USB cable to your device.
    2. The app will prompt for USB permission — tap Allow.
    3. The connection is established automatically.

    ⚠️ Note: USB connections require OTG support on Android devices.

    TCP/IP (Network)

    Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

    Connecting over the Network

    1. Make sure the radio is on the same local network as your phone/desktop.
    2. On the Connect screen, select Network in the transport selector.
    3. Choose the radio one of two ways:
      • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
      • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
    4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

    💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

    When to Use TCP

    • Radio is on the same local network
    • Testing with a simulated radio
    • Environments where Bluetooth has interference issues

    Reconnection Behavior

    The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

    To disconnect, tap the disconnect button on the Connect screen:

    Disconnect from radio

    Desktop Connections

    On Desktop (Linux/macOS/Windows), the app supports:

    • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
    • USB Serial — primary wired connection method
    • TCP/IP — for network-connected radios

    See Desktop App for platform-specific details and keyboard shortcuts.



    diff --git a/main/hu-rHU/user/onboarding.html b/main/hu-rHU/user/onboarding.html index ea048050d1..508584df9e 100644 --- a/main/hu-rHU/user/onboarding.html +++ b/main/hu-rHU/user/onboarding.html @@ -1 +1 @@ - Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Magyar
    Meshtastic Docs ↗

    🌐 Magyar — Community translation View in English

    Getting Started

    Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

    First Launch

    When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings.

    Welcome Screen

    The welcome screen introduces Meshtastic and its core capabilities:

    • Off-grid mesh communication
    • No cellular or internet required
    • End-to-end encrypted messaging

    Tap Get Started to proceed through the setup flow.

    Welcome screen

    Permissions

    The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

    Bluetooth Permission

    Bluetooth is the primary connection method between your phone and Meshtastic radio:

    • Bluetooth scanning — discover nearby Meshtastic radios
    • Bluetooth connect — establish and maintain connections with paired radios

    Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

    Location Permission

    ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice.

    Meshtastic also uses your location for:

    • Showing your position on the mesh map
    • Calculating distances to other nodes
    • Sharing your GPS coordinates with other mesh members (if enabled)

    Grant “While using the app” or “Always” depending on your preference:

    • While using the app — position updates only when the app is open
    • Always — enables background position updates for always-on mesh presence

    If denied, Bluetooth scanning will not function and your node will not report a position.

    Notifications Permission

    Notifications alert you to:

    • Incoming messages from channels and direct messages
    • New nodes joining the mesh
    • Low battery on a remote node

    💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

    Critical Alerts Permission

    On supported devices, the app may request permission for critical alerts:

    • These are high-priority notifications that can break through Do Not Disturb mode
    • Useful for emergency mesh alerts or urgent messages
    • You can skip this step if you don’t need breakthrough notifications
    • Configure or revoke later in Android notification settings

    After Setup

    Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

    💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use.

    What’s Next?

    Once connected to a radio, explore:

    New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



    + Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Magyar
    Meshtastic Docs ↗

    🌐 Magyar — Community translation View in English

    Getting Started

    Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

    First Launch

    When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app.

    Welcome Screen

    The welcome screen introduces Meshtastic and its core capabilities:

    • Off-grid mesh communication
    • No cellular or internet required
    • End-to-end encrypted messaging

    Tap Get Started to proceed through the setup flow.

    Welcome screen

    Permissions

    The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

    Bluetooth Permission

    Bluetooth is the primary connection method between your phone and Meshtastic radio:

    • Bluetooth scanning — discover nearby Meshtastic radios
    • Bluetooth connect — establish and maintain connections with paired radios

    Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

    Location Permission

    ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio.

    Meshtastic also uses your location for:

    • Showing your position on the mesh map
    • Calculating distances to other nodes
    • Sharing your GPS coordinates with other mesh members (if enabled)

    Grant “While using the app” or “Always” depending on your preference:

    • While using the app — position updates only when the app is open
    • Always — enables background position updates for always-on mesh presence

    Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind.

    Notifications Permission

    Notifications alert you to:

    • Incoming messages from channels and direct messages
    • New nodes joining the mesh
    • Low battery on a remote node

    💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

    Critical Alerts Permission

    On supported devices, the app may request permission for critical alerts:

    • These are high-priority notifications that can break through Do Not Disturb mode
    • Useful for emergency mesh alerts or urgent messages
    • You can skip this step if you don’t need breakthrough notifications
    • Configure or revoke later in Android notification settings

    Reviewing permissions later

    Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time:

    State What tapping the row does
    Allowed Opens the system page, so you can review or revoke it
    Not asked yet Requests it
    Denied — tap to allow Explains what the permission is for, then asks again if you agree
    Blocked — tap to open system settings Android will no longer show its dialog, so this opens the page where you can turn it back on
    Not required on this version of Android Nothing — the permission does not exist on your device

    This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead.

    After Setup

    Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

    💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own.

    Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing.

    What’s Next?

    Once connected to a radio, explore:

    New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



    diff --git a/main/index.json b/main/index.json index 1ad032edd6..d2d653194e 100644 --- a/main/index.json +++ b/main/index.json @@ -33,7 +33,7 @@ {"id":"transport","title":"Transport","section":"developer","locale":"en","resourcePath":"docs/developer/transport.html","navOrder":5,"keywords":["transport", "abstraction", "bluetooth", "low", "energy", "ble", "key", "classes", "usb", "serial", "tcp", "factory", "connection", "lifecycle", "adding", "new"],"aliases":["ble", "serial", "tcp", "radio-transport"],"charCount":3210}, {"id":"android-auto","title":"Android Auto","section":"user","locale":"ar-rSA","resourcePath":"docs/ar-rSA/user/android-auto.html","navOrder":18,"keywords":["android", "auto", "overview", "nodes", "status", "related", "topics"],"aliases":["android-auto", "car", "head-unit", "auto"],"charCount":2937}, {"id":"app-functions","title":"App Functions","section":"user","locale":"ar-rSA","resourcePath":"docs/ar-rSA/user/app-functions.html","navOrder":19,"keywords":["app", "functions", "enabling", "write", "read", "privacy", "related", "topics"],"aliases":["app-functions", "system-ai", "gemini", "assistant"],"charCount":3516}, - {"id":"connections","title":"Connections","section":"user","locale":"ar-rSA","resourcePath":"docs/ar-rSA/user/connections.html","navOrder":2,"keywords":["connections", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":4954}, + {"id":"connections","title":"Connections","section":"user","locale":"ar-rSA","resourcePath":"docs/ar-rSA/user/connections.html","navOrder":2,"keywords":["connections", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":6443}, {"id":"debug-logs","title":"Debug Logs","section":"user","locale":"ar-rSA","resourcePath":"docs/ar-rSA/user/debug-logs.html","navOrder":22,"keywords":["debug", "logs", "the", "two", "tabs", "viewing", "app", "exporting", "desktop", "related", "topics"],"aliases":["debug-logs", "logcat", "app-logs", "bug-report"],"charCount":3003}, {"id":"desktop","title":"Desktop App","section":"user","locale":"ar-rSA","resourcePath":"docs/ar-rSA/user/desktop.html","navOrder":14,"keywords":["desktop", "app", "installation", "linux", "macos", "windows", "connecting", "your", "radio", "usb", "serial", "primary", "tcp", "bluetooth", "ble", "feature", "parity", "differences", "keyboard", "shortcuts", "window", "system", "tray", "notification", "preferences", "built", "documentation", "browser", "building", "from"],"aliases":["desktop", "linux", "macos", "windows", "jvm"],"charCount":6180}, {"id":"discovery","title":"Discovery","section":"user","locale":"ar-rSA","resourcePath":"docs/ar-rSA/user/discovery.html","navOrder":12,"keywords":["discovery", "local", "mesh", "scanner", "setting", "scan", "live", "progress", "reading", "the", "results", "beacon", "manual", "exploration", "traceroute", "running", "troubleshooting", "with", "neighbor", "info", "enabling", "viewing", "data", "node", "list", "tool", "finding", "new", "nodes", "assessing"],"aliases":["mesh-discovery", "local-discovery", "network-scan", "traceroute", "neighbor-info"],"charCount":12524}, @@ -44,7 +44,7 @@ {"id":"mqtt","title":"MQTT","section":"user","locale":"ar-rSA","resourcePath":"docs/ar-rSA/user/mqtt.html","navOrder":11,"keywords":["mqtt", "overview", "how", "works", "configuration", "enabling", "proxy", "this", "phone", "default", "meshtastic", "broker", "private", "map", "reporting", "uplink", "downlink", "message", "formats", "encryption", "privacy", "best", "practices", "troubleshooting", "not", "connecting", "messages", "bridging", "related", "topics"],"aliases":["mqtt", "internet-bridge", "broker"],"charCount":7844}, {"id":"node-metrics","title":"Node Metrics","section":"user","locale":"ar-rSA","resourcePath":"docs/ar-rSA/user/node-metrics.html","navOrder":5,"keywords":["node", "metrics", "device", "environment", "air", "quality", "signal", "reference", "power", "traceroute", "reading", "results", "neighbor", "info", "viewing", "related", "topics"],"aliases":["metrics", "telemetry", "device-metrics", "signal"],"charCount":9872}, {"id":"nodes","title":"Nodes","section":"user","locale":"ar-rSA","resourcePath":"docs/ar-rSA/user/nodes.html","navOrder":4,"keywords":["nodes", "node", "list", "status", "indicators", "roles", "choosing", "role", "encryption", "quick", "actions", "filtering", "sorting", "text", "search", "filter", "toggles", "sort", "options", "per", "hop", "detail", "device", "links", "want", "one", "related", "topics"],"aliases":["node-list", "mesh-nodes", "peers", "hop-histogram"],"charCount":11264}, - {"id":"onboarding","title":"Getting Started","section":"user","locale":"ar-rSA","resourcePath":"docs/ar-rSA/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":4024}, + {"id":"onboarding","title":"Getting Started","section":"user","locale":"ar-rSA","resourcePath":"docs/ar-rSA/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "reviewing", "later", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":6885}, {"id":"settings-module-admin","title":"Settings — Modules & Admin","section":"user","locale":"ar-rSA","resourcePath":"docs/ar-rSA/user/settings-module-admin.html","navOrder":8,"keywords":["settings", "modules", "admin", "module", "configuration", "mqtt", "serial", "external", "notification", "store", "forward", "range", "test", "telemetry", "canned", "message", "audio", "remote", "hardware", "neighbor", "info", "ambient", "lighting", "detection", "sensor", "paxcounter", "tak", "administration", "clean", "node"],"aliases":["modules", "module-config", "administration"],"charCount":15873}, {"id":"settings-radio-user","title":"Settings — Radio & User","section":"user","locale":"ar-rSA","resourcePath":"docs/ar-rSA/user/settings-radio-user.html","navOrder":7,"keywords":["settings", "radio", "user", "profile", "applying", "changes", "configuration", "device", "config", "lora", "modem", "presets", "display", "position", "power", "network", "bluetooth", "security", "related", "topics"],"aliases":["الإعدادات", "radio-config", "user-config", "lora"],"charCount":14947}, {"id":"signal-meter","title":"How the Meshtastic Signal Meter Works","section":"user","locale":"ar-rSA","resourcePath":"docs/ar-rSA/user/signal-meter.html","navOrder":15,"keywords":["how", "the", "meshtastic", "signal", "meter", "works", "two", "metrics", "loudness", "clarity", "magic", "lora", "hearing", "below", "noise", "floor", "calculates", "quality", "what", "this", "means", "for", "you", "where", "information", "appears", "related", "topics"],"aliases":["signal", "signal-meter", "snr", "rssi"],"charCount":5912}, @@ -55,7 +55,7 @@ {"id":"widget","title":"Home Screen Widget","section":"user","locale":"ar-rSA","resourcePath":"docs/ar-rSA/user/widget.html","navOrder":20,"keywords":["home", "screen", "widget", "what", "shows", "adding", "the", "related", "topics"],"aliases":["widget", "home-screen-widget", "local-stats-widget"],"charCount":1856}, {"id":"android-auto","title":"Android Auto","section":"user","locale":"be-rBY","resourcePath":"docs/be-rBY/user/android-auto.html","navOrder":18,"keywords":["android", "auto", "nodes", "status", "related", "topics"],"aliases":["android-auto", "car", "head-unit", "auto"],"charCount":2939}, {"id":"app-functions","title":"App Functions","section":"user","locale":"be-rBY","resourcePath":"docs/be-rBY/user/app-functions.html","navOrder":19,"keywords":["app", "functions", "enabling", "write", "read", "privacy", "related", "topics"],"aliases":["app-functions", "system-ai", "gemini", "assistant"],"charCount":3516}, - {"id":"connections","title":"Connections","section":"user","locale":"be-rBY","resourcePath":"docs/be-rBY/user/connections.html","navOrder":2,"keywords":["connections", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":4954}, + {"id":"connections","title":"Connections","section":"user","locale":"be-rBY","resourcePath":"docs/be-rBY/user/connections.html","navOrder":2,"keywords":["connections", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":6443}, {"id":"debug-logs","title":"Debug Logs","section":"user","locale":"be-rBY","resourcePath":"docs/be-rBY/user/debug-logs.html","navOrder":22,"keywords":["debug", "logs", "the", "two", "tabs", "viewing", "app", "exporting", "desktop", "related", "topics"],"aliases":["debug-logs", "logcat", "app-logs", "bug-report"],"charCount":3003}, {"id":"desktop","title":"Desktop App","section":"user","locale":"be-rBY","resourcePath":"docs/be-rBY/user/desktop.html","navOrder":14,"keywords":["desktop", "app", "linux", "macos", "windows", "connecting", "your", "radio", "usb", "serial", "primary", "tcp", "bluetooth", "ble", "feature", "parity", "differences", "keyboard", "shortcuts", "window", "system", "tray", "notification", "preferences", "built", "documentation", "browser", "building", "from", "source"],"aliases":["desktop", "linux", "macos", "windows", "jvm"],"charCount":6177}, {"id":"discovery","title":"Discovery","section":"user","locale":"be-rBY","resourcePath":"docs/be-rBY/user/discovery.html","navOrder":12,"keywords":["discovery", "local", "mesh", "scanner", "setting", "scan", "live", "progress", "reading", "the", "results", "beacon", "manual", "exploration", "traceroute", "running", "troubleshooting", "with", "neighbor", "info", "enabling", "viewing", "data", "node", "list", "tool", "finding", "new", "nodes", "assessing"],"aliases":["mesh-discovery", "local-discovery", "network-scan", "traceroute", "neighbor-info"],"charCount":12524}, @@ -66,7 +66,7 @@ {"id":"mqtt","title":"MQTT","section":"user","locale":"be-rBY","resourcePath":"docs/be-rBY/user/mqtt.html","navOrder":11,"keywords":["mqtt", "how", "works", "enabling", "proxy", "this", "phone", "default", "meshtastic", "broker", "private", "map", "reporting", "uplink", "downlink", "message", "formats", "encryption", "privacy", "best", "practices", "troubleshooting", "not", "connecting", "messages", "bridging", "related", "topics"],"aliases":["mqtt", "internet-bridge", "broker"],"charCount":7860}, {"id":"node-metrics","title":"Node Metrics","section":"user","locale":"be-rBY","resourcePath":"docs/be-rBY/user/node-metrics.html","navOrder":5,"keywords":["node", "metrics", "device", "environment", "air", "quality", "signal", "reference", "power", "traceroute", "reading", "results", "neighbor", "info", "viewing", "related", "topics"],"aliases":["metrics", "telemetry", "device-metrics", "signal"],"charCount":9928}, {"id":"nodes","title":"Nodes","section":"user","locale":"be-rBY","resourcePath":"docs/be-rBY/user/nodes.html","navOrder":4,"keywords":["nodes", "node", "list", "status", "indicators", "roles", "choosing", "role", "encryption", "quick", "actions", "filtering", "sorting", "text", "search", "filter", "toggles", "sort", "options", "per", "hop", "detail", "device", "links", "want", "one", "related", "topics"],"aliases":["node-list", "mesh-nodes", "peers", "hop-histogram"],"charCount":11285}, - {"id":"onboarding","title":"Начало работы","section":"user","locale":"be-rBY","resourcePath":"docs/be-rBY/user/onboarding.html","navOrder":1,"keywords":["first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":4020}, + {"id":"onboarding","title":"Начало работы","section":"user","locale":"be-rBY","resourcePath":"docs/be-rBY/user/onboarding.html","navOrder":1,"keywords":["first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "reviewing", "later", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":6881}, {"id":"settings-module-admin","title":"Settings — Modules & Admin","section":"user","locale":"be-rBY","resourcePath":"docs/be-rBY/user/settings-module-admin.html","navOrder":8,"keywords":["settings", "modules", "admin", "module", "configuration", "mqtt", "serial", "external", "notification", "store", "forward", "range", "test", "telemetry", "canned", "message", "audio", "remote", "hardware", "neighbor", "info", "ambient", "lighting", "detection", "sensor", "paxcounter", "tak", "administration", "clean", "node"],"aliases":["modules", "module-config", "administration"],"charCount":15905}, {"id":"settings-radio-user","title":"Settings — Radio & User","section":"user","locale":"be-rBY","resourcePath":"docs/be-rBY/user/settings-radio-user.html","navOrder":7,"keywords":["settings", "radio", "user", "profile", "applying", "changes", "device", "config", "lora", "modem", "presets", "display", "position", "power", "network", "bluetooth", "security", "related", "topics"],"aliases":["settings", "radio-config", "user-config", "lora"],"charCount":14945}, {"id":"signal-meter","title":"How the Meshtastic Signal Meter Works","section":"user","locale":"be-rBY","resourcePath":"docs/be-rBY/user/signal-meter.html","navOrder":15,"keywords":["how", "the", "meshtastic", "signal", "meter", "works", "two", "metrics", "loudness", "clarity", "magic", "lora", "hearing", "below", "noise", "floor", "calculates", "quality", "what", "this", "means", "for", "you", "where", "information", "appears", "related", "topics"],"aliases":["signal", "signal-meter", "snr", "rssi"],"charCount":5906}, @@ -77,7 +77,7 @@ {"id":"widget","title":"Home Screen Widget","section":"user","locale":"be-rBY","resourcePath":"docs/be-rBY/user/widget.html","navOrder":20,"keywords":["home", "screen", "widget", "what", "shows", "adding", "the", "related", "topics"],"aliases":["widget", "home-screen-widget", "local-stats-widget"],"charCount":1856}, {"id":"android-auto","title":"Android Auto","section":"user","locale":"bg-rBG","resourcePath":"docs/bg-rBG/user/android-auto.html","navOrder":18,"keywords":["android", "auto", "status", "related", "topics"],"aliases":["android-auto", "car", "head-unit", "auto"],"charCount":2958}, {"id":"app-functions","title":"App Functions","section":"user","locale":"bg-rBG","resourcePath":"docs/bg-rBG/user/app-functions.html","navOrder":19,"keywords":["app", "functions", "enabling", "write", "read"],"aliases":["app-functions", "system-ai", "gemini", "assistant"],"charCount":3537}, - {"id":"connections","title":"Връзки","section":"user","locale":"bg-rBG","resourcePath":"docs/bg-rBG/user/connections.html","navOrder":2,"keywords":["bluetooth", "ble", "troubleshooting", "usb", "serial", "tcp", "network", "when", "use", "reconnection", "behavior", "desktop", "connections", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":5085}, + {"id":"connections","title":"Връзки","section":"user","locale":"bg-rBG","resourcePath":"docs/bg-rBG/user/connections.html","navOrder":2,"keywords":["bluetooth", "ble", "troubleshooting", "usb", "serial", "tcp", "network", "when", "use", "reconnection", "behavior", "desktop", "connections", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":6574}, {"id":"debug-logs","title":"Debug Logs","section":"user","locale":"bg-rBG","resourcePath":"docs/bg-rBG/user/debug-logs.html","navOrder":22,"keywords":["debug", "logs", "the", "two", "tabs", "viewing", "app", "exporting", "desktop", "related", "topics"],"aliases":["debug-logs", "logcat", "app-logs", "bug-report"],"charCount":3019}, {"id":"desktop","title":"Настолно приложение","section":"user","locale":"bg-rBG","resourcePath":"docs/bg-rBG/user/desktop.html","navOrder":14,"keywords":["linux", "macos", "windows", "connecting", "your", "radio", "usb", "serial", "primary", "tcp", "bluetooth", "ble", "feature", "parity", "differences", "window", "system", "tray", "notification", "preferences", "built", "documentation", "browser", "building", "from", "source"],"aliases":["desktop", "linux", "macos", "windows", "jvm"],"charCount":6229}, {"id":"discovery","title":"Откриване","section":"user","locale":"bg-rBG","resourcePath":"docs/bg-rBG/user/discovery.html","navOrder":12,"keywords":["local", "mesh", "discovery", "scanner", "setting", "scan", "live", "progress", "reading", "the", "results", "beacon", "manual", "exploration", "running", "traceroute", "troubleshooting", "with", "neighbor", "info", "enabling", "viewing", "data", "node", "list", "tool", "finding", "new", "nodes", "assessing"],"aliases":["mesh-discovery", "local-discovery", "network-scan", "traceroute", "neighbor-info"],"charCount":12557}, @@ -88,7 +88,7 @@ {"id":"mqtt","title":"MQTT","section":"user","locale":"bg-rBG","resourcePath":"docs/bg-rBG/user/mqtt.html","navOrder":11,"keywords":["mqtt", "enabling", "proxy", "this", "phone", "default", "meshtastic", "broker", "private", "map", "reporting", "uplink", "downlink", "message", "formats", "encryption", "privacy", "not", "connecting", "messages", "bridging"],"aliases":["mqtt", "internet-bridge", "broker"],"charCount":7923}, {"id":"node-metrics","title":"Node Metrics","section":"user","locale":"bg-rBG","resourcePath":"docs/bg-rBG/user/node-metrics.html","navOrder":5,"keywords":["node", "metrics", "air", "quality", "signal", "reference", "reading", "traceroute", "results", "neighbor", "info", "viewing", "related", "topics"],"aliases":["metrics", "telemetry", "device-metrics", "signal"],"charCount":9979}, {"id":"nodes","title":"Възли","section":"user","locale":"bg-rBG","resourcePath":"docs/bg-rBG/user/nodes.html","navOrder":4,"keywords":["node", "status", "indicators", "roles", "choosing", "role", "encryption", "quick", "actions", "filtering", "sorting", "text", "search", "filter", "toggles", "sort", "options", "nodes", "per", "hop", "detail", "device", "links", "want", "one", "related", "topics"],"aliases":["node-list", "mesh-nodes", "peers", "hop-histogram"],"charCount":11315}, - {"id":"onboarding","title":"Първи стъпки","section":"user","locale":"bg-rBG","resourcePath":"docs/bg-rBG/user/onboarding.html","navOrder":1,"keywords":["first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":4057}, + {"id":"onboarding","title":"Първи стъпки","section":"user","locale":"bg-rBG","resourcePath":"docs/bg-rBG/user/onboarding.html","navOrder":1,"keywords":["first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "reviewing", "later", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":6918}, {"id":"settings-module-admin","title":"Settings — Modules & Admin","section":"user","locale":"bg-rBG","resourcePath":"docs/bg-rBG/user/settings-module-admin.html","navOrder":8,"keywords":["settings", "modules", "admin", "mqtt", "module", "serial", "external", "notification", "store", "forward", "range", "test", "telemetry", "canned", "message", "audio", "remote", "hardware", "neighbor", "info", "ambient", "lighting", "detection", "sensor", "paxcounter", "tak", "factory", "reset", "troubleshooting", "related"],"aliases":["modules", "module-config", "administration"],"charCount":15986}, {"id":"settings-radio-user","title":"Settings — Radio & User","section":"user","locale":"bg-rBG","resourcePath":"docs/bg-rBG/user/settings-radio-user.html","navOrder":7,"keywords":["settings", "radio", "user", "profile", "applying", "changes", "lora", "modem", "presets", "bluetooth", "related", "topics"],"aliases":["настройки", "radio-config", "user-config", "lora"],"charCount":15204}, {"id":"signal-meter","title":"How the Meshtastic Signal Meter Works","section":"user","locale":"bg-rBG","resourcePath":"docs/bg-rBG/user/signal-meter.html","navOrder":15,"keywords":["how", "the", "meshtastic", "signal", "meter", "works", "two", "metrics", "loudness", "clarity", "magic", "lora", "hearing", "below", "noise", "floor", "calculates", "quality", "what", "this", "means", "for", "you", "where", "information", "appears", "related", "topics"],"aliases":["signal", "signal-meter", "snr", "rssi"],"charCount":5964}, @@ -99,7 +99,7 @@ {"id":"widget","title":"Home Screen Widget","section":"user","locale":"bg-rBG","resourcePath":"docs/bg-rBG/user/widget.html","navOrder":20,"keywords":["home", "screen", "widget", "what", "shows", "adding", "the", "related", "topics"],"aliases":["widget", "home-screen-widget", "local-stats-widget"],"charCount":1872}, {"id":"android-auto","title":"Android Auto","section":"user","locale":"ca-rES","resourcePath":"docs/ca-rES/user/android-auto.html","navOrder":18,"keywords":["android", "auto", "overview", "messages", "nodes", "status", "related", "topics"],"aliases":["android-auto", "car", "head-unit", "auto"],"charCount":2938}, {"id":"app-functions","title":"App Functions","section":"user","locale":"ca-rES","resourcePath":"docs/ca-rES/user/app-functions.html","navOrder":19,"keywords":["app", "functions", "enabling", "write", "read", "privacy", "related", "topics"],"aliases":["app-functions", "system-ai", "gemini", "assistant"],"charCount":3516}, - {"id":"connections","title":"Connections","section":"user","locale":"ca-rES","resourcePath":"docs/ca-rES/user/connections.html","navOrder":2,"keywords":["connections", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":4954}, + {"id":"connections","title":"Connections","section":"user","locale":"ca-rES","resourcePath":"docs/ca-rES/user/connections.html","navOrder":2,"keywords":["connections", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":6443}, {"id":"debug-logs","title":"Debug Logs","section":"user","locale":"ca-rES","resourcePath":"docs/ca-rES/user/debug-logs.html","navOrder":22,"keywords":["debug", "logs", "the", "two", "tabs", "viewing", "app", "exporting", "desktop", "related", "topics"],"aliases":["debug-logs", "logcat", "app-logs", "bug-report"],"charCount":3003}, {"id":"desktop","title":"Desktop App","section":"user","locale":"ca-rES","resourcePath":"docs/ca-rES/user/desktop.html","navOrder":14,"keywords":["desktop", "app", "installation", "linux", "macos", "windows", "connecting", "your", "radio", "usb", "serial", "primary", "tcp", "bluetooth", "ble", "feature", "parity", "differences", "keyboard", "shortcuts", "window", "system", "tray", "notification", "preferences", "built", "documentation", "browser", "building", "from"],"aliases":["desktop", "linux", "macos", "windows", "jvm"],"charCount":6180}, {"id":"discovery","title":"Discovery","section":"user","locale":"ca-rES","resourcePath":"docs/ca-rES/user/discovery.html","navOrder":12,"keywords":["discovery", "local", "mesh", "scanner", "setting", "scan", "live", "progress", "reading", "the", "results", "beacon", "manual", "exploration", "tra", "ruta", "running", "traceroute", "troubleshooting", "with", "neighbor", "info", "enabling", "viewing", "data", "node", "list", "tool", "finding", "new"],"aliases":["mesh-discovery", "local-discovery", "network-scan", "traceroute", "neighbor-info"],"charCount":12525}, @@ -110,7 +110,7 @@ {"id":"mqtt","title":"MQTT","section":"user","locale":"ca-rES","resourcePath":"docs/ca-rES/user/mqtt.html","navOrder":11,"keywords":["mqtt", "overview", "how", "works", "configuration", "enabling", "proxy", "this", "phone", "default", "meshtastic", "broker", "private", "map", "reporting", "uplink", "downlink", "message", "formats", "encryption", "privacy", "best", "practices", "troubleshooting", "not", "connecting", "messages", "bridging", "related", "topics"],"aliases":["mqtt", "internet-bridge", "broker"],"charCount":7844}, {"id":"node-metrics","title":"Node Metrics","section":"user","locale":"ca-rES","resourcePath":"docs/ca-rES/user/node-metrics.html","navOrder":5,"keywords":["node", "metrics", "device", "environment", "air", "quality", "signal", "reference", "power", "tra", "ruta", "reading", "traceroute", "results", "position", "log", "neighbor", "info", "viewing", "related", "topics"],"aliases":["metrics", "telemetry", "device-metrics", "signal"],"charCount":9868}, {"id":"nodes","title":"Nodes","section":"user","locale":"ca-rES","resourcePath":"docs/ca-rES/user/nodes.html","navOrder":4,"keywords":["nodes", "node", "list", "status", "indicators", "roles", "choosing", "role", "encryption", "quick", "actions", "filtering", "sorting", "text", "search", "filter", "toggles", "sort", "options", "per", "hop", "detail", "device", "links", "want", "one", "related", "topics"],"aliases":["node-list", "mesh-nodes", "peers", "hop-histogram"],"charCount":11264}, - {"id":"onboarding","title":"Getting Started","section":"user","locale":"ca-rES","resourcePath":"docs/ca-rES/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":4024}, + {"id":"onboarding","title":"Getting Started","section":"user","locale":"ca-rES","resourcePath":"docs/ca-rES/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "reviewing", "later", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":6885}, {"id":"settings-module-admin","title":"Settings — Modules & Admin","section":"user","locale":"ca-rES","resourcePath":"docs/ca-rES/user/settings-module-admin.html","navOrder":8,"keywords":["settings", "modules", "admin", "module", "configuration", "mqtt", "serial", "external", "notification", "store", "forward", "range", "test", "telemetry", "canned", "message", "audio", "remote", "hardware", "neighbor", "info", "ambient", "lighting", "detection", "sensor", "paxcounter", "tak", "administration", "clean", "node"],"aliases":["modules", "module-config", "administration"],"charCount":15884}, {"id":"settings-radio-user","title":"Settings — Radio & User","section":"user","locale":"ca-rES","resourcePath":"docs/ca-rES/user/settings-radio-user.html","navOrder":7,"keywords":["settings", "radio", "user", "profile", "applying", "changes", "configuration", "device", "config", "lora", "modem", "presets", "display", "position", "power", "network", "bluetooth", "security", "related", "topics"],"aliases":["settings", "radio-config", "user-config", "lora"],"charCount":14946}, {"id":"signal-meter","title":"How the Meshtastic Signal Meter Works","section":"user","locale":"ca-rES","resourcePath":"docs/ca-rES/user/signal-meter.html","navOrder":15,"keywords":["how", "the", "meshtastic", "signal", "meter", "works", "two", "metrics", "loudness", "clarity", "magic", "lora", "hearing", "below", "noise", "floor", "calculates", "quality", "what", "this", "means", "for", "you", "where", "information", "appears", "related", "topics"],"aliases":["signal", "signal-meter", "snr", "rssi"],"charCount":5900}, @@ -121,7 +121,7 @@ {"id":"widget","title":"Home Screen Widget","section":"user","locale":"ca-rES","resourcePath":"docs/ca-rES/user/widget.html","navOrder":20,"keywords":["home", "screen", "widget", "what", "shows", "adding", "the", "related", "topics"],"aliases":["widget", "home-screen-widget", "local-stats-widget"],"charCount":1856}, {"id":"android-auto","title":"Android Auto","section":"user","locale":"cs-rCZ","resourcePath":"docs/cs-rCZ/user/android-auto.html","navOrder":18,"keywords":["android", "auto", "overview", "zpr", "uzly", "status", "related", "topics"],"aliases":["android-auto", "car", "head-unit", "auto"],"charCount":2945}, {"id":"app-functions","title":"App Functions","section":"user","locale":"cs-rCZ","resourcePath":"docs/cs-rCZ/user/app-functions.html","navOrder":19,"keywords":["app", "functions", "enabling", "write", "read", "privacy", "related", "topics"],"aliases":["app-functions", "system-ai", "gemini", "assistant"],"charCount":3526}, - {"id":"connections","title":"Připojení","section":"user","locale":"cs-rCZ","resourcePath":"docs/cs-rCZ/user/connections.html","navOrder":2,"keywords":["ipojen", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "connections", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":4950}, + {"id":"connections","title":"Připojení","section":"user","locale":"cs-rCZ","resourcePath":"docs/cs-rCZ/user/connections.html","navOrder":2,"keywords":["ipojen", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "connections", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":6439}, {"id":"debug-logs","title":"Debug Logs","section":"user","locale":"cs-rCZ","resourcePath":"docs/cs-rCZ/user/debug-logs.html","navOrder":22,"keywords":["debug", "logs", "the", "two", "tabs", "viewing", "app", "exporting", "desktop", "related", "topics"],"aliases":["debug-logs", "logcat", "app-logs", "bug-report"],"charCount":3013}, {"id":"desktop","title":"Desktop App","section":"user","locale":"cs-rCZ","resourcePath":"docs/cs-rCZ/user/desktop.html","navOrder":14,"keywords":["desktop", "app", "installation", "linux", "macos", "windows", "connecting", "your", "radio", "usb", "serial", "primary", "tcp", "bluetooth", "ble", "feature", "parity", "differences", "keyboard", "shortcuts", "window", "system", "tray", "notification", "preferences", "built", "documentation", "browser", "building", "from"],"aliases":["desktop", "linux", "macos", "windows", "jvm"],"charCount":6177}, {"id":"discovery","title":"Objevujte","section":"user","locale":"cs-rCZ","resourcePath":"docs/cs-rCZ/user/discovery.html","navOrder":12,"keywords":["objevujte", "local", "mesh", "discovery", "scanner", "setting", "scan", "live", "progress", "reading", "the", "results", "beacon", "manual", "exploration", "traceroute", "running", "troubleshooting", "with", "informace", "sousedech", "enabling", "neighbor", "info", "viewing", "data", "node", "list", "tool", "finding"],"aliases":["mesh-discovery", "local-discovery", "network-scan", "traceroute", "neighbor-info"],"charCount":12532}, @@ -132,7 +132,7 @@ {"id":"mqtt","title":"MQTT","section":"user","locale":"cs-rCZ","resourcePath":"docs/cs-rCZ/user/mqtt.html","navOrder":11,"keywords":["mqtt", "overview", "how", "works", "nastaven", "enabling", "proxy", "this", "phone", "default", "meshtastic", "broker", "private", "map", "reporting", "uplink", "downlink", "message", "formats", "encryption", "privacy", "best", "practices", "troubleshooting", "not", "connecting", "messages", "bridging", "related", "topics"],"aliases":["mqtt", "internet-bridge", "broker"],"charCount":7860}, {"id":"node-metrics","title":"Node Metrics","section":"user","locale":"cs-rCZ","resourcePath":"docs/cs-rCZ/user/node-metrics.html","navOrder":5,"keywords":["node", "metrics", "metriky", "zen", "prost", "air", "quality", "signal", "reference", "nap", "jen", "traceroute", "reading", "results", "protokol", "pozic", "informace", "sousedech", "viewing", "related", "topics"],"aliases":["metrics", "telemetry", "device-metrics", "signal"],"charCount":9848}, {"id":"nodes","title":"Uzly","section":"user","locale":"cs-rCZ","resourcePath":"docs/cs-rCZ/user/nodes.html","navOrder":4,"keywords":["uzly", "node", "list", "status", "indicators", "roles", "choosing", "role", "encryption", "quick", "actions", "filtering", "sorting", "text", "search", "filter", "toggles", "sort", "options", "nodes", "per", "hop", "detail", "device", "links", "want", "one", "related", "topics"],"aliases":["node-list", "mesh-nodes", "peers", "hop-histogram"],"charCount":11276}, - {"id":"onboarding","title":"Getting Started","section":"user","locale":"cs-rCZ","resourcePath":"docs/cs-rCZ/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":4024}, + {"id":"onboarding","title":"Getting Started","section":"user","locale":"cs-rCZ","resourcePath":"docs/cs-rCZ/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "reviewing", "later", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":6885}, {"id":"settings-module-admin","title":"Settings — Modules & Admin","section":"user","locale":"cs-rCZ","resourcePath":"docs/cs-rCZ/user/settings-module-admin.html","navOrder":8,"keywords":["settings", "modules", "admin", "module", "configuration", "mqtt", "serial", "external", "notification", "store", "forward", "range", "test", "telemetry", "canned", "message", "audio", "remote", "hardware", "neighbor", "info", "ambient", "lighting", "detection", "sensor", "paxcounter", "tak", "administrace", "vzd", "len"],"aliases":["modules", "module-config", "administration"],"charCount":15906}, {"id":"settings-radio-user","title":"Settings — Radio & User","section":"user","locale":"cs-rCZ","resourcePath":"docs/cs-rCZ/user/settings-radio-user.html","navOrder":7,"keywords":["settings", "radio", "user", "profile", "applying", "changes", "nastaven", "zen", "lora", "modem", "presets", "zobrazen", "pozice", "nap", "jen", "bluetooth", "zabezpe", "related", "topics"],"aliases":["nastavení", "radio-config", "user-config", "lora"],"charCount":14972}, {"id":"signal-meter","title":"How the Meshtastic Signal Meter Works","section":"user","locale":"cs-rCZ","resourcePath":"docs/cs-rCZ/user/signal-meter.html","navOrder":15,"keywords":["how", "the", "meshtastic", "signal", "meter", "works", "two", "metrics", "loudness", "clarity", "magic", "lora", "hearing", "below", "noise", "floor", "calculates", "quality", "what", "this", "means", "for", "you", "where", "information", "appears", "related", "topics"],"aliases":["signal", "signal-meter", "snr", "rssi"],"charCount":5906}, @@ -143,7 +143,7 @@ {"id":"widget","title":"Home Screen Widget","section":"user","locale":"cs-rCZ","resourcePath":"docs/cs-rCZ/user/widget.html","navOrder":20,"keywords":["home", "screen", "widget", "what", "shows", "adding", "the", "related", "topics"],"aliases":["widget", "home-screen-widget", "local-stats-widget"],"charCount":1866}, {"id":"android-auto","title":"Android Auto","section":"user","locale":"de-rDE","resourcePath":"docs/de-rDE/user/android-auto.html","navOrder":18,"keywords":["android", "auto", "bersicht", "nachrichten", "knoten", "status", "related", "topics"],"aliases":["android-auto", "car", "head-unit", "auto"],"charCount":2949}, {"id":"app-functions","title":"App Functions","section":"user","locale":"de-rDE","resourcePath":"docs/de-rDE/user/app-functions.html","navOrder":19,"keywords":["app", "functions", "enabling", "write", "read", "datenschutz", "related", "topics"],"aliases":["app-functions", "system-ai", "gemini", "assistant"],"charCount":3590}, - {"id":"connections","title":"Verbindungen","section":"user","locale":"de-rDE","resourcePath":"docs/de-rDE/user/connections.html","navOrder":2,"keywords":["verbindungen", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "einstellungen", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "connections", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "Kopplung"],"charCount":5039}, + {"id":"connections","title":"Verbindungen","section":"user","locale":"de-rDE","resourcePath":"docs/de-rDE/user/connections.html","navOrder":2,"keywords":["verbindungen", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "einstellungen", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "connections", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "Kopplung"],"charCount":6528}, {"id":"debug-logs","title":"Fehlersuchprotokolle","section":"user","locale":"de-rDE","resourcePath":"docs/de-rDE/user/debug-logs.html","navOrder":22,"keywords":["fehlersuchprotokolle", "the", "two", "tabs", "viewing", "app", "logs", "exporting", "desktop", "related", "topics"],"aliases":["debug-logs", "logcat", "app-logs", "bug-report"],"charCount":3099}, {"id":"desktop","title":"Desktop App","section":"user","locale":"de-rDE","resourcePath":"docs/de-rDE/user/desktop.html","navOrder":14,"keywords":["desktop", "app", "installation", "linux", "macos", "windows", "connecting", "your", "radio", "usb", "serial", "primary", "tcp", "bluetooth", "ble", "feature", "parity", "differences", "tastaturk", "rzel", "window", "system", "tray", "notification", "preferences", "built", "documentation", "browser", "building", "from"],"aliases":["desktop", "linux", "macos", "windows", "jvm"],"charCount":6204}, {"id":"discovery","title":"Entdecken","section":"user","locale":"de-rDE","resourcePath":"docs/de-rDE/user/discovery.html","navOrder":12,"keywords":["entdecken", "local", "mesh", "discovery", "scanner", "setting", "scan", "live", "progress", "reading", "the", "results", "beacon", "manual", "exploration", "traceroute", "running", "troubleshooting", "with", "nachbarinformation", "enabling", "neighbor", "info", "viewing", "data", "node", "list", "tool", "finding", "new"],"aliases":["mesh-discovery", "local-discovery", "network-scan", "traceroute", "neighbor-info"],"charCount":12718}, @@ -154,7 +154,7 @@ {"id":"mqtt","title":"MQTT","section":"user","locale":"de-rDE","resourcePath":"docs/de-rDE/user/mqtt.html","navOrder":11,"keywords":["mqtt", "bersicht", "funktioniert", "einstellungen", "aktivieren", "proxy", "this", "phone", "default", "meshtastic", "broker", "private", "map", "reporting", "uplink", "downlink", "message", "formats", "encryption", "privacy", "bew", "hrte", "praktiken", "fehlerbehebung", "not", "connecting", "messages", "bridging", "related", "topics"],"aliases":["mqtt", "internet-bridge", "broker"],"charCount":7855}, {"id":"node-metrics","title":"Node Metrics","section":"user","locale":"de-rDE","resourcePath":"docs/de-rDE/user/node-metrics.html","navOrder":5,"keywords":["node", "metrics", "ger", "tedaten", "umweltdaten", "air", "quality", "signaldaten", "signal", "reference", "energiedaten", "traceroute", "reading", "results", "standortprotokoll", "nachbarinformation", "viewing", "related", "topics"],"aliases":["metrics", "telemetry", "device-metrics", "signal"],"charCount":10394}, {"id":"nodes","title":"Knoten","section":"user","locale":"de-rDE","resourcePath":"docs/de-rDE/user/nodes.html","navOrder":4,"keywords":["knoten", "node", "list", "status", "indicators", "roles", "choosing", "role", "encryption", "quick", "actions", "filtering", "sorting", "text", "search", "filter", "toggles", "sort", "options", "nodes", "per", "hop", "detail", "device", "links", "want", "one", "related", "topics"],"aliases":["node-list", "mesh-nodes", "peers", "hop-histogram"],"charCount":11471}, - {"id":"onboarding","title":"Erste Schritte","section":"user","locale":"de-rDE","resourcePath":"docs/de-rDE/user/onboarding.html","navOrder":1,"keywords":["erste", "schritte", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":4061}, + {"id":"onboarding","title":"Erste Schritte","section":"user","locale":"de-rDE","resourcePath":"docs/de-rDE/user/onboarding.html","navOrder":1,"keywords":["erste", "schritte", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "reviewing", "later", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":6922}, {"id":"settings-module-admin","title":"Settings — Modules & Admin","section":"user","locale":"de-rDE","resourcePath":"docs/de-rDE/user/settings-module-admin.html","navOrder":8,"keywords":["settings", "modules", "admin", "moduleinstellungen", "mqtt", "module", "serial", "external", "notification", "store", "forward", "range", "test", "telemetry", "canned", "message", "audio", "remote", "hardware", "neighbor", "info", "ambient", "lighting", "detection", "sensor", "paxcounter", "tak", "einstellung", "ferneinstellung", "knotendatenbank"],"aliases":["modules", "module-config", "administration"],"charCount":15896}, {"id":"settings-radio-user","title":"Settings — Radio & User","section":"user","locale":"de-rDE","resourcePath":"docs/de-rDE/user/settings-radio-user.html","navOrder":7,"keywords":["settings", "radio", "user", "benutzereinstellungen", "profile", "applying", "changes", "einstellungen", "ger", "teeinstellungen", "lora", "modem", "presets", "anzeigeeinstellungen", "standorteinstellungen", "energie", "netzwerkeinstellungen", "bluetooth", "sicherheitseinstellungen", "related", "topics"],"aliases":["Einstellungen", "radio-config", "user-config", "lora"],"charCount":15581}, {"id":"signal-meter","title":"Wie das Meshtastic Signal Meter funktioniert","section":"user","locale":"de-rDE","resourcePath":"docs/de-rDE/user/signal-meter.html","navOrder":15,"keywords":["wie", "das", "meshtastic", "signal", "meter", "funktioniert", "die", "beiden", "metriken", "lautst", "rke", "klarheit", "magie", "von", "lora", "empfangen", "unter", "dem", "rmboden", "qualit", "berechnet", "was", "dich", "bedeutet", "where", "information", "appears", "related", "topics"],"aliases":["Signal", "Signal-Meter", "snr", "rssi"],"charCount":6689}, @@ -165,7 +165,7 @@ {"id":"widget","title":"Home Screen Widget","section":"user","locale":"de-rDE","resourcePath":"docs/de-rDE/user/widget.html","navOrder":20,"keywords":["home", "screen", "widget", "what", "shows", "adding", "the", "related", "topics"],"aliases":["widget", "home-screen-widget", "local-stats-widget"],"charCount":1862}, {"id":"android-auto","title":"Android Auto","section":"user","locale":"el-rGR","resourcePath":"docs/el-rGR/user/android-auto.html","navOrder":18,"keywords":["android", "auto", "overview", "nodes", "status", "related", "topics"],"aliases":["android-auto", "car", "head-unit", "auto"],"charCount":2938}, {"id":"app-functions","title":"App Functions","section":"user","locale":"el-rGR","resourcePath":"docs/el-rGR/user/app-functions.html","navOrder":19,"keywords":["app", "functions", "enabling", "write", "read", "privacy", "related", "topics"],"aliases":["app-functions", "system-ai", "gemini", "assistant"],"charCount":3516}, - {"id":"connections","title":"Connections","section":"user","locale":"el-rGR","resourcePath":"docs/el-rGR/user/connections.html","navOrder":2,"keywords":["connections", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":4954}, + {"id":"connections","title":"Connections","section":"user","locale":"el-rGR","resourcePath":"docs/el-rGR/user/connections.html","navOrder":2,"keywords":["connections", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":6443}, {"id":"debug-logs","title":"Debug Logs","section":"user","locale":"el-rGR","resourcePath":"docs/el-rGR/user/debug-logs.html","navOrder":22,"keywords":["debug", "logs", "the", "two", "tabs", "viewing", "app", "exporting", "desktop", "related", "topics"],"aliases":["debug-logs", "logcat", "app-logs", "bug-report"],"charCount":3003}, {"id":"desktop","title":"Desktop App","section":"user","locale":"el-rGR","resourcePath":"docs/el-rGR/user/desktop.html","navOrder":14,"keywords":["desktop", "app", "installation", "linux", "macos", "windows", "connecting", "your", "radio", "usb", "serial", "primary", "tcp", "bluetooth", "ble", "feature", "parity", "differences", "keyboard", "shortcuts", "window", "system", "tray", "notification", "preferences", "built", "documentation", "browser", "building", "from"],"aliases":["desktop", "linux", "macos", "windows", "jvm"],"charCount":6180}, {"id":"discovery","title":"Discovery","section":"user","locale":"el-rGR","resourcePath":"docs/el-rGR/user/discovery.html","navOrder":12,"keywords":["discovery", "local", "mesh", "scanner", "setting", "scan", "live", "progress", "reading", "the", "results", "beacon", "manual", "exploration", "traceroute", "running", "troubleshooting", "with", "neighbor", "info", "enabling", "viewing", "data", "node", "list", "tool", "finding", "new", "nodes", "assessing"],"aliases":["mesh-discovery", "local-discovery", "network-scan", "traceroute", "neighbor-info"],"charCount":12524}, @@ -176,7 +176,7 @@ {"id":"mqtt","title":"MQTT","section":"user","locale":"el-rGR","resourcePath":"docs/el-rGR/user/mqtt.html","navOrder":11,"keywords":["mqtt", "overview", "how", "works", "configuration", "enabling", "proxy", "this", "phone", "default", "meshtastic", "broker", "private", "map", "reporting", "uplink", "downlink", "message", "formats", "encryption", "privacy", "best", "practices", "troubleshooting", "not", "connecting", "messages", "bridging", "related", "topics"],"aliases":["mqtt", "internet-bridge", "broker"],"charCount":7864}, {"id":"node-metrics","title":"Node Metrics","section":"user","locale":"el-rGR","resourcePath":"docs/el-rGR/user/node-metrics.html","navOrder":5,"keywords":["node", "metrics", "device", "environment", "air", "quality", "signal", "reference", "power", "traceroute", "reading", "results", "neighbor", "info", "viewing", "related", "topics"],"aliases":["metrics", "telemetry", "device-metrics", "signal"],"charCount":9883}, {"id":"nodes","title":"Nodes","section":"user","locale":"el-rGR","resourcePath":"docs/el-rGR/user/nodes.html","navOrder":4,"keywords":["nodes", "node", "list", "status", "indicators", "roles", "choosing", "role", "encryption", "quick", "actions", "filtering", "sorting", "text", "search", "filter", "toggles", "sort", "options", "per", "hop", "detail", "device", "links", "want", "one", "related", "topics"],"aliases":["node-list", "mesh-nodes", "peers", "hop-histogram"],"charCount":11264}, - {"id":"onboarding","title":"Getting Started","section":"user","locale":"el-rGR","resourcePath":"docs/el-rGR/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":4024}, + {"id":"onboarding","title":"Getting Started","section":"user","locale":"el-rGR","resourcePath":"docs/el-rGR/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "reviewing", "later", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":6885}, {"id":"settings-module-admin","title":"Settings — Modules & Admin","section":"user","locale":"el-rGR","resourcePath":"docs/el-rGR/user/settings-module-admin.html","navOrder":8,"keywords":["settings", "modules", "admin", "module", "configuration", "mqtt", "serial", "external", "notification", "store", "forward", "range", "test", "telemetry", "canned", "message", "audio", "remote", "hardware", "neighbor", "info", "ambient", "lighting", "detection", "sensor", "paxcounter", "tak", "clean", "node", "database"],"aliases":["modules", "module-config", "administration"],"charCount":15911}, {"id":"settings-radio-user","title":"Settings — Radio & User","section":"user","locale":"el-rGR","resourcePath":"docs/el-rGR/user/settings-radio-user.html","navOrder":7,"keywords":["settings", "radio", "user", "profile", "applying", "changes", "configuration", "device", "config", "lora", "modem", "presets", "display", "position", "power", "network", "bluetooth", "security", "related", "topics"],"aliases":["ρυθμίσεις", "radio-config", "user-config", "lora"],"charCount":14950}, {"id":"signal-meter","title":"How the Meshtastic Signal Meter Works","section":"user","locale":"el-rGR","resourcePath":"docs/el-rGR/user/signal-meter.html","navOrder":15,"keywords":["how", "the", "meshtastic", "signal", "meter", "works", "two", "metrics", "loudness", "clarity", "magic", "lora", "hearing", "below", "noise", "floor", "calculates", "quality", "what", "this", "means", "for", "you", "where", "information", "appears", "related", "topics"],"aliases":["signal", "signal-meter", "snr", "rssi"],"charCount":5900}, @@ -187,7 +187,7 @@ {"id":"widget","title":"Home Screen Widget","section":"user","locale":"el-rGR","resourcePath":"docs/el-rGR/user/widget.html","navOrder":20,"keywords":["home", "screen", "widget", "what", "shows", "adding", "the", "related", "topics"],"aliases":["widget", "home-screen-widget", "local-stats-widget"],"charCount":1856}, {"id":"android-auto","title":"Android Auto","section":"user","locale":"es-rES","resourcePath":"docs/es-rES/user/android-auto.html","navOrder":18,"keywords":["android", "auto", "visi", "general", "mensajes", "nodos", "status", "related", "topics"],"aliases":["android-auto", "car", "head-unit", "auto"],"charCount":2944}, {"id":"app-functions","title":"App Functions","section":"user","locale":"es-rES","resourcePath":"docs/es-rES/user/app-functions.html","navOrder":19,"keywords":["app", "functions", "enabling", "write", "read", "privacy", "related", "topics"],"aliases":["app-functions", "system-ai", "gemini", "assistant"],"charCount":3516}, - {"id":"connections","title":"Conexiones","section":"user","locale":"es-rES","resourcePath":"docs/es-rES/user/connections.html","navOrder":2,"keywords":["conexiones", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "connections", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":4952}, + {"id":"connections","title":"Conexiones","section":"user","locale":"es-rES","resourcePath":"docs/es-rES/user/connections.html","navOrder":2,"keywords":["conexiones", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "connections", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":6441}, {"id":"debug-logs","title":"Debug Logs","section":"user","locale":"es-rES","resourcePath":"docs/es-rES/user/debug-logs.html","navOrder":22,"keywords":["debug", "logs", "the", "two", "tabs", "viewing", "app", "exporting", "desktop", "related", "topics"],"aliases":["debug-logs", "logcat", "app-logs", "bug-report"],"charCount":3003}, {"id":"desktop","title":"Desktop App","section":"user","locale":"es-rES","resourcePath":"docs/es-rES/user/desktop.html","navOrder":14,"keywords":["desktop", "app", "installation", "linux", "macos", "windows", "connecting", "your", "radio", "usb", "serial", "primary", "tcp", "bluetooth", "ble", "feature", "parity", "differences", "keyboard", "shortcuts", "window", "system", "tray", "notification", "preferences", "built", "documentation", "browser", "building", "from"],"aliases":["desktop", "linux", "macos", "windows", "jvm"],"charCount":6180}, {"id":"discovery","title":"Discovery","section":"user","locale":"es-rES","resourcePath":"docs/es-rES/user/discovery.html","navOrder":12,"keywords":["discovery", "local", "mesh", "scanner", "setting", "scan", "live", "progress", "reading", "the", "results", "beacon", "manual", "exploration", "traceroute", "running", "troubleshooting", "with", "informaci", "vecinos", "enabling", "neighbor", "info", "viewing", "data", "node", "list", "tool", "finding", "new"],"aliases":["mesh-discovery", "local-discovery", "network-scan", "traceroute", "neighbor-info"],"charCount":12533}, @@ -198,7 +198,7 @@ {"id":"mqtt","title":"MQTT","section":"user","locale":"es-rES","resourcePath":"docs/es-rES/user/mqtt.html","navOrder":11,"keywords":["mqtt", "visi", "general", "how", "works", "configuraci", "enabling", "proxy", "this", "phone", "default", "meshtastic", "broker", "private", "map", "reporting", "uplink", "downlink", "message", "formats", "encryption", "privacy", "best", "practices", "troubleshooting", "not", "connecting", "messages", "bridging", "related"],"aliases":["mqtt", "internet-bridge", "broker"],"charCount":7850}, {"id":"node-metrics","title":"Node Metrics","section":"user","locale":"es-rES","resourcePath":"docs/es-rES/user/node-metrics.html","navOrder":5,"keywords":["node", "metrics", "tricas", "dispositivo", "entorno", "air", "quality", "signal", "reference", "energ", "traceroute", "reading", "results", "registro", "posiciones", "informaci", "vecinos", "viewing", "related", "topics"],"aliases":["metrics", "telemetry", "device-metrics", "signal"],"charCount":9910}, {"id":"nodes","title":"Nodos","section":"user","locale":"es-rES","resourcePath":"docs/es-rES/user/nodes.html","navOrder":4,"keywords":["nodos", "node", "list", "status", "indicators", "roles", "choosing", "role", "encryption", "quick", "actions", "filtering", "sorting", "text", "search", "filter", "toggles", "sort", "options", "nodes", "per", "hop", "detail", "device", "links", "want", "one", "related", "topics"],"aliases":["node-list", "mesh-nodes", "peers", "hop-histogram"],"charCount":11264}, - {"id":"onboarding","title":"Primeros Pasos","section":"user","locale":"es-rES","resourcePath":"docs/es-rES/user/onboarding.html","navOrder":1,"keywords":["primeros", "pasos", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":4022}, + {"id":"onboarding","title":"Primeros Pasos","section":"user","locale":"es-rES","resourcePath":"docs/es-rES/user/onboarding.html","navOrder":1,"keywords":["primeros", "pasos", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "reviewing", "later", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":6883}, {"id":"settings-module-admin","title":"Settings — Modules & Admin","section":"user","locale":"es-rES","resourcePath":"docs/es-rES/user/settings-module-admin.html","navOrder":8,"keywords":["settings", "modules", "admin", "module", "configuration", "mqtt", "serial", "external", "notification", "store", "forward", "range", "test", "telemetry", "canned", "message", "audio", "remote", "hardware", "neighbor", "info", "ambient", "lighting", "detection", "sensor", "paxcounter", "tak", "administraci", "remota", "limpiar"],"aliases":["modules", "module-config", "administration"],"charCount":15898}, {"id":"settings-radio-user","title":"Settings — Radio & User","section":"user","locale":"es-rES","resourcePath":"docs/es-rES/user/settings-radio-user.html","navOrder":7,"keywords":["settings", "radio", "user", "profile", "applying", "changes", "configuraci", "del", "dispositivo", "lora", "modem", "presets", "pantalla", "posici", "elecenerg", "red", "bluetooth", "seguridad", "related", "topics"],"aliases":["ajustes", "radio-config", "user-config", "lora"],"charCount":15332}, {"id":"signal-meter","title":"How the Meshtastic Signal Meter Works","section":"user","locale":"es-rES","resourcePath":"docs/es-rES/user/signal-meter.html","navOrder":15,"keywords":["how", "the", "meshtastic", "signal", "meter", "works", "two", "metrics", "loudness", "clarity", "magic", "lora", "hearing", "below", "noise", "floor", "calculates", "quality", "what", "this", "means", "for", "you", "where", "information", "appears", "related", "topics"],"aliases":["signal", "signal-meter", "snr", "rssi"],"charCount":5924}, @@ -209,7 +209,7 @@ {"id":"widget","title":"Home Screen Widget","section":"user","locale":"es-rES","resourcePath":"docs/es-rES/user/widget.html","navOrder":20,"keywords":["home", "screen", "widget", "what", "shows", "adding", "the", "related", "topics"],"aliases":["widget", "home-screen-widget", "local-stats-widget"],"charCount":1856}, {"id":"android-auto","title":"Android auto","section":"user","locale":"et-rEE","resourcePath":"docs/et-rEE/user/android-auto.html","navOrder":18,"keywords":["android", "auto", "levaade", "numid", "lmed", "olek", "seotud", "teemad"],"aliases":["android auto", "auto", "head-unit", "auto"],"charCount":3021}, {"id":"app-functions","title":"Rakenduse funktsioonid","section":"user","locale":"et-rEE","resourcePath":"docs/et-rEE/user/app-functions.html","navOrder":19,"keywords":["rakenduse", "funktsioonid", "luba", "kirjutamis", "lugemis", "privacy", "seotud", "teemad"],"aliases":["rakenduse funktsioonid", "süsteemi-ti", "gemini", "assistent"],"charCount":3744}, - {"id":"connections","title":"Ühendus","section":"user","locale":"et-rEE","resourcePath":"docs/et-rEE/user/connections.html","navOrder":2,"keywords":["hendus", "sinihammas", "ble", "seadme", "sidumine", "henduse", "olek", "sinihamba", "veaotsing", "usb", "port", "seadistamine", "tcp", "connecting", "over", "the", "network", "millal", "kasutada", "reconnection", "behavior", "desktop", "connections", "seotud", "teemad"],"aliases":["sinihammas", "usb", "tcp", "seon"],"charCount":4933}, + {"id":"connections","title":"Ühendus","section":"user","locale":"et-rEE","resourcePath":"docs/et-rEE/user/connections.html","navOrder":2,"keywords":["hendus", "sinihammas", "ble", "seadme", "sidumine", "henduse", "olek", "sinihamba", "veaotsing", "usb", "port", "seadistamine", "tcp", "connecting", "over", "the", "network", "millal", "kasutada", "reconnection", "behavior", "desktop", "connections", "seotud", "teemad"],"aliases":["sinihammas", "usb", "tcp", "seon"],"charCount":6441}, {"id":"debug-logs","title":"Arendaja logid","section":"user","locale":"et-rEE","resourcePath":"docs/et-rEE/user/debug-logs.html","navOrder":22,"keywords":["arendaja", "logid", "the", "two", "tabs", "viewing", "app", "logs", "eksportimine", "laud", "seotud", "teemad"],"aliases":["arendaja-logid", "logcat", "app-logs", "bug-report"],"charCount":3183}, {"id":"desktop","title":"Desktop App","section":"user","locale":"et-rEE","resourcePath":"docs/et-rEE/user/desktop.html","navOrder":14,"keywords":["desktop", "app", "paigaldus", "linux", "macos", "windows", "connecting", "your", "radio", "usb", "port", "esmane", "tcp", "sinihammas", "ble", "feature", "parity", "differences", "kiirklahvid", "window", "system", "tray", "notification", "preferences", "sisseehitatud", "dokumentatsioonibrauser", "building", "from", "source", "known"],"aliases":["töölaud", "linux", "macos", "windows", "jvm"],"charCount":6583}, {"id":"discovery","title":"Avastamine","section":"user","locale":"et-rEE","resourcePath":"docs/et-rEE/user/discovery.html","navOrder":12,"keywords":["avastamine", "kohalik", "rgv", "rgu", "avastaja", "skanner", "skannimise", "seadistamine", "live", "progress", "reading", "the", "results", "majakas", "manual", "exploration", "marsruudi", "traceroute", "ivitamine", "veaotsing", "koos", "naabruse", "teave", "naabriinfo", "lubamine", "naabri", "andmete", "vaatamine", "lmede", "loend"],"aliases":["kärgvõrgu-avastamine", "kohalik-avastamine", "võrguskannimine", "traceroute", "naabri-info"],"charCount":12971}, @@ -220,7 +220,7 @@ {"id":"mqtt","title":"MQTT","section":"user","locale":"et-rEE","resourcePath":"docs/et-rEE/user/mqtt.html","navOrder":11,"keywords":["mqtt", "levaade", "kuidas", "see", "toimib", "tted", "luba", "puhverserver", "sellel", "telefonil", "meshtastic", "vaikemaakler", "private", "broker", "kaardiaruannete", "koostamine", "leslink", "allalink", "numivormingud", "encryption", "privacy", "parimad", "tavad", "veaotsing", "hendu", "messages", "not", "bridging", "seotud", "teemad"],"aliases":["mqtt", "internet-bridge", "broker"],"charCount":7939}, {"id":"node-metrics","title":"Sõlme mõõdikud","section":"user","locale":"et-rEE","resourcePath":"docs/et-rEE/user/node-metrics.html","navOrder":5,"keywords":["lme", "dikud", "seadme", "keskkonnam", "air", "quality", "metrics", "signaali", "signal", "reference", "imsusn", "itajad", "marsruudi", "traceroute", "tulemuste", "lugemine", "asukoha", "logi", "naabruse", "teave", "viewing", "seotud", "teemad"],"aliases":["meetriline", "telemeetria", "sõlme-mõõdikud", "signaal"],"charCount":10444}, {"id":"nodes","title":"Sõlmed","section":"user","locale":"et-rEE","resourcePath":"docs/et-rEE/user/nodes.html","navOrder":4,"keywords":["lmed", "lmede", "loend", "lme", "oleku", "indikaatorid", "node", "roles", "choosing", "role", "encryption", "indicators", "quick", "actions", "filtering", "sorting", "teksti", "otsing", "filter", "toggles", "sorteerimisvalikud", "ppe", "kohta", "detail", "seadme", "lingid", "soovin", "hte", "seotud", "teemad"],"aliases":["sõlmede loend", "mesh-nodes", "eakaaslased", "hop-histogram"],"charCount":11936}, - {"id":"onboarding","title":"Getting Started","section":"user","locale":"et-rEE","resourcePath":"docs/et-rEE/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "tervituskuva", "permissions", "sinihamba", "load", "asukoha", "luba", "rguannete", "critical", "alerts", "permission", "peale", "seadistamist", "what", "next"],"aliases":["first-launch", "seadistamine", "sissejuhatus"],"charCount":4038}, + {"id":"onboarding","title":"Getting Started","section":"user","locale":"et-rEE","resourcePath":"docs/et-rEE/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "tervituskuva", "permissions", "sinihamba", "load", "asukoha", "luba", "rguannete", "critical", "alerts", "permission", "reviewing", "later", "peale", "seadistamist", "what", "next"],"aliases":["first-launch", "seadistamine", "sissejuhatus"],"charCount":6892}, {"id":"settings-module-admin","title":"Sätted - moodulid & admin","section":"user","locale":"et-rEE","resourcePath":"docs/et-rEE/user/settings-module-admin.html","navOrder":8,"keywords":["tted", "moodulid", "admin", "mooduli", "konf", "mqtt", "moodul", "jadapordi", "lise", "teavitusmoodul", "salvesta", "edasta", "kaugustesti", "telemeetria", "eelsalvestatud", "numi", "audio", "kaugriistvara", "naabriinfo", "ambientvalguse", "tuvastusanduri", "paxloenduri", "tak", "haldus", "kaughaldus", "hjenda", "lmede", "andmebaas", "factory", "reset"],"aliases":["moodul", "mooduli sätted", "administratsioon"],"charCount":16540}, {"id":"settings-radio-user","title":"Seaded — raadio ja kasutaja","section":"user","locale":"et-rEE","resourcePath":"docs/et-rEE/user/settings-radio-user.html","navOrder":7,"keywords":["seaded", "raadio", "kasutaja", "kasutajaprofiil", "applying", "changes", "tted", "seadme", "lora", "modem", "presets", "ekraani", "asukoha", "toite", "rgu", "sinihamba", "turva", "seotud", "teemad"],"aliases":["sätted", "raadio-sätted", "kasutaja-sätted", "lora"],"charCount":15376}, {"id":"signal-meter","title":"Kuidas Meshtastic signaalimõõtur töötab","section":"user","locale":"et-rEE","resourcePath":"docs/et-rEE/user/signal-meter.html","navOrder":15,"keywords":["kuidas", "meshtastic", "signaalim", "tur", "tab", "the", "two", "metrics", "loudness", "clarity", "magic", "lora", "hearing", "below", "noise", "floor", "how", "signal", "meter", "calculates", "quality", "what", "this", "means", "for", "you", "where", "information", "appears", "seotud"],"aliases":["signaal", "signaali-mõõtur", "snr", "rssi"],"charCount":6170}, @@ -231,7 +231,7 @@ {"id":"widget","title":"Home Screen Widget","section":"user","locale":"et-rEE","resourcePath":"docs/et-rEE/user/widget.html","navOrder":20,"keywords":["home", "screen", "widget", "mida", "see", "itab", "adding", "the", "seotud", "teemad"],"aliases":["widget", "home-screen-widget", "local-stats-widget"],"charCount":1829}, {"id":"android-auto","title":"Android Auto","section":"user","locale":"fi-rFI","resourcePath":"docs/fi-rFI/user/android-auto.html","navOrder":18,"keywords":["android", "auto", "yleiskatsaus", "viestit", "laitteet", "tila", "aiheeseen", "liittyv", "aiheet"],"aliases":["android-auto", "auto", "päälaite", "auto"],"charCount":3129}, {"id":"app-functions","title":"Sovellustoiminnot","section":"user","locale":"fi-rFI","resourcePath":"docs/fi-rFI/user/app-functions.html","navOrder":19,"keywords":["sovellustoiminnot", "sovellustoimintojen", "ytt", "notto", "kirjoitustoiminnot", "lukutoiminnot", "yksityisyys", "aiheeseen", "liittyv", "aiheet"],"aliases":["sovellustoiminnot", "järjestelmä-ai", "gemini", "avustaja"],"charCount":3856}, - {"id":"connections","title":"Yhteydet","section":"user","locale":"fi-rFI","resourcePath":"docs/fi-rFI/user/connections.html","navOrder":2,"keywords":["yhteydet", "bluetooth", "ble", "laitteen", "pariliitos", "yhteyden", "tila", "bluetoothin", "vianm", "ritys", "usb", "sarjaporttiyhteys", "asetukset", "tcp", "verkko", "yhdist", "minen", "verkon", "kautta", "milloin", "yhteytt", "kannattaa", "ytt", "uudelleenyhdist", "misen", "toiminta", "aiheeseen", "liittyv", "aiheet"],"aliases":["bluetooth", "usb", "tcp", "pariliitos"],"charCount":5205}, + {"id":"connections","title":"Yhteydet","section":"user","locale":"fi-rFI","resourcePath":"docs/fi-rFI/user/connections.html","navOrder":2,"keywords":["yhteydet", "bluetooth", "ble", "laitteen", "pariliitos", "yhteyden", "tila", "bluetoothin", "vianm", "ritys", "usb", "sarjaporttiyhteys", "asetukset", "tcp", "verkko", "yhdist", "minen", "verkon", "kautta", "milloin", "yhteytt", "kannattaa", "ytt", "uudelleenyhdist", "misen", "toiminta", "aiheeseen", "liittyv", "aiheet"],"aliases":["bluetooth", "usb", "tcp", "pariliitos"],"charCount":6990}, {"id":"debug-logs","title":"Virheenjäljityslokitiedot","section":"user","locale":"fi-rFI","resourcePath":"docs/fi-rFI/user/debug-logs.html","navOrder":22,"keywords":["virheenj", "ljityslokitiedot", "kaksi", "lilehte", "sovelluslokitietojen", "tarkastelu", "lokien", "vienti", "aiheeseen", "liittyv", "aiheet"],"aliases":["debug-lokitiedot", "logcat", "sovelluslokitiedot", "vikailmoitus"],"charCount":3495}, {"id":"desktop","title":"Työpöytäsovellus","section":"user","locale":"fi-rFI","resourcePath":"docs/fi-rFI/user/desktop.html","navOrder":14,"keywords":["sovellus", "asennus", "linux", "macos", "windows", "radioon", "yhdist", "minen", "usb", "sarjaportti", "ensisijainen", "tcp", "bluetooth", "ble", "ominaisuuksien", "yhtenevyys", "ytt", "liittym", "erot", "pikan", "imet", "ikkuna", "rjestelm", "tarjotin", "ilmoitusasetukset", "sis", "nrakennettu", "dokumentaatioselain", "rakentaminen", "hdekoodista"],"aliases":["työpöytä", "linux", "macos", "windows", "jvm"],"charCount":7341}, {"id":"discovery","title":"Haku","section":"user","locale":"fi-rFI","resourcePath":"docs/fi-rFI/user/discovery.html","navOrder":12,"keywords":["haku", "paikallinen", "verkon", "scanner", "skannauksen", "asetukset", "reaaliaikainen", "edistyminen", "tulosten", "lukeminen", "verkkokutsu", "manuaalinen", "reitinselvitys", "reitinselvityksen", "suorittaminen", "vianm", "ritys", "naapuritieto", "naapuritiedon", "ytt", "notto", "katselu", "radiolista", "hakuty", "kaluna", "uusien", "radioiden", "minen", "yhteyksien", "arviointi"],"aliases":["mesh-verkon haku", "paikallinen haku", "verkkohaku", "reitinselvitys", "naapuritieto"],"charCount":13793}, @@ -242,7 +242,7 @@ {"id":"mqtt","title":"MQTT","section":"user","locale":"fi-rFI","resourcePath":"docs/fi-rFI/user/mqtt.html","navOrder":11,"keywords":["mqtt", "yleiskatsaus", "kuinka", "toimii", "asetukset", "ytt", "notto", "lityspalvelin", "puhelimessa", "oletus", "meshtastic", "oma", "karttaraportointi", "hetys", "vastaanotto", "viestiformaatit", "salaus", "yksityisyys", "parhaat", "vianetsint", "yhdist", "viestit", "eiv", "lity", "aiheeseen", "liittyv", "aiheet"],"aliases":["mqtt", "internet-silta", "välityspalvelin"],"charCount":8621}, {"id":"node-metrics","title":"Radion mittarit","section":"user","locale":"fi-rFI","resourcePath":"docs/fi-rFI/user/node-metrics.html","navOrder":5,"keywords":["radion", "mittarit", "laitteen", "mittausloki", "ymp", "rist", "arvot", "ilmanlaatumittarit", "signaalin", "voimakkuudet", "laadun", "viitearvot", "virranhallinnan", "reitinselvitys", "reitinselvityksen", "tulosten", "lukeminen", "sijainnin", "loki", "naapuritieto", "mittareiden", "tarkastelu", "aiheeseen", "liittyv", "aiheet"],"aliases":["mittarit", "telemetria", "laitteen mittarit", "signaali"],"charCount":11584}, {"id":"nodes","title":"Laitteet","section":"user","locale":"fi-rFI","resourcePath":"docs/fi-rFI/user/nodes.html","navOrder":4,"keywords":["laitteet", "radiolista", "radion", "tilailmaisimet", "roolit", "roolin", "valitseminen", "salausilmaisimet", "pikatoiminnot", "suodatus", "lajittelu", "tekstihaku", "suodatusvalinnat", "lajitteluvaihtoehdot", "radiot", "hyppym", "mukaan", "tiedot", "laite", "linkit", "haluan", "sellaisen", "aiheeseen", "liittyv", "aiheet"],"aliases":["radiolista", "mesh-radiot", "vertaisradiot", "Hyppymääräjakauma"],"charCount":12857}, - {"id":"onboarding","title":"Aloittaminen","section":"user","locale":"fi-rFI","resourcePath":"docs/fi-rFI/user/onboarding.html","navOrder":1,"keywords":["aloittaminen", "ensimm", "inen", "ynnistys", "aloitusn", "kym", "ytt", "oikeudet", "bluetooth", "oikeus", "sijaintik", "ilmoitusk", "kriittisten", "lytysten", "rityksen", "lkeen", "mit", "seuraavaksi"],"aliases":["ensimmäinen käynnistys", "asetukset", "esittely"],"charCount":4565}, + {"id":"onboarding","title":"Aloittaminen","section":"user","locale":"fi-rFI","resourcePath":"docs/fi-rFI/user/onboarding.html","navOrder":1,"keywords":["aloittaminen", "ensimm", "inen", "ynnistys", "aloitusn", "kym", "ytt", "oikeudet", "bluetooth", "oikeus", "sijaintik", "ilmoitusk", "kriittisten", "lytysten", "oikeuksien", "tarkistaminen", "hemmin", "rityksen", "lkeen", "mit", "seuraavaksi"],"aliases":["ensimmäinen käynnistys", "asetukset", "esittely"],"charCount":8154}, {"id":"settings-module-admin","title":"Asetukset — Moduulit ja ylläpito","section":"user","locale":"fi-rFI","resourcePath":"docs/fi-rFI/user/settings-module-admin.html","navOrder":8,"keywords":["asetukset", "moduulit", "yll", "pito", "moduulin", "ritys", "mqtt", "moduuli", "sarjaporttimoduuli", "ulkoisten", "ilmoitusten", "varastoi", "lit", "kuuluvuustesti", "telemetriamoduuli", "valmiiden", "viestien", "nimoduuli", "laitteiston", "naapuritieto", "ymp", "rist", "valaistusmoduuli", "tunnistusanturimoduuli", "pax", "laskurimoduuli", "tak", "hallinta", "tyhjenn", "nodedb"],"aliases":["moduulit", "moduulin asetukset", "ylläpito"],"charCount":18618}, {"id":"settings-radio-user","title":"Asetukset — Radio ja käyttäjä","section":"user","locale":"fi-rFI","resourcePath":"docs/fi-rFI/user/settings-radio-user.html","navOrder":7,"keywords":["asetukset", "radio", "ytt", "profiili", "muutosten", "notto", "laitteen", "lora", "esiasetukset", "sijainnin", "virran", "verkon", "bluetooth", "turvallisuusasetukset", "aiheeseen", "liittyv", "aiheet"],"aliases":["asetukset", "radion asetukset", "käyttäjän asetukset", "lora"],"charCount":17419}, {"id":"signal-meter","title":"Kuinka Meshtastic-signaalimittari toimii","section":"user","locale":"fi-rFI","resourcePath":"docs/fi-rFI/user/signal-meter.html","navOrder":15,"keywords":["kuinka", "meshtastic", "signaalimittari", "toimii", "kaksi", "mittaria", "voimakkuus", "selkeys", "lora", "taika", "kuuleminen", "kohinan", "alta", "laskee", "laadun", "mit", "tarkoittaa", "sinulle", "miss", "signaalitieto", "kyy", "aiheeseen", "liittyv", "aiheet"],"aliases":["signaali", "signaalimittari", "snr", "rssi"],"charCount":6076}, @@ -253,7 +253,7 @@ {"id":"widget","title":"Aloitusnäytön widget","section":"user","locale":"fi-rFI","resourcePath":"docs/fi-rFI/user/widget.html","navOrder":20,"keywords":["aloitusn", "widget", "mit", "ytt", "widgetin", "lis", "minen", "aiheeseen", "liittyv", "aiheet"],"aliases":["widget", "aloitusnäytön widget", "paikalliset tilastot widget"],"charCount":2086}, {"id":"android-auto","title":"Android Auto","section":"user","locale":"fr-rCA","resourcePath":"docs/fr-rCA/user/android-auto.html","navOrder":18,"keywords":["android", "auto", "overview", "messages", "uds", "status", "related", "topics"],"aliases":["android-auto", "car", "head-unit", "auto"],"charCount":2950}, {"id":"app-functions","title":"App Functions","section":"user","locale":"fr-rCA","resourcePath":"docs/fr-rCA/user/app-functions.html","navOrder":19,"keywords":["app", "functions", "enabling", "write", "read", "privacy", "related", "topics"],"aliases":["app-functions", "system-ai", "gemini", "assistant"],"charCount":3528}, - {"id":"connections","title":"Connexions","section":"user","locale":"fr-rCA","resourcePath":"docs/fr-rCA/user/connections.html","navOrder":2,"keywords":["connexions", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "connections", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":4976}, + {"id":"connections","title":"Connexions","section":"user","locale":"fr-rCA","resourcePath":"docs/fr-rCA/user/connections.html","navOrder":2,"keywords":["connexions", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "connections", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":6465}, {"id":"debug-logs","title":"Debug Logs","section":"user","locale":"fr-rCA","resourcePath":"docs/fr-rCA/user/debug-logs.html","navOrder":22,"keywords":["debug", "logs", "the", "two", "tabs", "viewing", "app", "exporting", "desktop", "related", "topics"],"aliases":["debug-logs", "logcat", "app-logs", "bug-report"],"charCount":3015}, {"id":"desktop","title":"Desktop App","section":"user","locale":"fr-rCA","resourcePath":"docs/fr-rCA/user/desktop.html","navOrder":14,"keywords":["desktop", "app", "installation", "linux", "macos", "windows", "connecting", "your", "radio", "usb", "serial", "primary", "tcp", "bluetooth", "ble", "feature", "parity", "differences", "keyboard", "shortcuts", "window", "system", "tray", "notification", "preferences", "built", "documentation", "browser", "building", "from"],"aliases":["desktop", "linux", "macos", "windows", "jvm"],"charCount":6180}, {"id":"discovery","title":"Découverte","section":"user","locale":"fr-rCA","resourcePath":"docs/fr-rCA/user/discovery.html","navOrder":12,"keywords":["couverte", "local", "mesh", "discovery", "scanner", "setting", "scan", "live", "progress", "reading", "the", "results", "beacon", "manual", "exploration", "traceroute", "running", "troubleshooting", "with", "informations", "sur", "les", "voisins", "enabling", "neighbor", "info", "viewing", "data", "node", "list"],"aliases":["mesh-discovery", "local-discovery", "network-scan", "traceroute", "neighbor-info"],"charCount":12541}, @@ -264,7 +264,7 @@ {"id":"mqtt","title":"MQTT","section":"user","locale":"fr-rCA","resourcePath":"docs/fr-rCA/user/mqtt.html","navOrder":11,"keywords":["mqtt", "overview", "how", "works", "configuration", "enabling", "proxy", "this", "phone", "default", "meshtastic", "broker", "private", "map", "reporting", "uplink", "downlink", "message", "formats", "encryption", "privacy", "best", "practices", "troubleshooting", "not", "connecting", "messages", "bridging", "related", "topics"],"aliases":["mqtt", "internet-bridge", "broker"],"charCount":7864}, {"id":"node-metrics","title":"Node Metrics","section":"user","locale":"fr-rCA","resourcePath":"docs/fr-rCA/user/node-metrics.html","navOrder":5,"keywords":["node", "metrics", "triques", "appareil", "environnement", "air", "quality", "signal", "reference", "alimentation", "traceroute", "reading", "results", "journal", "des", "positions", "informations", "sur", "les", "voisins", "viewing", "related", "topics"],"aliases":["metrics", "telemetry", "device-metrics", "signal"],"charCount":9961}, {"id":"nodes","title":"Nœuds","section":"user","locale":"fr-rCA","resourcePath":"docs/fr-rCA/user/nodes.html","navOrder":4,"keywords":["uds", "node", "list", "status", "indicators", "roles", "choosing", "role", "encryption", "quick", "actions", "filtering", "sorting", "text", "search", "filter", "toggles", "sort", "options", "nodes", "per", "hop", "detail", "device", "links", "want", "one", "related", "topics"],"aliases":["node-list", "mesh-nodes", "peers", "hop-histogram"],"charCount":11298}, - {"id":"onboarding","title":"Getting Started","section":"user","locale":"fr-rCA","resourcePath":"docs/fr-rCA/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":4024}, + {"id":"onboarding","title":"Getting Started","section":"user","locale":"fr-rCA","resourcePath":"docs/fr-rCA/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "reviewing", "later", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":6885}, {"id":"settings-module-admin","title":"Settings — Modules & Admin","section":"user","locale":"fr-rCA","resourcePath":"docs/fr-rCA/user/settings-module-admin.html","navOrder":8,"keywords":["settings", "modules", "admin", "configuration", "module", "mqtt", "serial", "external", "notification", "store", "forward", "range", "test", "telemetry", "canned", "message", "audio", "remote", "hardware", "neighbor", "info", "ambient", "lighting", "detection", "sensor", "paxcounter", "tak", "administration", "distance", "nettoyer"],"aliases":["modules", "module-config", "administration"],"charCount":16003}, {"id":"settings-radio-user","title":"Settings — Radio & User","section":"user","locale":"fr-rCA","resourcePath":"docs/fr-rCA/user/settings-radio-user.html","navOrder":7,"keywords":["settings", "radio", "user", "param", "tres", "utilisateur", "profile", "applying", "changes", "configuration", "appareil", "lora", "modem", "presets", "cran", "position", "alimentation", "seau", "bluetooth", "curit", "related", "topics"],"aliases":["paramètres", "radio-config", "user-config", "lora"],"charCount":15160}, {"id":"signal-meter","title":"How the Meshtastic Signal Meter Works","section":"user","locale":"fr-rCA","resourcePath":"docs/fr-rCA/user/signal-meter.html","navOrder":15,"keywords":["how", "the", "meshtastic", "signal", "meter", "works", "two", "metrics", "loudness", "clarity", "magic", "lora", "hearing", "below", "noise", "floor", "calculates", "quality", "what", "this", "means", "for", "you", "where", "information", "appears", "related", "topics"],"aliases":["signal", "signal-meter", "snr", "rssi"],"charCount":5918}, @@ -275,7 +275,7 @@ {"id":"widget","title":"Home Screen Widget","section":"user","locale":"fr-rCA","resourcePath":"docs/fr-rCA/user/widget.html","navOrder":20,"keywords":["home", "screen", "widget", "what", "shows", "adding", "the", "related", "topics"],"aliases":["widget", "home-screen-widget", "local-stats-widget"],"charCount":1868}, {"id":"android-auto","title":"Android Auto","section":"user","locale":"fr-rFR","resourcePath":"docs/fr-rFR/user/android-auto.html","navOrder":18,"keywords":["android", "auto", "overview", "messages", "uds", "status", "related", "topics"],"aliases":["android-auto", "car", "head-unit", "auto"],"charCount":2950}, {"id":"app-functions","title":"App Functions","section":"user","locale":"fr-rFR","resourcePath":"docs/fr-rFR/user/app-functions.html","navOrder":19,"keywords":["app", "functions", "enabling", "write", "read", "privacy", "related", "topics"],"aliases":["app-functions", "system-ai", "gemini", "assistant"],"charCount":3528}, - {"id":"connections","title":"Connexions","section":"user","locale":"fr-rFR","resourcePath":"docs/fr-rFR/user/connections.html","navOrder":2,"keywords":["connexions", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "connections", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":4976}, + {"id":"connections","title":"Connexions","section":"user","locale":"fr-rFR","resourcePath":"docs/fr-rFR/user/connections.html","navOrder":2,"keywords":["connexions", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "connections", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":6465}, {"id":"debug-logs","title":"Debug Logs","section":"user","locale":"fr-rFR","resourcePath":"docs/fr-rFR/user/debug-logs.html","navOrder":22,"keywords":["debug", "logs", "the", "two", "tabs", "viewing", "app", "exporting", "desktop", "related", "topics"],"aliases":["debug-logs", "logcat", "app-logs", "bug-report"],"charCount":3015}, {"id":"desktop","title":"Desktop App","section":"user","locale":"fr-rFR","resourcePath":"docs/fr-rFR/user/desktop.html","navOrder":14,"keywords":["desktop", "app", "installation", "linux", "macos", "windows", "connecting", "your", "radio", "usb", "serial", "primary", "tcp", "bluetooth", "ble", "feature", "parity", "differences", "keyboard", "shortcuts", "window", "system", "tray", "notification", "preferences", "built", "documentation", "browser", "building", "from"],"aliases":["desktop", "linux", "macos", "windows", "jvm"],"charCount":6180}, {"id":"discovery","title":"Découverte","section":"user","locale":"fr-rFR","resourcePath":"docs/fr-rFR/user/discovery.html","navOrder":12,"keywords":["couverte", "local", "mesh", "discovery", "scanner", "setting", "scan", "live", "progress", "reading", "the", "results", "beacon", "manual", "exploration", "traceroute", "running", "troubleshooting", "with", "informations", "sur", "les", "voisins", "enabling", "neighbor", "info", "viewing", "data", "node", "list"],"aliases":["mesh-discovery", "local-discovery", "network-scan", "traceroute", "neighbor-info"],"charCount":12541}, @@ -286,7 +286,7 @@ {"id":"mqtt","title":"MQTT","section":"user","locale":"fr-rFR","resourcePath":"docs/fr-rFR/user/mqtt.html","navOrder":11,"keywords":["mqtt", "overview", "how", "works", "configuration", "enabling", "proxy", "this", "phone", "default", "meshtastic", "broker", "private", "map", "reporting", "uplink", "downlink", "message", "formats", "encryption", "privacy", "best", "practices", "troubleshooting", "not", "connecting", "messages", "bridging", "related", "topics"],"aliases":["mqtt", "internet-bridge", "broker"],"charCount":7864}, {"id":"node-metrics","title":"Node Metrics","section":"user","locale":"fr-rFR","resourcePath":"docs/fr-rFR/user/node-metrics.html","navOrder":5,"keywords":["node", "metrics", "triques", "appareil", "environnement", "air", "quality", "signal", "reference", "alimentation", "traceroute", "reading", "results", "journal", "des", "positions", "informations", "sur", "les", "voisins", "viewing", "related", "topics"],"aliases":["metrics", "telemetry", "device-metrics", "signal"],"charCount":9961}, {"id":"nodes","title":"Nœuds","section":"user","locale":"fr-rFR","resourcePath":"docs/fr-rFR/user/nodes.html","navOrder":4,"keywords":["uds", "node", "list", "status", "indicators", "roles", "choosing", "role", "encryption", "quick", "actions", "filtering", "sorting", "text", "search", "filter", "toggles", "sort", "options", "nodes", "per", "hop", "detail", "device", "links", "want", "one", "related", "topics"],"aliases":["node-list", "mesh-nodes", "peers", "hop-histogram"],"charCount":11298}, - {"id":"onboarding","title":"Getting Started","section":"user","locale":"fr-rFR","resourcePath":"docs/fr-rFR/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":4024}, + {"id":"onboarding","title":"Getting Started","section":"user","locale":"fr-rFR","resourcePath":"docs/fr-rFR/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "reviewing", "later", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":6885}, {"id":"settings-module-admin","title":"Settings — Modules & Admin","section":"user","locale":"fr-rFR","resourcePath":"docs/fr-rFR/user/settings-module-admin.html","navOrder":8,"keywords":["settings", "modules", "admin", "configuration", "module", "mqtt", "serial", "external", "notification", "store", "forward", "range", "test", "telemetry", "canned", "message", "audio", "remote", "hardware", "neighbor", "info", "ambient", "lighting", "detection", "sensor", "paxcounter", "tak", "administration", "distance", "nettoyer"],"aliases":["modules", "module-config", "administration"],"charCount":16003}, {"id":"settings-radio-user","title":"Settings — Radio & User","section":"user","locale":"fr-rFR","resourcePath":"docs/fr-rFR/user/settings-radio-user.html","navOrder":7,"keywords":["settings", "radio", "user", "param", "tres", "utilisateur", "profile", "applying", "changes", "configuration", "appareil", "lora", "modem", "presets", "cran", "position", "alimentation", "seau", "bluetooth", "curit", "related", "topics"],"aliases":["paramètres", "radio-config", "user-config", "lora"],"charCount":15160}, {"id":"signal-meter","title":"How the Meshtastic Signal Meter Works","section":"user","locale":"fr-rFR","resourcePath":"docs/fr-rFR/user/signal-meter.html","navOrder":15,"keywords":["how", "the", "meshtastic", "signal", "meter", "works", "two", "metrics", "loudness", "clarity", "magic", "lora", "hearing", "below", "noise", "floor", "calculates", "quality", "what", "this", "means", "for", "you", "where", "information", "appears", "related", "topics"],"aliases":["signal", "signal-meter", "snr", "rssi"],"charCount":5918}, @@ -297,7 +297,7 @@ {"id":"widget","title":"Home Screen Widget","section":"user","locale":"fr-rFR","resourcePath":"docs/fr-rFR/user/widget.html","navOrder":20,"keywords":["home", "screen", "widget", "what", "shows", "adding", "the", "related", "topics"],"aliases":["widget", "home-screen-widget", "local-stats-widget"],"charCount":1868}, {"id":"android-auto","title":"Android Auto","section":"user","locale":"ga-rIE","resourcePath":"docs/ga-rIE/user/android-auto.html","navOrder":18,"keywords":["android", "auto", "overview", "messages", "nodes", "status", "related", "topics"],"aliases":["android-auto", "car", "head-unit", "auto"],"charCount":2938}, {"id":"app-functions","title":"App Functions","section":"user","locale":"ga-rIE","resourcePath":"docs/ga-rIE/user/app-functions.html","navOrder":19,"keywords":["app", "functions", "enabling", "write", "read", "privacy", "related", "topics"],"aliases":["app-functions", "system-ai", "gemini", "assistant"],"charCount":3516}, - {"id":"connections","title":"Connections","section":"user","locale":"ga-rIE","resourcePath":"docs/ga-rIE/user/connections.html","navOrder":2,"keywords":["connections", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":4954}, + {"id":"connections","title":"Connections","section":"user","locale":"ga-rIE","resourcePath":"docs/ga-rIE/user/connections.html","navOrder":2,"keywords":["connections", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":6443}, {"id":"debug-logs","title":"Debug Logs","section":"user","locale":"ga-rIE","resourcePath":"docs/ga-rIE/user/debug-logs.html","navOrder":22,"keywords":["debug", "logs", "the", "two", "tabs", "viewing", "app", "exporting", "desktop", "related", "topics"],"aliases":["debug-logs", "logcat", "app-logs", "bug-report"],"charCount":3003}, {"id":"desktop","title":"Desktop App","section":"user","locale":"ga-rIE","resourcePath":"docs/ga-rIE/user/desktop.html","navOrder":14,"keywords":["desktop", "app", "installation", "linux", "macos", "windows", "connecting", "your", "radio", "usb", "serial", "primary", "tcp", "bluetooth", "ble", "feature", "parity", "differences", "keyboard", "shortcuts", "window", "system", "tray", "notification", "preferences", "built", "documentation", "browser", "building", "from"],"aliases":["desktop", "linux", "macos", "windows", "jvm"],"charCount":6180}, {"id":"discovery","title":"Discovery","section":"user","locale":"ga-rIE","resourcePath":"docs/ga-rIE/user/discovery.html","navOrder":12,"keywords":["discovery", "local", "mesh", "scanner", "setting", "scan", "live", "progress", "reading", "the", "results", "beacon", "manual", "exploration", "rianad", "ireachta", "running", "traceroute", "troubleshooting", "with", "neighbor", "info", "enabling", "viewing", "data", "node", "list", "tool", "finding", "new"],"aliases":["mesh-discovery", "local-discovery", "network-scan", "traceroute", "neighbor-info"],"charCount":12534}, @@ -308,7 +308,7 @@ {"id":"mqtt","title":"MQTT","section":"user","locale":"ga-rIE","resourcePath":"docs/ga-rIE/user/mqtt.html","navOrder":11,"keywords":["mqtt", "overview", "how", "works", "configuration", "enabling", "proxy", "this", "phone", "default", "meshtastic", "broker", "private", "map", "reporting", "uplink", "downlink", "message", "formats", "encryption", "privacy", "best", "practices", "troubleshooting", "not", "connecting", "messages", "bridging", "related", "topics"],"aliases":["mqtt", "internet-bridge", "broker"],"charCount":7844}, {"id":"node-metrics","title":"Node Metrics","section":"user","locale":"ga-rIE","resourcePath":"docs/ga-rIE/user/node-metrics.html","navOrder":5,"keywords":["node", "metrics", "device", "environment", "air", "quality", "signal", "reference", "power", "rianad", "ireachta", "reading", "traceroute", "results", "seirbh", "neighbor", "info", "viewing", "related", "topics"],"aliases":["metrics", "telemetry", "device-metrics", "signal"],"charCount":9892}, {"id":"nodes","title":"Nodes","section":"user","locale":"ga-rIE","resourcePath":"docs/ga-rIE/user/nodes.html","navOrder":4,"keywords":["nodes", "node", "list", "status", "indicators", "roles", "choosing", "role", "encryption", "quick", "actions", "filtering", "sorting", "text", "search", "filter", "toggles", "sort", "options", "per", "hop", "detail", "device", "links", "want", "one", "related", "topics"],"aliases":["node-list", "mesh-nodes", "peers", "hop-histogram"],"charCount":11285}, - {"id":"onboarding","title":"Getting Started","section":"user","locale":"ga-rIE","resourcePath":"docs/ga-rIE/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":4024}, + {"id":"onboarding","title":"Getting Started","section":"user","locale":"ga-rIE","resourcePath":"docs/ga-rIE/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "reviewing", "later", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":6885}, {"id":"settings-module-admin","title":"Settings — Modules & Admin","section":"user","locale":"ga-rIE","resourcePath":"docs/ga-rIE/user/settings-module-admin.html","navOrder":8,"keywords":["settings", "modules", "admin", "module", "configuration", "mqtt", "serial", "external", "notification", "store", "forward", "range", "test", "telemetry", "canned", "message", "audio", "remote", "hardware", "neighbor", "info", "ambient", "lighting", "detection", "sensor", "paxcounter", "tak", "rialachas", "rial", "iarg"],"aliases":["modules", "module-config", "administration"],"charCount":15869}, {"id":"settings-radio-user","title":"Settings — Radio & User","section":"user","locale":"ga-rIE","resourcePath":"docs/ga-rIE/user/settings-radio-user.html","navOrder":7,"keywords":["settings", "radio", "user", "profile", "applying", "changes", "configuration", "device", "config", "lora", "modem", "presets", "display", "position", "power", "network", "bluetooth", "security", "related", "topics"],"aliases":["settings", "radio-config", "user-config", "lora"],"charCount":14946}, {"id":"signal-meter","title":"How the Meshtastic Signal Meter Works","section":"user","locale":"ga-rIE","resourcePath":"docs/ga-rIE/user/signal-meter.html","navOrder":15,"keywords":["how", "the", "meshtastic", "signal", "meter", "works", "two", "metrics", "loudness", "clarity", "magic", "lora", "hearing", "below", "noise", "floor", "calculates", "quality", "what", "this", "means", "for", "you", "where", "information", "appears", "related", "topics"],"aliases":["signal", "signal-meter", "snr", "rssi"],"charCount":5966}, @@ -319,7 +319,7 @@ {"id":"widget","title":"Home Screen Widget","section":"user","locale":"ga-rIE","resourcePath":"docs/ga-rIE/user/widget.html","navOrder":20,"keywords":["home", "screen", "widget", "what", "shows", "adding", "the", "related", "topics"],"aliases":["widget", "home-screen-widget", "local-stats-widget"],"charCount":1856}, {"id":"android-auto","title":"Android Auto","section":"user","locale":"gl-rES","resourcePath":"docs/gl-rES/user/android-auto.html","navOrder":18,"keywords":["android", "auto", "overview", "messages", "nodes", "status", "related", "topics"],"aliases":["android-auto", "car", "head-unit", "auto"],"charCount":2938}, {"id":"app-functions","title":"App Functions","section":"user","locale":"gl-rES","resourcePath":"docs/gl-rES/user/app-functions.html","navOrder":19,"keywords":["app", "functions", "enabling", "write", "read", "privacy", "related", "topics"],"aliases":["app-functions", "system-ai", "gemini", "assistant"],"charCount":3516}, - {"id":"connections","title":"Connections","section":"user","locale":"gl-rES","resourcePath":"docs/gl-rES/user/connections.html","navOrder":2,"keywords":["connections", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":4954}, + {"id":"connections","title":"Connections","section":"user","locale":"gl-rES","resourcePath":"docs/gl-rES/user/connections.html","navOrder":2,"keywords":["connections", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":6443}, {"id":"debug-logs","title":"Debug Logs","section":"user","locale":"gl-rES","resourcePath":"docs/gl-rES/user/debug-logs.html","navOrder":22,"keywords":["debug", "logs", "the", "two", "tabs", "viewing", "app", "exporting", "desktop", "related", "topics"],"aliases":["debug-logs", "logcat", "app-logs", "bug-report"],"charCount":3003}, {"id":"desktop","title":"Desktop App","section":"user","locale":"gl-rES","resourcePath":"docs/gl-rES/user/desktop.html","navOrder":14,"keywords":["desktop", "app", "installation", "linux", "macos", "windows", "connecting", "your", "radio", "usb", "serial", "primary", "tcp", "bluetooth", "ble", "feature", "parity", "differences", "keyboard", "shortcuts", "window", "system", "tray", "notification", "preferences", "built", "documentation", "browser", "building", "from"],"aliases":["desktop", "linux", "macos", "windows", "jvm"],"charCount":6180}, {"id":"discovery","title":"Discovery","section":"user","locale":"gl-rES","resourcePath":"docs/gl-rES/user/discovery.html","navOrder":12,"keywords":["discovery", "local", "mesh", "scanner", "setting", "scan", "live", "progress", "reading", "the", "results", "beacon", "manual", "exploration", "traza", "ruta", "running", "traceroute", "troubleshooting", "with", "neighbor", "info", "enabling", "viewing", "data", "node", "list", "tool", "finding", "new"],"aliases":["mesh-discovery", "local-discovery", "network-scan", "traceroute", "neighbor-info"],"charCount":12524}, @@ -330,7 +330,7 @@ {"id":"mqtt","title":"MQTT","section":"user","locale":"gl-rES","resourcePath":"docs/gl-rES/user/mqtt.html","navOrder":11,"keywords":["mqtt", "overview", "how", "works", "configuration", "enabling", "proxy", "this", "phone", "default", "meshtastic", "broker", "private", "map", "reporting", "uplink", "downlink", "message", "formats", "encryption", "privacy", "best", "practices", "troubleshooting", "not", "connecting", "messages", "bridging", "related", "topics"],"aliases":["mqtt", "internet-bridge", "broker"],"charCount":7844}, {"id":"node-metrics","title":"Node Metrics","section":"user","locale":"gl-rES","resourcePath":"docs/gl-rES/user/node-metrics.html","navOrder":5,"keywords":["node", "metrics", "device", "environment", "air", "quality", "signal", "reference", "power", "traza", "ruta", "reading", "traceroute", "results", "position", "log", "neighbor", "info", "viewing", "related", "topics"],"aliases":["metrics", "telemetry", "device-metrics", "signal"],"charCount":9867}, {"id":"nodes","title":"Nodes","section":"user","locale":"gl-rES","resourcePath":"docs/gl-rES/user/nodes.html","navOrder":4,"keywords":["nodes", "node", "list", "status", "indicators", "roles", "choosing", "role", "encryption", "quick", "actions", "filtering", "sorting", "text", "search", "filter", "toggles", "sort", "options", "per", "hop", "detail", "device", "links", "want", "one", "related", "topics"],"aliases":["node-list", "mesh-nodes", "peers", "hop-histogram"],"charCount":11264}, - {"id":"onboarding","title":"Getting Started","section":"user","locale":"gl-rES","resourcePath":"docs/gl-rES/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":4024}, + {"id":"onboarding","title":"Getting Started","section":"user","locale":"gl-rES","resourcePath":"docs/gl-rES/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "reviewing", "later", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":6885}, {"id":"settings-module-admin","title":"Settings — Modules & Admin","section":"user","locale":"gl-rES","resourcePath":"docs/gl-rES/user/settings-module-admin.html","navOrder":8,"keywords":["settings", "modules", "admin", "module", "configuration", "mqtt", "serial", "external", "notification", "store", "forward", "range", "test", "telemetry", "canned", "message", "audio", "remote", "hardware", "neighbor", "info", "ambient", "lighting", "detection", "sensor", "paxcounter", "tak", "administration", "clean", "node"],"aliases":["modules", "module-config", "administration"],"charCount":15884}, {"id":"settings-radio-user","title":"Settings — Radio & User","section":"user","locale":"gl-rES","resourcePath":"docs/gl-rES/user/settings-radio-user.html","navOrder":7,"keywords":["settings", "radio", "user", "profile", "applying", "changes", "configuration", "device", "config", "lora", "modem", "presets", "display", "position", "power", "network", "bluetooth", "security", "related", "topics"],"aliases":["settings", "radio-config", "user-config", "lora"],"charCount":14946}, {"id":"signal-meter","title":"How the Meshtastic Signal Meter Works","section":"user","locale":"gl-rES","resourcePath":"docs/gl-rES/user/signal-meter.html","navOrder":15,"keywords":["how", "the", "meshtastic", "signal", "meter", "works", "two", "metrics", "loudness", "clarity", "magic", "lora", "hearing", "below", "noise", "floor", "calculates", "quality", "what", "this", "means", "for", "you", "where", "information", "appears", "related", "topics"],"aliases":["signal", "signal-meter", "snr", "rssi"],"charCount":5900}, @@ -341,7 +341,7 @@ {"id":"widget","title":"Home Screen Widget","section":"user","locale":"gl-rES","resourcePath":"docs/gl-rES/user/widget.html","navOrder":20,"keywords":["home", "screen", "widget", "what", "shows", "adding", "the", "related", "topics"],"aliases":["widget", "home-screen-widget", "local-stats-widget"],"charCount":1856}, {"id":"android-auto","title":"Android Auto","section":"user","locale":"hr-rHR","resourcePath":"docs/hr-rHR/user/android-auto.html","navOrder":18,"keywords":["android", "auto", "overview", "messages", "nodes", "status", "related", "topics"],"aliases":["android-auto", "car", "head-unit", "auto"],"charCount":2938}, {"id":"app-functions","title":"App Functions","section":"user","locale":"hr-rHR","resourcePath":"docs/hr-rHR/user/app-functions.html","navOrder":19,"keywords":["app", "functions", "enabling", "write", "read", "privacy", "related", "topics"],"aliases":["app-functions", "system-ai", "gemini", "assistant"],"charCount":3516}, - {"id":"connections","title":"Connections","section":"user","locale":"hr-rHR","resourcePath":"docs/hr-rHR/user/connections.html","navOrder":2,"keywords":["connections", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":4954}, + {"id":"connections","title":"Connections","section":"user","locale":"hr-rHR","resourcePath":"docs/hr-rHR/user/connections.html","navOrder":2,"keywords":["connections", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":6443}, {"id":"debug-logs","title":"Debug Logs","section":"user","locale":"hr-rHR","resourcePath":"docs/hr-rHR/user/debug-logs.html","navOrder":22,"keywords":["debug", "logs", "the", "two", "tabs", "viewing", "app", "exporting", "desktop", "related", "topics"],"aliases":["debug-logs", "logcat", "app-logs", "bug-report"],"charCount":3003}, {"id":"desktop","title":"Desktop App","section":"user","locale":"hr-rHR","resourcePath":"docs/hr-rHR/user/desktop.html","navOrder":14,"keywords":["desktop", "app", "installation", "linux", "macos", "windows", "connecting", "your", "radio", "usb", "serial", "primary", "tcp", "bluetooth", "ble", "feature", "parity", "differences", "keyboard", "shortcuts", "window", "system", "tray", "notification", "preferences", "built", "documentation", "browser", "building", "from"],"aliases":["desktop", "linux", "macos", "windows", "jvm"],"charCount":6180}, {"id":"discovery","title":"Discovery","section":"user","locale":"hr-rHR","resourcePath":"docs/hr-rHR/user/discovery.html","navOrder":12,"keywords":["discovery", "local", "mesh", "scanner", "setting", "scan", "live", "progress", "reading", "the", "results", "beacon", "manual", "exploration", "traceroute", "running", "troubleshooting", "with", "neighbor", "info", "enabling", "viewing", "data", "node", "list", "tool", "finding", "new", "nodes", "assessing"],"aliases":["mesh-discovery", "local-discovery", "network-scan", "traceroute", "neighbor-info"],"charCount":12524}, @@ -352,7 +352,7 @@ {"id":"mqtt","title":"MQTT","section":"user","locale":"hr-rHR","resourcePath":"docs/hr-rHR/user/mqtt.html","navOrder":11,"keywords":["mqtt", "overview", "how", "works", "configuration", "enabling", "proxy", "this", "phone", "default", "meshtastic", "broker", "private", "map", "reporting", "uplink", "downlink", "message", "formats", "encryption", "privacy", "best", "practices", "troubleshooting", "not", "connecting", "messages", "bridging", "related", "topics"],"aliases":["mqtt", "internet-bridge", "broker"],"charCount":7844}, {"id":"node-metrics","title":"Node Metrics","section":"user","locale":"hr-rHR","resourcePath":"docs/hr-rHR/user/node-metrics.html","navOrder":5,"keywords":["node", "metrics", "device", "environment", "air", "quality", "signal", "reference", "power", "traceroute", "reading", "results", "position", "log", "neighbor", "info", "viewing", "related", "topics"],"aliases":["metrics", "telemetry", "device-metrics", "signal"],"charCount":9867}, {"id":"nodes","title":"Nodes","section":"user","locale":"hr-rHR","resourcePath":"docs/hr-rHR/user/nodes.html","navOrder":4,"keywords":["nodes", "node", "list", "status", "indicators", "roles", "choosing", "role", "encryption", "quick", "actions", "filtering", "sorting", "text", "search", "filter", "toggles", "sort", "options", "per", "hop", "detail", "device", "links", "want", "one", "related", "topics"],"aliases":["node-list", "mesh-nodes", "peers", "hop-histogram"],"charCount":11264}, - {"id":"onboarding","title":"Getting Started","section":"user","locale":"hr-rHR","resourcePath":"docs/hr-rHR/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":4024}, + {"id":"onboarding","title":"Getting Started","section":"user","locale":"hr-rHR","resourcePath":"docs/hr-rHR/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "reviewing", "later", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":6885}, {"id":"settings-module-admin","title":"Settings — Modules & Admin","section":"user","locale":"hr-rHR","resourcePath":"docs/hr-rHR/user/settings-module-admin.html","navOrder":8,"keywords":["settings", "modules", "admin", "module", "configuration", "mqtt", "serial", "external", "notification", "store", "forward", "range", "test", "telemetry", "canned", "message", "audio", "remote", "hardware", "neighbor", "info", "ambient", "lighting", "detection", "sensor", "paxcounter", "tak", "administration", "clean", "node"],"aliases":["modules", "module-config", "administration"],"charCount":15892}, {"id":"settings-radio-user","title":"Settings — Radio & User","section":"user","locale":"hr-rHR","resourcePath":"docs/hr-rHR/user/settings-radio-user.html","navOrder":7,"keywords":["settings", "radio", "user", "profile", "applying", "changes", "configuration", "device", "config", "lora", "modem", "presets", "display", "position", "power", "network", "postavke", "bluetootha", "security", "related", "topics"],"aliases":["settings", "radio-config", "user-config", "lora"],"charCount":14949}, {"id":"signal-meter","title":"How the Meshtastic Signal Meter Works","section":"user","locale":"hr-rHR","resourcePath":"docs/hr-rHR/user/signal-meter.html","navOrder":15,"keywords":["how", "the", "meshtastic", "signal", "meter", "works", "two", "metrics", "loudness", "clarity", "magic", "lora", "hearing", "below", "noise", "floor", "calculates", "quality", "what", "this", "means", "for", "you", "where", "information", "appears", "related", "topics"],"aliases":["signal", "signal-meter", "snr", "rssi"],"charCount":5900}, @@ -363,7 +363,7 @@ {"id":"widget","title":"Home Screen Widget","section":"user","locale":"hr-rHR","resourcePath":"docs/hr-rHR/user/widget.html","navOrder":20,"keywords":["home", "screen", "widget", "what", "shows", "adding", "the", "related", "topics"],"aliases":["widget", "home-screen-widget", "local-stats-widget"],"charCount":1856}, {"id":"android-auto","title":"Android Auto","section":"user","locale":"ht-rHT","resourcePath":"docs/ht-rHT/user/android-auto.html","navOrder":18,"keywords":["android", "auto", "overview", "messages", "nodes", "status", "related", "topics"],"aliases":["android-auto", "car", "head-unit", "auto"],"charCount":2938}, {"id":"app-functions","title":"App Functions","section":"user","locale":"ht-rHT","resourcePath":"docs/ht-rHT/user/app-functions.html","navOrder":19,"keywords":["app", "functions", "enabling", "write", "read", "privacy", "related", "topics"],"aliases":["app-functions", "system-ai", "gemini", "assistant"],"charCount":3516}, - {"id":"connections","title":"Connections","section":"user","locale":"ht-rHT","resourcePath":"docs/ht-rHT/user/connections.html","navOrder":2,"keywords":["connections", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":4954}, + {"id":"connections","title":"Connections","section":"user","locale":"ht-rHT","resourcePath":"docs/ht-rHT/user/connections.html","navOrder":2,"keywords":["connections", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":6443}, {"id":"debug-logs","title":"Debug Logs","section":"user","locale":"ht-rHT","resourcePath":"docs/ht-rHT/user/debug-logs.html","navOrder":22,"keywords":["debug", "logs", "the", "two", "tabs", "viewing", "app", "exporting", "desktop", "related", "topics"],"aliases":["debug-logs", "logcat", "app-logs", "bug-report"],"charCount":3003}, {"id":"desktop","title":"Desktop App","section":"user","locale":"ht-rHT","resourcePath":"docs/ht-rHT/user/desktop.html","navOrder":14,"keywords":["desktop", "app", "installation", "linux", "macos", "windows", "connecting", "your", "radio", "usb", "serial", "primary", "tcp", "bluetooth", "ble", "feature", "parity", "differences", "keyboard", "shortcuts", "window", "system", "tray", "notification", "preferences", "built", "documentation", "browser", "building", "from"],"aliases":["desktop", "linux", "macos", "windows", "jvm"],"charCount":6180}, {"id":"discovery","title":"Discovery","section":"user","locale":"ht-rHT","resourcePath":"docs/ht-rHT/user/discovery.html","navOrder":12,"keywords":["discovery", "local", "mesh", "scanner", "setting", "scan", "live", "progress", "reading", "the", "results", "beacon", "manual", "exploration", "traceroute", "running", "troubleshooting", "with", "neighbor", "info", "enabling", "viewing", "data", "node", "list", "tool", "finding", "new", "nodes", "assessing"],"aliases":["mesh-discovery", "local-discovery", "network-scan", "traceroute", "neighbor-info"],"charCount":12524}, @@ -374,7 +374,7 @@ {"id":"mqtt","title":"MQTT","section":"user","locale":"ht-rHT","resourcePath":"docs/ht-rHT/user/mqtt.html","navOrder":11,"keywords":["mqtt", "overview", "how", "works", "configuration", "enabling", "proxy", "this", "phone", "default", "meshtastic", "broker", "private", "map", "reporting", "uplink", "downlink", "message", "formats", "encryption", "privacy", "best", "practices", "troubleshooting", "not", "connecting", "messages", "bridging", "related", "topics"],"aliases":["mqtt", "internet-bridge", "broker"],"charCount":7844}, {"id":"node-metrics","title":"Node Metrics","section":"user","locale":"ht-rHT","resourcePath":"docs/ht-rHT/user/node-metrics.html","navOrder":5,"keywords":["node", "metrics", "device", "environment", "air", "quality", "signal", "reference", "power", "traceroute", "reading", "results", "jounal", "pozisyon", "neighbor", "info", "viewing", "related", "topics"],"aliases":["metrics", "telemetry", "device-metrics", "signal"],"charCount":9856}, {"id":"nodes","title":"Nodes","section":"user","locale":"ht-rHT","resourcePath":"docs/ht-rHT/user/nodes.html","navOrder":4,"keywords":["nodes", "node", "list", "status", "indicators", "roles", "choosing", "role", "encryption", "quick", "actions", "filtering", "sorting", "text", "search", "filter", "toggles", "sort", "options", "per", "hop", "detail", "device", "links", "want", "one", "related", "topics"],"aliases":["node-list", "mesh-nodes", "peers", "hop-histogram"],"charCount":11292}, - {"id":"onboarding","title":"Getting Started","section":"user","locale":"ht-rHT","resourcePath":"docs/ht-rHT/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":4024}, + {"id":"onboarding","title":"Getting Started","section":"user","locale":"ht-rHT","resourcePath":"docs/ht-rHT/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "reviewing", "later", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":6885}, {"id":"settings-module-admin","title":"Settings — Modules & Admin","section":"user","locale":"ht-rHT","resourcePath":"docs/ht-rHT/user/settings-module-admin.html","navOrder":8,"keywords":["settings", "modules", "admin", "module", "configuration", "mqtt", "serial", "external", "notification", "store", "forward", "range", "test", "telemetry", "canned", "message", "audio", "remote", "hardware", "neighbor", "info", "ambient", "lighting", "detection", "sensor", "paxcounter", "tak", "administrasyon", "clean", "node"],"aliases":["modules", "module-config", "administration"],"charCount":15876}, {"id":"settings-radio-user","title":"Settings — Radio & User","section":"user","locale":"ht-rHT","resourcePath":"docs/ht-rHT/user/settings-radio-user.html","navOrder":7,"keywords":["settings", "radio", "user", "profile", "applying", "changes", "configuration", "device", "config", "lora", "modem", "presets", "display", "position", "power", "network", "bluetooth", "security", "related", "topics"],"aliases":["settings", "radio-config", "user-config", "lora"],"charCount":14946}, {"id":"signal-meter","title":"How the Meshtastic Signal Meter Works","section":"user","locale":"ht-rHT","resourcePath":"docs/ht-rHT/user/signal-meter.html","navOrder":15,"keywords":["how", "the", "meshtastic", "signal", "meter", "works", "two", "metrics", "loudness", "clarity", "magic", "lora", "hearing", "below", "noise", "floor", "calculates", "quality", "what", "this", "means", "for", "you", "where", "information", "appears", "related", "topics"],"aliases":["signal", "signal-meter", "snr", "rssi"],"charCount":5906}, @@ -385,7 +385,7 @@ {"id":"widget","title":"Home Screen Widget","section":"user","locale":"ht-rHT","resourcePath":"docs/ht-rHT/user/widget.html","navOrder":20,"keywords":["home", "screen", "widget", "what", "shows", "adding", "the", "related", "topics"],"aliases":["widget", "home-screen-widget", "local-stats-widget"],"charCount":1856}, {"id":"android-auto","title":"Android Auto","section":"user","locale":"hu-rHU","resourcePath":"docs/hu-rHU/user/android-auto.html","navOrder":18,"keywords":["android", "auto", "overview", "zenetek", "csom", "pontok", "status", "related", "topics"],"aliases":["android-auto", "car", "head-unit", "auto"],"charCount":2944}, {"id":"app-functions","title":"App Functions","section":"user","locale":"hu-rHU","resourcePath":"docs/hu-rHU/user/app-functions.html","navOrder":19,"keywords":["app", "functions", "enabling", "write", "read", "privacy", "related", "topics"],"aliases":["app-functions", "system-ai", "gemini", "assistant"],"charCount":3516}, - {"id":"connections","title":"Connections","section":"user","locale":"hu-rHU","resourcePath":"docs/hu-rHU/user/connections.html","navOrder":2,"keywords":["connections", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":4954}, + {"id":"connections","title":"Connections","section":"user","locale":"hu-rHU","resourcePath":"docs/hu-rHU/user/connections.html","navOrder":2,"keywords":["connections", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":6443}, {"id":"debug-logs","title":"Debug Logs","section":"user","locale":"hu-rHU","resourcePath":"docs/hu-rHU/user/debug-logs.html","navOrder":22,"keywords":["debug", "logs", "the", "two", "tabs", "viewing", "app", "exporting", "desktop", "related", "topics"],"aliases":["debug-logs", "logcat", "app-logs", "bug-report"],"charCount":3003}, {"id":"desktop","title":"Desktop App","section":"user","locale":"hu-rHU","resourcePath":"docs/hu-rHU/user/desktop.html","navOrder":14,"keywords":["desktop", "app", "installation", "linux", "macos", "windows", "connecting", "your", "radio", "usb", "serial", "primary", "tcp", "bluetooth", "ble", "feature", "parity", "differences", "keyboard", "shortcuts", "window", "system", "tray", "notification", "preferences", "built", "documentation", "browser", "building", "from"],"aliases":["desktop", "linux", "macos", "windows", "jvm"],"charCount":6180}, {"id":"discovery","title":"Discovery","section":"user","locale":"hu-rHU","resourcePath":"docs/hu-rHU/user/discovery.html","navOrder":12,"keywords":["discovery", "local", "mesh", "scanner", "setting", "scan", "live", "progress", "reading", "the", "results", "beacon", "manual", "exploration", "traceroute", "running", "troubleshooting", "with", "szomsz", "inform", "enabling", "neighbor", "info", "viewing", "data", "node", "list", "tool", "finding", "new"],"aliases":["mesh-discovery", "local-discovery", "network-scan", "traceroute", "neighbor-info"],"charCount":12530}, @@ -396,7 +396,7 @@ {"id":"mqtt","title":"MQTT","section":"user","locale":"hu-rHU","resourcePath":"docs/hu-rHU/user/mqtt.html","navOrder":11,"keywords":["mqtt", "overview", "how", "works", "configuration", "enabling", "proxy", "this", "phone", "default", "meshtastic", "broker", "private", "map", "reporting", "uplink", "downlink", "message", "formats", "encryption", "privacy", "best", "practices", "troubleshooting", "not", "connecting", "messages", "bridging", "related", "topics"],"aliases":["mqtt", "internet-bridge", "broker"],"charCount":7844}, {"id":"node-metrics","title":"Node Metrics","section":"user","locale":"hu-rHU","resourcePath":"docs/hu-rHU/user/node-metrics.html","navOrder":5,"keywords":["node", "metrics", "eszk", "zmetrik", "rnyezeti", "metrik", "air", "quality", "signal", "reference", "pell", "traceroute", "reading", "results", "poz", "napl", "szomsz", "inform", "viewing", "related", "topics"],"aliases":["metrics", "telemetry", "device-metrics", "signal"],"charCount":9878}, {"id":"nodes","title":"Csomópontok","section":"user","locale":"hu-rHU","resourcePath":"docs/hu-rHU/user/nodes.html","navOrder":4,"keywords":["csom", "pontok", "node", "list", "status", "indicators", "roles", "choosing", "role", "encryption", "quick", "actions", "filtering", "sorting", "text", "search", "filter", "toggles", "sort", "options", "nodes", "per", "hop", "detail", "device", "links", "want", "one", "related", "topics"],"aliases":["node-list", "mesh-nodes", "peers", "hop-histogram"],"charCount":11290}, - {"id":"onboarding","title":"Getting Started","section":"user","locale":"hu-rHU","resourcePath":"docs/hu-rHU/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":4024}, + {"id":"onboarding","title":"Getting Started","section":"user","locale":"hu-rHU","resourcePath":"docs/hu-rHU/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "reviewing", "later", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":6885}, {"id":"settings-module-admin","title":"Settings — Modules & Admin","section":"user","locale":"hu-rHU","resourcePath":"docs/hu-rHU/user/settings-module-admin.html","navOrder":8,"keywords":["settings", "modules", "admin", "module", "configuration", "mqtt", "serial", "external", "notification", "store", "forward", "range", "test", "telemetry", "canned", "message", "audio", "remote", "hardware", "neighbor", "info", "ambient", "lighting", "detection", "sensor", "paxcounter", "tak", "adminisztr", "voli", "csom"],"aliases":["modules", "module-config", "administration"],"charCount":15908}, {"id":"settings-radio-user","title":"Settings — Radio & User","section":"user","locale":"hu-rHU","resourcePath":"docs/hu-rHU/user/settings-radio-user.html","navOrder":7,"keywords":["settings", "radio", "user", "profile", "applying", "changes", "configuration", "eszk", "zbe", "sok", "lora", "modem", "presets", "kijelz", "poz", "energia", "zati", "bluetooth", "biztons", "related", "topics"],"aliases":["beállítások", "radio-config", "user-config", "lora"],"charCount":15042}, {"id":"signal-meter","title":"How the Meshtastic Signal Meter Works","section":"user","locale":"hu-rHU","resourcePath":"docs/hu-rHU/user/signal-meter.html","navOrder":15,"keywords":["how", "the", "meshtastic", "signal", "meter", "works", "two", "metrics", "loudness", "clarity", "magic", "lora", "hearing", "below", "noise", "floor", "calculates", "quality", "what", "this", "means", "for", "you", "where", "information", "appears", "related", "topics"],"aliases":["signal", "signal-meter", "snr", "rssi"],"charCount":5924}, @@ -407,7 +407,7 @@ {"id":"widget","title":"Home Screen Widget","section":"user","locale":"hu-rHU","resourcePath":"docs/hu-rHU/user/widget.html","navOrder":20,"keywords":["home", "screen", "widget", "what", "shows", "adding", "the", "related", "topics"],"aliases":["widget", "home-screen-widget", "local-stats-widget"],"charCount":1856}, {"id":"android-auto","title":"Android Auto","section":"user","locale":"is-rIS","resourcePath":"docs/is-rIS/user/android-auto.html","navOrder":18,"keywords":["android", "auto", "overview", "messages", "nodes", "status", "related", "topics"],"aliases":["android-auto", "car", "head-unit", "auto"],"charCount":2938}, {"id":"app-functions","title":"App Functions","section":"user","locale":"is-rIS","resourcePath":"docs/is-rIS/user/app-functions.html","navOrder":19,"keywords":["app", "functions", "enabling", "write", "read", "privacy", "related", "topics"],"aliases":["app-functions", "system-ai", "gemini", "assistant"],"charCount":3516}, - {"id":"connections","title":"Connections","section":"user","locale":"is-rIS","resourcePath":"docs/is-rIS/user/connections.html","navOrder":2,"keywords":["connections", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":4954}, + {"id":"connections","title":"Connections","section":"user","locale":"is-rIS","resourcePath":"docs/is-rIS/user/connections.html","navOrder":2,"keywords":["connections", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":6443}, {"id":"debug-logs","title":"Debug Logs","section":"user","locale":"is-rIS","resourcePath":"docs/is-rIS/user/debug-logs.html","navOrder":22,"keywords":["debug", "logs", "the", "two", "tabs", "viewing", "app", "exporting", "desktop", "related", "topics"],"aliases":["debug-logs", "logcat", "app-logs", "bug-report"],"charCount":3003}, {"id":"desktop","title":"Desktop App","section":"user","locale":"is-rIS","resourcePath":"docs/is-rIS/user/desktop.html","navOrder":14,"keywords":["desktop", "app", "installation", "linux", "macos", "windows", "connecting", "your", "radio", "usb", "serial", "primary", "tcp", "bluetooth", "ble", "feature", "parity", "differences", "keyboard", "shortcuts", "window", "system", "tray", "notification", "preferences", "built", "documentation", "browser", "building", "from"],"aliases":["desktop", "linux", "macos", "windows", "jvm"],"charCount":6180}, {"id":"discovery","title":"Discovery","section":"user","locale":"is-rIS","resourcePath":"docs/is-rIS/user/discovery.html","navOrder":12,"keywords":["discovery", "local", "mesh", "scanner", "setting", "scan", "live", "progress", "reading", "the", "results", "beacon", "manual", "exploration", "ferilk", "nnun", "running", "traceroute", "troubleshooting", "with", "neighbor", "info", "enabling", "viewing", "data", "node", "list", "tool", "finding", "new"],"aliases":["mesh-discovery", "local-discovery", "network-scan", "traceroute", "neighbor-info"],"charCount":12525}, @@ -418,7 +418,7 @@ {"id":"mqtt","title":"MQTT","section":"user","locale":"is-rIS","resourcePath":"docs/is-rIS/user/mqtt.html","navOrder":11,"keywords":["mqtt", "overview", "how", "works", "configuration", "enabling", "proxy", "this", "phone", "default", "meshtastic", "broker", "private", "map", "reporting", "uplink", "downlink", "message", "formats", "encryption", "privacy", "best", "practices", "troubleshooting", "not", "connecting", "messages", "bridging", "related", "topics"],"aliases":["mqtt", "internet-bridge", "broker"],"charCount":7844}, {"id":"node-metrics","title":"Node Metrics","section":"user","locale":"is-rIS","resourcePath":"docs/is-rIS/user/node-metrics.html","navOrder":5,"keywords":["node", "metrics", "device", "environment", "air", "quality", "signal", "reference", "power", "ferilk", "nnun", "reading", "traceroute", "results", "position", "log", "neighbor", "info", "viewing", "related", "topics"],"aliases":["metrics", "telemetry", "device-metrics", "signal"],"charCount":9868}, {"id":"nodes","title":"Nodes","section":"user","locale":"is-rIS","resourcePath":"docs/is-rIS/user/nodes.html","navOrder":4,"keywords":["nodes", "node", "list", "status", "indicators", "roles", "choosing", "role", "encryption", "quick", "actions", "filtering", "sorting", "text", "search", "filter", "toggles", "sort", "options", "per", "hop", "detail", "device", "links", "want", "one", "related", "topics"],"aliases":["node-list", "mesh-nodes", "peers", "hop-histogram"],"charCount":11264}, - {"id":"onboarding","title":"Getting Started","section":"user","locale":"is-rIS","resourcePath":"docs/is-rIS/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":4024}, + {"id":"onboarding","title":"Getting Started","section":"user","locale":"is-rIS","resourcePath":"docs/is-rIS/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "reviewing", "later", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":6885}, {"id":"settings-module-admin","title":"Settings — Modules & Admin","section":"user","locale":"is-rIS","resourcePath":"docs/is-rIS/user/settings-module-admin.html","navOrder":8,"keywords":["settings", "modules", "admin", "module", "configuration", "mqtt", "serial", "external", "notification", "store", "forward", "range", "test", "telemetry", "canned", "message", "audio", "remote", "hardware", "neighbor", "info", "ambient", "lighting", "detection", "sensor", "paxcounter", "tak", "administration", "clean", "node"],"aliases":["modules", "module-config", "administration"],"charCount":15880}, {"id":"settings-radio-user","title":"Settings — Radio & User","section":"user","locale":"is-rIS","resourcePath":"docs/is-rIS/user/settings-radio-user.html","navOrder":7,"keywords":["settings", "radio", "user", "profile", "applying", "changes", "configuration", "device", "config", "lora", "modem", "presets", "display", "position", "power", "network", "bluetooth", "security", "related", "topics"],"aliases":["settings", "radio-config", "user-config", "lora"],"charCount":14946}, {"id":"signal-meter","title":"How the Meshtastic Signal Meter Works","section":"user","locale":"is-rIS","resourcePath":"docs/is-rIS/user/signal-meter.html","navOrder":15,"keywords":["how", "the", "meshtastic", "signal", "meter", "works", "two", "metrics", "loudness", "clarity", "magic", "lora", "hearing", "below", "noise", "floor", "calculates", "quality", "what", "this", "means", "for", "you", "where", "information", "appears", "related", "topics"],"aliases":["signal", "signal-meter", "snr", "rssi"],"charCount":5900}, @@ -429,7 +429,7 @@ {"id":"widget","title":"Home Screen Widget","section":"user","locale":"is-rIS","resourcePath":"docs/is-rIS/user/widget.html","navOrder":20,"keywords":["home", "screen", "widget", "what", "shows", "adding", "the", "related", "topics"],"aliases":["widget", "home-screen-widget", "local-stats-widget"],"charCount":1856}, {"id":"android-auto","title":"Android Auto","section":"user","locale":"it-rIT","resourcePath":"docs/it-rIT/user/android-auto.html","navOrder":18,"keywords":["android", "auto", "panoramica", "messaggi", "nodi", "status", "related", "topics"],"aliases":["android-auto", "car", "head-unit", "auto"],"charCount":2939}, {"id":"app-functions","title":"App Functions","section":"user","locale":"it-rIT","resourcePath":"docs/it-rIT/user/app-functions.html","navOrder":19,"keywords":["app", "functions", "enabling", "write", "read", "privacy", "related", "topics"],"aliases":["app-functions", "system-ai", "gemini", "assistant"],"charCount":3516}, - {"id":"connections","title":"Connessioni","section":"user","locale":"it-rIT","resourcePath":"docs/it-rIT/user/connections.html","navOrder":2,"keywords":["connessioni", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "configurazione", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "connections", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":5005}, + {"id":"connections","title":"Connessioni","section":"user","locale":"it-rIT","resourcePath":"docs/it-rIT/user/connections.html","navOrder":2,"keywords":["connessioni", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "configurazione", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "connections", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":6494}, {"id":"debug-logs","title":"Debug Logs","section":"user","locale":"it-rIT","resourcePath":"docs/it-rIT/user/debug-logs.html","navOrder":22,"keywords":["debug", "logs", "the", "two", "tabs", "viewing", "app", "exporting", "desktop", "related", "topics"],"aliases":["debug-logs", "logcat", "app-logs", "bug-report"],"charCount":3003}, {"id":"desktop","title":"Desktop App","section":"user","locale":"it-rIT","resourcePath":"docs/it-rIT/user/desktop.html","navOrder":14,"keywords":["desktop", "app", "installazione", "linux", "macos", "windows", "connecting", "your", "radio", "usb", "serial", "primary", "tcp", "bluetooth", "ble", "feature", "parity", "differences", "keyboard", "shortcuts", "window", "system", "tray", "notification", "preferences", "built", "documentation", "browser", "building", "from"],"aliases":["desktop", "linux", "macos", "windows", "jvm"],"charCount":6183}, {"id":"discovery","title":"Discovery","section":"user","locale":"it-rIT","resourcePath":"docs/it-rIT/user/discovery.html","navOrder":12,"keywords":["discovery", "local", "mesh", "scanner", "setting", "scan", "live", "progress", "reading", "the", "results", "beacon", "manual", "exploration", "traceroute", "running", "troubleshooting", "with", "informazioni", "vicinato", "enabling", "neighbor", "info", "viewing", "data", "node", "list", "tool", "finding", "new"],"aliases":["mesh-discovery", "local-discovery", "network-scan", "traceroute", "neighbor-info"],"charCount":12532}, @@ -440,7 +440,7 @@ {"id":"mqtt","title":"MQTT","section":"user","locale":"it-rIT","resourcePath":"docs/it-rIT/user/mqtt.html","navOrder":11,"keywords":["mqtt", "panoramica", "come", "funziona", "configurazione", "enabling", "proxy", "this", "phone", "default", "meshtastic", "broker", "private", "map", "reporting", "uplink", "downlink", "message", "formats", "encryption", "privacy", "buone", "pratiche", "risoluzione", "problemi", "not", "connecting", "messages", "bridging", "related"],"aliases":["mqtt", "internet-bridge", "broker"],"charCount":7863}, {"id":"node-metrics","title":"Node Metrics","section":"user","locale":"it-rIT","resourcePath":"docs/it-rIT/user/node-metrics.html","navOrder":5,"keywords":["node", "metrics", "metriche", "dispositivo", "ambientali", "air", "quality", "signal", "reference", "alimentazione", "traceroute", "reading", "results", "registro", "posizione", "informazioni", "vicinato", "viewing", "related", "topics"],"aliases":["metrics", "telemetry", "device-metrics", "signal"],"charCount":9912}, {"id":"nodes","title":"Nodi","section":"user","locale":"it-rIT","resourcePath":"docs/it-rIT/user/nodes.html","navOrder":4,"keywords":["nodi", "node", "list", "status", "indicators", "roles", "choosing", "role", "encryption", "quick", "actions", "filtering", "sorting", "text", "search", "filter", "toggles", "sort", "options", "nodes", "per", "hop", "detail", "device", "links", "want", "one", "related", "topics"],"aliases":["node-list", "mesh-nodes", "peers", "hop-histogram"],"charCount":11326}, - {"id":"onboarding","title":"Come iniziare","section":"user","locale":"it-rIT","resourcePath":"docs/it-rIT/user/onboarding.html","navOrder":1,"keywords":["come", "iniziare", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":4020}, + {"id":"onboarding","title":"Come iniziare","section":"user","locale":"it-rIT","resourcePath":"docs/it-rIT/user/onboarding.html","navOrder":1,"keywords":["come", "iniziare", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "reviewing", "later", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":6881}, {"id":"settings-module-admin","title":"Settings — Modules & Admin","section":"user","locale":"it-rIT","resourcePath":"docs/it-rIT/user/settings-module-admin.html","navOrder":8,"keywords":["settings", "modules", "admin", "configurazione", "modulo", "mqtt", "module", "serial", "external", "notification", "store", "forward", "range", "test", "telemetry", "canned", "message", "audio", "remote", "hardware", "neighbor", "info", "ambient", "lighting", "detection", "sensor", "paxcounter", "tak", "amministrazione", "remota"],"aliases":["modules", "module-config", "administration"],"charCount":15982}, {"id":"settings-radio-user","title":"Settings — Radio & User","section":"user","locale":"it-rIT","resourcePath":"docs/it-rIT/user/settings-radio-user.html","navOrder":7,"keywords":["settings", "radio", "user", "impostazioni", "utente", "profile", "applying", "changes", "configurazione", "dispositivo", "lora", "modem", "presets", "schermo", "posizione", "alimentazione", "della", "rete", "bluetooth", "sicurezza", "related", "topics"],"aliases":["impostazioni", "radio-config", "user-config", "lora"],"charCount":15157}, {"id":"signal-meter","title":"How the Meshtastic Signal Meter Works","section":"user","locale":"it-rIT","resourcePath":"docs/it-rIT/user/signal-meter.html","navOrder":15,"keywords":["how", "the", "meshtastic", "signal", "meter", "works", "two", "metrics", "loudness", "clarity", "magic", "lora", "hearing", "below", "noise", "floor", "calculates", "quality", "what", "this", "means", "for", "you", "where", "information", "appears", "related", "topics"],"aliases":["signal", "signal-meter", "snr", "rssi"],"charCount":5918}, @@ -451,7 +451,7 @@ {"id":"widget","title":"Home Screen Widget","section":"user","locale":"it-rIT","resourcePath":"docs/it-rIT/user/widget.html","navOrder":20,"keywords":["home", "screen", "widget", "what", "shows", "adding", "the", "related", "topics"],"aliases":["widget", "home-screen-widget", "local-stats-widget"],"charCount":1856}, {"id":"android-auto","title":"Android Auto","section":"user","locale":"iw-rIL","resourcePath":"docs/iw-rIL/user/android-auto.html","navOrder":18,"keywords":["android", "auto", "overview", "nodes", "status", "related", "topics"],"aliases":["android-auto", "car", "head-unit", "auto"],"charCount":2936}, {"id":"app-functions","title":"App Functions","section":"user","locale":"iw-rIL","resourcePath":"docs/iw-rIL/user/app-functions.html","navOrder":19,"keywords":["app", "functions", "enabling", "write", "read", "privacy", "related", "topics"],"aliases":["app-functions", "system-ai", "gemini", "assistant"],"charCount":3516}, - {"id":"connections","title":"Connections","section":"user","locale":"iw-rIL","resourcePath":"docs/iw-rIL/user/connections.html","navOrder":2,"keywords":["connections", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":4954}, + {"id":"connections","title":"Connections","section":"user","locale":"iw-rIL","resourcePath":"docs/iw-rIL/user/connections.html","navOrder":2,"keywords":["connections", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":6443}, {"id":"debug-logs","title":"Debug Logs","section":"user","locale":"iw-rIL","resourcePath":"docs/iw-rIL/user/debug-logs.html","navOrder":22,"keywords":["debug", "logs", "the", "two", "tabs", "viewing", "app", "exporting", "desktop", "related", "topics"],"aliases":["debug-logs", "logcat", "app-logs", "bug-report"],"charCount":3003}, {"id":"desktop","title":"Desktop App","section":"user","locale":"iw-rIL","resourcePath":"docs/iw-rIL/user/desktop.html","navOrder":14,"keywords":["desktop", "app", "installation", "linux", "macos", "windows", "connecting", "your", "radio", "usb", "serial", "primary", "tcp", "bluetooth", "ble", "feature", "parity", "differences", "keyboard", "shortcuts", "window", "system", "tray", "notification", "preferences", "built", "documentation", "browser", "building", "from"],"aliases":["desktop", "linux", "macos", "windows", "jvm"],"charCount":6180}, {"id":"discovery","title":"Discovery","section":"user","locale":"iw-rIL","resourcePath":"docs/iw-rIL/user/discovery.html","navOrder":12,"keywords":["discovery", "local", "mesh", "scanner", "setting", "scan", "live", "progress", "reading", "the", "results", "beacon", "manual", "exploration", "running", "traceroute", "troubleshooting", "with", "neighbor", "info", "enabling", "viewing", "data", "node", "list", "tool", "finding", "new", "nodes", "assessing"],"aliases":["mesh-discovery", "local-discovery", "network-scan", "traceroute", "neighbor-info"],"charCount":12525}, @@ -462,7 +462,7 @@ {"id":"mqtt","title":"MQTT","section":"user","locale":"iw-rIL","resourcePath":"docs/iw-rIL/user/mqtt.html","navOrder":11,"keywords":["mqtt", "overview", "how", "works", "configuration", "enabling", "proxy", "this", "phone", "default", "meshtastic", "broker", "private", "map", "reporting", "uplink", "downlink", "message", "formats", "encryption", "privacy", "best", "practices", "troubleshooting", "not", "connecting", "messages", "bridging", "related", "topics"],"aliases":["mqtt", "internet-bridge", "broker"],"charCount":7844}, {"id":"node-metrics","title":"Node Metrics","section":"user","locale":"iw-rIL","resourcePath":"docs/iw-rIL/user/node-metrics.html","navOrder":5,"keywords":["node", "metrics", "device", "environment", "air", "quality", "signal", "reference", "power", "reading", "traceroute", "results", "position", "log", "neighbor", "info", "viewing", "related", "topics"],"aliases":["metrics", "telemetry", "device-metrics", "signal"],"charCount":9868}, {"id":"nodes","title":"Nodes","section":"user","locale":"iw-rIL","resourcePath":"docs/iw-rIL/user/nodes.html","navOrder":4,"keywords":["nodes", "node", "list", "status", "indicators", "roles", "choosing", "role", "encryption", "quick", "actions", "filtering", "sorting", "text", "search", "filter", "toggles", "sort", "options", "per", "hop", "detail", "device", "links", "want", "one", "related", "topics"],"aliases":["node-list", "mesh-nodes", "peers", "hop-histogram"],"charCount":11264}, - {"id":"onboarding","title":"Getting Started","section":"user","locale":"iw-rIL","resourcePath":"docs/iw-rIL/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":4024}, + {"id":"onboarding","title":"Getting Started","section":"user","locale":"iw-rIL","resourcePath":"docs/iw-rIL/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "reviewing", "later", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":6885}, {"id":"settings-module-admin","title":"Settings — Modules & Admin","section":"user","locale":"iw-rIL","resourcePath":"docs/iw-rIL/user/settings-module-admin.html","navOrder":8,"keywords":["settings", "modules", "admin", "module", "configuration", "mqtt", "serial", "external", "notification", "store", "forward", "range", "test", "telemetry", "canned", "message", "audio", "remote", "hardware", "neighbor", "info", "ambient", "lighting", "detection", "sensor", "paxcounter", "tak", "administration", "clean", "node"],"aliases":["modules", "module-config", "administration"],"charCount":15876}, {"id":"settings-radio-user","title":"Settings — Radio & User","section":"user","locale":"iw-rIL","resourcePath":"docs/iw-rIL/user/settings-radio-user.html","navOrder":7,"keywords":["settings", "radio", "user", "profile", "applying", "changes", "configuration", "device", "config", "lora", "modem", "presets", "display", "position", "power", "network", "bluetooth", "security", "related", "topics"],"aliases":["הגדרות", "radio-config", "user-config", "lora"],"charCount":14944}, {"id":"signal-meter","title":"How the Meshtastic Signal Meter Works","section":"user","locale":"iw-rIL","resourcePath":"docs/iw-rIL/user/signal-meter.html","navOrder":15,"keywords":["how", "the", "meshtastic", "signal", "meter", "works", "two", "metrics", "loudness", "clarity", "magic", "lora", "hearing", "below", "noise", "floor", "calculates", "quality", "what", "this", "means", "for", "you", "where", "information", "appears", "related", "topics"],"aliases":["signal", "signal-meter", "snr", "rssi"],"charCount":5900}, @@ -473,7 +473,7 @@ {"id":"widget","title":"Home Screen Widget","section":"user","locale":"iw-rIL","resourcePath":"docs/iw-rIL/user/widget.html","navOrder":20,"keywords":["home", "screen", "widget", "what", "shows", "adding", "the", "related", "topics"],"aliases":["widget", "home-screen-widget", "local-stats-widget"],"charCount":1856}, {"id":"android-auto","title":"Android Auto","section":"user","locale":"ja-rJP","resourcePath":"docs/ja-rJP/user/android-auto.html","navOrder":18,"keywords":["android", "auto"],"aliases":["android-auto", "car", "head-unit", "auto"],"charCount":1800}, {"id":"app-functions","title":"アプリ機能","section":"user","locale":"ja-rJP","resourcePath":"docs/ja-rJP/user/app-functions.html","navOrder":19,"keywords":[],"aliases":["app-functions", "system-ai", "gemini", "assistant"],"charCount":2145}, - {"id":"connections","title":"コネクション","section":"user","locale":"ja-rJP","resourcePath":"docs/ja-rJP/user/connections.html","navOrder":2,"keywords":["bluetooth", "ble", "usb", "tcp"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":3207}, + {"id":"connections","title":"コネクション","section":"user","locale":"ja-rJP","resourcePath":"docs/ja-rJP/user/connections.html","navOrder":2,"keywords":["bluetooth", "ble", "usb", "tcp"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":4770}, {"id":"debug-logs","title":"デバッグログ","section":"user","locale":"ja-rJP","resourcePath":"docs/ja-rJP/user/debug-logs.html","navOrder":22,"keywords":[],"aliases":["debug-logs", "logcat", "app-logs", "bug-report"],"charCount":1847}, {"id":"desktop","title":"デスクトップアプリ","section":"user","locale":"ja-rJP","resourcePath":"docs/ja-rJP/user/desktop.html","navOrder":14,"keywords":["linux", "macos", "windows", "usb", "tcp", "bluetooth", "ble"],"aliases":["desktop", "linux", "macos", "windows", "jvm"],"charCount":4222}, {"id":"discovery","title":"探索","section":"user","locale":"ja-rJP","resourcePath":"docs/ja-rJP/user/discovery.html","navOrder":12,"keywords":[],"aliases":["mesh-discovery", "local-discovery", "network-scan", "traceroute", "neighbor-info"],"charCount":7061}, @@ -484,7 +484,7 @@ {"id":"mqtt","title":"MQTT","section":"user","locale":"ja-rJP","resourcePath":"docs/ja-rJP/user/mqtt.html","navOrder":11,"keywords":["mqtt", "meshtastic"],"aliases":["mqtt", "internet-bridge", "broker"],"charCount":5346}, {"id":"node-metrics","title":"ノードメトリクス","section":"user","locale":"ja-rJP","resourcePath":"docs/ja-rJP/user/node-metrics.html","navOrder":5,"keywords":[],"aliases":["metrics", "telemetry", "device-metrics", "signal"],"charCount":6060}, {"id":"nodes","title":"ノード","section":"user","locale":"ja-rJP","resourcePath":"docs/ja-rJP/user/nodes.html","navOrder":4,"keywords":[],"aliases":["node-list", "mesh-nodes", "peers", "hop-histogram"],"charCount":6904}, - {"id":"onboarding","title":"はじめに","section":"user","locale":"ja-rJP","resourcePath":"docs/ja-rJP/user/onboarding.html","navOrder":1,"keywords":["bluetooth"],"aliases":["初回起動", "セットアップ", "概要"],"charCount":2357}, + {"id":"onboarding","title":"はじめに","section":"user","locale":"ja-rJP","resourcePath":"docs/ja-rJP/user/onboarding.html","navOrder":1,"keywords":["bluetooth", "reviewing", "permissions", "later"],"aliases":["初回起動", "セットアップ", "概要"],"charCount":5481}, {"id":"settings-module-admin","title":"設定:モジュールと管理","section":"user","locale":"ja-rJP","resourcePath":"docs/ja-rJP/user/settings-module-admin.html","navOrder":8,"keywords":["mqtt", "store", "forward", "paxcounter", "tak"],"aliases":["modules", "module-config", "administration"],"charCount":8880}, {"id":"settings-radio-user","title":"設定:無線機とユーザー","section":"user","locale":"ja-rJP","resourcePath":"docs/ja-rJP/user/settings-radio-user.html","navOrder":7,"keywords":["lora", "bluetooth"],"aliases":["設定", "radio-config", "user-config", "lora"],"charCount":9009}, {"id":"signal-meter","title":"Meshtastic の信号メーターの仕組み","section":"user","locale":"ja-rJP","resourcePath":"docs/ja-rJP/user/signal-meter.html","navOrder":15,"keywords":["meshtastic", "lora"],"aliases":["signal", "signal-meter", "snr", "rssi"],"charCount":3335}, @@ -495,7 +495,7 @@ {"id":"widget","title":"ホーム画面ウィジェット","section":"user","locale":"ja-rJP","resourcePath":"docs/ja-rJP/user/widget.html","navOrder":20,"keywords":[],"aliases":["widget", "home-screen-widget", "local-stats-widget"],"charCount":1180}, {"id":"android-auto","title":"Android Auto","section":"user","locale":"ko-rKR","resourcePath":"docs/ko-rKR/user/android-auto.html","navOrder":18,"keywords":["android", "auto", "overview", "status", "related", "topics"],"aliases":["android-auto", "car", "head-unit", "auto"],"charCount":2932}, {"id":"app-functions","title":"App Functions","section":"user","locale":"ko-rKR","resourcePath":"docs/ko-rKR/user/app-functions.html","navOrder":19,"keywords":["app", "functions", "enabling", "write", "read", "privacy", "related", "topics"],"aliases":["app-functions", "system-ai", "gemini", "assistant"],"charCount":3516}, - {"id":"connections","title":"Connections","section":"user","locale":"ko-rKR","resourcePath":"docs/ko-rKR/user/connections.html","navOrder":2,"keywords":["connections", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":4954}, + {"id":"connections","title":"Connections","section":"user","locale":"ko-rKR","resourcePath":"docs/ko-rKR/user/connections.html","navOrder":2,"keywords":["connections", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":6443}, {"id":"debug-logs","title":"Debug Logs","section":"user","locale":"ko-rKR","resourcePath":"docs/ko-rKR/user/debug-logs.html","navOrder":22,"keywords":["debug", "logs", "the", "two", "tabs", "viewing", "app", "exporting", "desktop", "related", "topics"],"aliases":["debug-logs", "logcat", "app-logs", "bug-report"],"charCount":3003}, {"id":"desktop","title":"Desktop App","section":"user","locale":"ko-rKR","resourcePath":"docs/ko-rKR/user/desktop.html","navOrder":14,"keywords":["desktop", "app", "installation", "linux", "macos", "windows", "connecting", "your", "radio", "usb", "serial", "primary", "tcp", "bluetooth", "ble", "feature", "parity", "differences", "keyboard", "shortcuts", "window", "system", "tray", "notification", "preferences", "built", "documentation", "browser", "building", "from"],"aliases":["desktop", "linux", "macos", "windows", "jvm"],"charCount":6180}, {"id":"discovery","title":"Discovery","section":"user","locale":"ko-rKR","resourcePath":"docs/ko-rKR/user/discovery.html","navOrder":12,"keywords":["discovery", "local", "mesh", "scanner", "setting", "scan", "live", "progress", "reading", "the", "results", "beacon", "manual", "exploration", "running", "traceroute", "troubleshooting", "with", "enabling", "neighbor", "info", "viewing", "data", "node", "list", "tool", "finding", "new", "nodes", "assessing"],"aliases":["mesh-discovery", "local-discovery", "network-scan", "traceroute", "neighbor-info"],"charCount":12511}, @@ -506,7 +506,7 @@ {"id":"mqtt","title":"MQTT","section":"user","locale":"ko-rKR","resourcePath":"docs/ko-rKR/user/mqtt.html","navOrder":11,"keywords":["mqtt", "overview", "how", "works", "enabling", "proxy", "this", "phone", "default", "meshtastic", "broker", "private", "map", "reporting", "uplink", "downlink", "message", "formats", "encryption", "privacy", "best", "practices", "troubleshooting", "not", "connecting", "messages", "bridging", "related", "topics"],"aliases":["mqtt", "internet-bridge", "broker"],"charCount":7833}, {"id":"node-metrics","title":"Node Metrics","section":"user","locale":"ko-rKR","resourcePath":"docs/ko-rKR/user/node-metrics.html","navOrder":5,"keywords":["node", "metrics", "device", "environment", "air", "quality", "signal", "reference", "power", "reading", "traceroute", "results", "viewing", "related", "topics"],"aliases":["metrics", "telemetry", "device-metrics", "signal"],"charCount":9805}, {"id":"nodes","title":"노드","section":"user","locale":"ko-rKR","resourcePath":"docs/ko-rKR/user/nodes.html","navOrder":4,"keywords":["node", "list", "status", "indicators", "roles", "choosing", "role", "encryption", "quick", "actions", "filtering", "sorting", "text", "search", "filter", "toggles", "sort", "options", "nodes", "per", "hop", "detail", "device", "links", "want", "one", "related", "topics"],"aliases":["node-list", "mesh-nodes", "peers", "hop-histogram"],"charCount":11258}, - {"id":"onboarding","title":"Getting Started","section":"user","locale":"ko-rKR","resourcePath":"docs/ko-rKR/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":4024}, + {"id":"onboarding","title":"Getting Started","section":"user","locale":"ko-rKR","resourcePath":"docs/ko-rKR/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "reviewing", "later", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":6885}, {"id":"settings-module-admin","title":"Settings — Modules & Admin","section":"user","locale":"ko-rKR","resourcePath":"docs/ko-rKR/user/settings-module-admin.html","navOrder":8,"keywords":["settings", "modules", "admin", "module", "configuration", "mqtt", "serial", "external", "notification", "store", "forward", "range", "test", "telemetry", "canned", "message", "audio", "remote", "hardware", "neighbor", "info", "ambient", "lighting", "detection", "sensor", "paxcounter", "tak", "clean", "node", "database"],"aliases":["modules", "module-config", "administration"],"charCount":15837}, {"id":"settings-radio-user","title":"Settings — Radio & User","section":"user","locale":"ko-rKR","resourcePath":"docs/ko-rKR/user/settings-radio-user.html","navOrder":7,"keywords":["settings", "radio", "user", "profile", "applying", "changes", "lora", "modem", "presets", "related", "topics"],"aliases":["설정", "radio-config", "user-config", "lora"],"charCount":14865}, {"id":"signal-meter","title":"How the Meshtastic Signal Meter Works","section":"user","locale":"ko-rKR","resourcePath":"docs/ko-rKR/user/signal-meter.html","navOrder":15,"keywords":["how", "the", "meshtastic", "signal", "meter", "works", "two", "metrics", "loudness", "clarity", "magic", "lora", "hearing", "below", "noise", "floor", "calculates", "quality", "what", "this", "means", "for", "you", "where", "information", "appears", "related", "topics"],"aliases":["signal", "signal-meter", "snr", "rssi"],"charCount":5900}, @@ -517,7 +517,7 @@ {"id":"widget","title":"Home Screen Widget","section":"user","locale":"ko-rKR","resourcePath":"docs/ko-rKR/user/widget.html","navOrder":20,"keywords":["home", "screen", "widget", "what", "shows", "adding", "the", "related", "topics"],"aliases":["widget", "home-screen-widget", "local-stats-widget"],"charCount":1856}, {"id":"android-auto","title":"Android Auto","section":"user","locale":"lt-rLT","resourcePath":"docs/lt-rLT/user/android-auto.html","navOrder":18,"keywords":["android", "auto", "overview", "messages", "nodes", "status", "related", "topics"],"aliases":["android-auto", "car", "head-unit", "auto"],"charCount":2938}, {"id":"app-functions","title":"App Functions","section":"user","locale":"lt-rLT","resourcePath":"docs/lt-rLT/user/app-functions.html","navOrder":19,"keywords":["app", "functions", "enabling", "write", "read", "privacy", "related", "topics"],"aliases":["app-functions", "system-ai", "gemini", "assistant"],"charCount":3516}, - {"id":"connections","title":"Connections","section":"user","locale":"lt-rLT","resourcePath":"docs/lt-rLT/user/connections.html","navOrder":2,"keywords":["connections", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":4954}, + {"id":"connections","title":"Connections","section":"user","locale":"lt-rLT","resourcePath":"docs/lt-rLT/user/connections.html","navOrder":2,"keywords":["connections", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":6443}, {"id":"debug-logs","title":"Debug Logs","section":"user","locale":"lt-rLT","resourcePath":"docs/lt-rLT/user/debug-logs.html","navOrder":22,"keywords":["debug", "logs", "the", "two", "tabs", "viewing", "app", "exporting", "desktop", "related", "topics"],"aliases":["debug-logs", "logcat", "app-logs", "bug-report"],"charCount":3003}, {"id":"desktop","title":"Desktop App","section":"user","locale":"lt-rLT","resourcePath":"docs/lt-rLT/user/desktop.html","navOrder":14,"keywords":["desktop", "app", "installation", "linux", "macos", "windows", "connecting", "your", "radio", "usb", "serial", "primary", "tcp", "bluetooth", "ble", "feature", "parity", "differences", "keyboard", "shortcuts", "window", "system", "tray", "notification", "preferences", "built", "documentation", "browser", "building", "from"],"aliases":["desktop", "linux", "macos", "windows", "jvm"],"charCount":6180}, {"id":"discovery","title":"Discovery","section":"user","locale":"lt-rLT","resourcePath":"docs/lt-rLT/user/discovery.html","navOrder":12,"keywords":["discovery", "local", "mesh", "scanner", "setting", "scan", "live", "progress", "reading", "the", "results", "beacon", "manual", "exploration", "inut", "kelias", "running", "traceroute", "troubleshooting", "with", "neighbor", "info", "enabling", "viewing", "data", "node", "list", "tool", "finding", "new"],"aliases":["mesh-discovery", "local-discovery", "network-scan", "traceroute", "neighbor-info"],"charCount":12528}, @@ -528,7 +528,7 @@ {"id":"mqtt","title":"MQTT","section":"user","locale":"lt-rLT","resourcePath":"docs/lt-rLT/user/mqtt.html","navOrder":11,"keywords":["mqtt", "overview", "how", "works", "configuration", "enabling", "proxy", "this", "phone", "default", "meshtastic", "broker", "private", "map", "reporting", "uplink", "downlink", "message", "formats", "encryption", "privacy", "best", "practices", "troubleshooting", "not", "connecting", "messages", "bridging", "related", "topics"],"aliases":["mqtt", "internet-bridge", "broker"],"charCount":7844}, {"id":"node-metrics","title":"Node Metrics","section":"user","locale":"lt-rLT","resourcePath":"docs/lt-rLT/user/node-metrics.html","navOrder":5,"keywords":["node", "metrics", "device", "environment", "air", "quality", "signal", "reference", "power", "inut", "kelias", "reading", "traceroute", "results", "pozicijos", "duomen", "urnalas", "neighbor", "info", "viewing", "related", "topics"],"aliases":["metrics", "telemetry", "device-metrics", "signal"],"charCount":9904}, {"id":"nodes","title":"Nodes","section":"user","locale":"lt-rLT","resourcePath":"docs/lt-rLT/user/nodes.html","navOrder":4,"keywords":["nodes", "node", "list", "status", "indicators", "roles", "choosing", "role", "encryption", "quick", "actions", "filtering", "sorting", "text", "search", "filter", "toggles", "sort", "options", "per", "hop", "detail", "device", "links", "want", "one", "related", "topics"],"aliases":["node-list", "mesh-nodes", "peers", "hop-histogram"],"charCount":11299}, - {"id":"onboarding","title":"Getting Started","section":"user","locale":"lt-rLT","resourcePath":"docs/lt-rLT/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":4024}, + {"id":"onboarding","title":"Getting Started","section":"user","locale":"lt-rLT","resourcePath":"docs/lt-rLT/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "reviewing", "later", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":6885}, {"id":"settings-module-admin","title":"Settings — Modules & Admin","section":"user","locale":"lt-rLT","resourcePath":"docs/lt-rLT/user/settings-module-admin.html","navOrder":8,"keywords":["settings", "modules", "admin", "module", "configuration", "mqtt", "serial", "external", "notification", "store", "forward", "range", "test", "telemetry", "canned", "message", "audio", "remote", "hardware", "neighbor", "info", "ambient", "lighting", "detection", "sensor", "paxcounter", "tak", "administravimas", "nuotolinis", "clean"],"aliases":["modules", "module-config", "administration"],"charCount":15888}, {"id":"settings-radio-user","title":"Settings — Radio & User","section":"user","locale":"lt-rLT","resourcePath":"docs/lt-rLT/user/settings-radio-user.html","navOrder":7,"keywords":["settings", "radio", "user", "profile", "applying", "changes", "configuration", "device", "config", "lora", "modem", "presets", "display", "position", "power", "network", "bluetooth", "security", "related", "topics"],"aliases":["settings", "radio-config", "user-config", "lora"],"charCount":14946}, {"id":"signal-meter","title":"How the Meshtastic Signal Meter Works","section":"user","locale":"lt-rLT","resourcePath":"docs/lt-rLT/user/signal-meter.html","navOrder":15,"keywords":["how", "the", "meshtastic", "signal", "meter", "works", "two", "metrics", "loudness", "clarity", "magic", "lora", "hearing", "below", "noise", "floor", "calculates", "quality", "what", "this", "means", "for", "you", "where", "information", "appears", "related", "topics"],"aliases":["signal", "signal-meter", "snr", "rssi"],"charCount":5930}, @@ -539,7 +539,7 @@ {"id":"widget","title":"Home Screen Widget","section":"user","locale":"lt-rLT","resourcePath":"docs/lt-rLT/user/widget.html","navOrder":20,"keywords":["home", "screen", "widget", "what", "shows", "adding", "the", "related", "topics"],"aliases":["widget", "home-screen-widget", "local-stats-widget"],"charCount":1856}, {"id":"android-auto","title":"Android Auto","section":"user","locale":"nl-rNL","resourcePath":"docs/nl-rNL/user/android-auto.html","navOrder":18,"keywords":["android", "auto", "overview", "berichten", "nodes", "status", "related", "topics"],"aliases":["android-auto", "car", "head-unit", "auto"],"charCount":2939}, {"id":"app-functions","title":"App Functions","section":"user","locale":"nl-rNL","resourcePath":"docs/nl-rNL/user/app-functions.html","navOrder":19,"keywords":["app", "functions", "enabling", "write", "read", "privacy", "related", "topics"],"aliases":["app-functions", "system-ai", "gemini", "assistant"],"charCount":3516}, - {"id":"connections","title":"Connections","section":"user","locale":"nl-rNL","resourcePath":"docs/nl-rNL/user/connections.html","navOrder":2,"keywords":["connections", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":4984}, + {"id":"connections","title":"Connections","section":"user","locale":"nl-rNL","resourcePath":"docs/nl-rNL/user/connections.html","navOrder":2,"keywords":["connections", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":6473}, {"id":"debug-logs","title":"Debug Logs","section":"user","locale":"nl-rNL","resourcePath":"docs/nl-rNL/user/debug-logs.html","navOrder":22,"keywords":["debug", "logs", "the", "two", "tabs", "viewing", "app", "exporting", "desktop", "related", "topics"],"aliases":["debug-logs", "logcat", "app-logs", "bug-report"],"charCount":3003}, {"id":"desktop","title":"Desktop App","section":"user","locale":"nl-rNL","resourcePath":"docs/nl-rNL/user/desktop.html","navOrder":14,"keywords":["desktop", "app", "installation", "linux", "macos", "windows", "connecting", "your", "radio", "usb", "serial", "primary", "tcp", "bluetooth", "ble", "feature", "parity", "differences", "keyboard", "shortcuts", "window", "system", "tray", "notification", "preferences", "built", "documentation", "browser", "building", "from"],"aliases":["desktop", "linux", "macos", "windows", "jvm"],"charCount":6180}, {"id":"discovery","title":"Discovery","section":"user","locale":"nl-rNL","resourcePath":"docs/nl-rNL/user/discovery.html","navOrder":12,"keywords":["discovery", "local", "mesh", "scanner", "setting", "scan", "live", "progress", "reading", "the", "results", "beacon", "manual", "exploration", "traceroute", "running", "troubleshooting", "with", "neighbor", "info", "enabling", "viewing", "data", "node", "list", "tool", "finding", "new", "nodes", "assessing"],"aliases":["mesh-discovery", "local-discovery", "network-scan", "traceroute", "neighbor-info"],"charCount":12524}, @@ -550,7 +550,7 @@ {"id":"mqtt","title":"MQTT","section":"user","locale":"nl-rNL","resourcePath":"docs/nl-rNL/user/mqtt.html","navOrder":11,"keywords":["mqtt", "overview", "how", "works", "configuration", "enabling", "proxy", "this", "phone", "default", "meshtastic", "broker", "private", "map", "reporting", "uplink", "downlink", "message", "formats", "encryption", "privacy", "best", "practices", "troubleshooting", "not", "connecting", "messages", "bridging", "related", "topics"],"aliases":["mqtt", "internet-bridge", "broker"],"charCount":7844}, {"id":"node-metrics","title":"Node Metrics","section":"user","locale":"nl-rNL","resourcePath":"docs/nl-rNL/user/node-metrics.html","navOrder":5,"keywords":["node", "metrics", "device", "environment", "air", "quality", "signal", "reference", "power", "traceroute", "reading", "results", "positie", "logboek", "neighbor", "info", "viewing", "related", "topics"],"aliases":["metrics", "telemetry", "device-metrics", "signal"],"charCount":9828}, {"id":"nodes","title":"Nodes","section":"user","locale":"nl-rNL","resourcePath":"docs/nl-rNL/user/nodes.html","navOrder":4,"keywords":["nodes", "node", "list", "status", "indicators", "roles", "choosing", "role", "encryption", "quick", "actions", "filtering", "sorting", "text", "search", "filter", "toggles", "sort", "options", "per", "hop", "detail", "device", "links", "want", "one", "related", "topics"],"aliases":["node-list", "mesh-nodes", "peers", "hop-histogram"],"charCount":11264}, - {"id":"onboarding","title":"Getting Started","section":"user","locale":"nl-rNL","resourcePath":"docs/nl-rNL/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":4024}, + {"id":"onboarding","title":"Getting Started","section":"user","locale":"nl-rNL","resourcePath":"docs/nl-rNL/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "reviewing", "later", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":6885}, {"id":"settings-module-admin","title":"Settings — Modules & Admin","section":"user","locale":"nl-rNL","resourcePath":"docs/nl-rNL/user/settings-module-admin.html","navOrder":8,"keywords":["settings", "modules", "admin", "module", "configuration", "mqtt", "serial", "external", "notification", "store", "forward", "range", "test", "telemetry", "canned", "message", "audio", "remote", "hardware", "neighbor", "info", "ambient", "lighting", "detection", "sensor", "paxcounter", "tak", "beheer", "extern", "clean"],"aliases":["modules", "module-config", "administration"],"charCount":15860}, {"id":"settings-radio-user","title":"Settings — Radio & User","section":"user","locale":"nl-rNL","resourcePath":"docs/nl-rNL/user/settings-radio-user.html","navOrder":7,"keywords":["settings", "radio", "user", "profile", "applying", "changes", "configuration", "apparaat", "configuratie", "lora", "modem", "presets", "weergave", "positie", "energie", "netwerkconfiguratie", "bluetooth", "beveiligings", "related", "topics"],"aliases":["instellingen", "radio-config", "user-config", "lora"],"charCount":15011}, {"id":"signal-meter","title":"How the Meshtastic Signal Meter Works","section":"user","locale":"nl-rNL","resourcePath":"docs/nl-rNL/user/signal-meter.html","navOrder":15,"keywords":["how", "the", "meshtastic", "signal", "meter", "works", "two", "metrics", "loudness", "clarity", "magic", "lora", "hearing", "below", "noise", "floor", "calculates", "quality", "what", "this", "means", "for", "you", "where", "information", "appears", "related", "topics"],"aliases":["signal", "signal-meter", "snr", "rssi"],"charCount":5906}, @@ -561,7 +561,7 @@ {"id":"widget","title":"Home Screen Widget","section":"user","locale":"nl-rNL","resourcePath":"docs/nl-rNL/user/widget.html","navOrder":20,"keywords":["home", "screen", "widget", "what", "shows", "adding", "the", "related", "topics"],"aliases":["widget", "home-screen-widget", "local-stats-widget"],"charCount":1856}, {"id":"android-auto","title":"Android Auto","section":"user","locale":"no-rNO","resourcePath":"docs/no-rNO/user/android-auto.html","navOrder":18,"keywords":["android", "auto", "overview", "messages", "nodes", "status", "related", "topics"],"aliases":["android-auto", "car", "head-unit", "auto"],"charCount":2938}, {"id":"app-functions","title":"App Functions","section":"user","locale":"no-rNO","resourcePath":"docs/no-rNO/user/app-functions.html","navOrder":19,"keywords":["app", "functions", "enabling", "write", "read", "privacy", "related", "topics"],"aliases":["app-functions", "system-ai", "gemini", "assistant"],"charCount":3516}, - {"id":"connections","title":"Connections","section":"user","locale":"no-rNO","resourcePath":"docs/no-rNO/user/connections.html","navOrder":2,"keywords":["connections", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":4954}, + {"id":"connections","title":"Connections","section":"user","locale":"no-rNO","resourcePath":"docs/no-rNO/user/connections.html","navOrder":2,"keywords":["connections", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":6443}, {"id":"debug-logs","title":"Debug Logs","section":"user","locale":"no-rNO","resourcePath":"docs/no-rNO/user/debug-logs.html","navOrder":22,"keywords":["debug", "logs", "the", "two", "tabs", "viewing", "app", "exporting", "desktop", "related", "topics"],"aliases":["debug-logs", "logcat", "app-logs", "bug-report"],"charCount":3003}, {"id":"desktop","title":"Desktop App","section":"user","locale":"no-rNO","resourcePath":"docs/no-rNO/user/desktop.html","navOrder":14,"keywords":["desktop", "app", "installation", "linux", "macos", "windows", "connecting", "your", "radio", "usb", "serial", "primary", "tcp", "bluetooth", "ble", "feature", "parity", "differences", "keyboard", "shortcuts", "window", "system", "tray", "notification", "preferences", "built", "documentation", "browser", "building", "from"],"aliases":["desktop", "linux", "macos", "windows", "jvm"],"charCount":6180}, {"id":"discovery","title":"Discovery","section":"user","locale":"no-rNO","resourcePath":"docs/no-rNO/user/discovery.html","navOrder":12,"keywords":["discovery", "local", "mesh", "scanner", "setting", "scan", "live", "progress", "reading", "the", "results", "beacon", "manual", "exploration", "traceroute", "running", "troubleshooting", "with", "neighbor", "info", "enabling", "viewing", "data", "node", "list", "tool", "finding", "new", "nodes", "assessing"],"aliases":["mesh-discovery", "local-discovery", "network-scan", "traceroute", "neighbor-info"],"charCount":12524}, @@ -572,7 +572,7 @@ {"id":"mqtt","title":"MQTT","section":"user","locale":"no-rNO","resourcePath":"docs/no-rNO/user/mqtt.html","navOrder":11,"keywords":["mqtt", "overview", "how", "works", "configuration", "enabling", "proxy", "this", "phone", "default", "meshtastic", "broker", "private", "map", "reporting", "uplink", "downlink", "message", "formats", "encryption", "privacy", "best", "practices", "troubleshooting", "not", "connecting", "messages", "bridging", "related", "topics"],"aliases":["mqtt", "internet-bridge", "broker"],"charCount":7844}, {"id":"node-metrics","title":"Node Metrics","section":"user","locale":"no-rNO","resourcePath":"docs/no-rNO/user/node-metrics.html","navOrder":5,"keywords":["node", "metrics", "device", "environment", "air", "quality", "signal", "reference", "power", "traceroute", "reading", "results", "posisjonslogg", "neighbor", "info", "viewing", "related", "topics"],"aliases":["metrics", "telemetry", "device-metrics", "signal"],"charCount":9864}, {"id":"nodes","title":"Nodes","section":"user","locale":"no-rNO","resourcePath":"docs/no-rNO/user/nodes.html","navOrder":4,"keywords":["nodes", "node", "list", "status", "indicators", "roles", "choosing", "role", "encryption", "quick", "actions", "filtering", "sorting", "text", "search", "filter", "toggles", "sort", "options", "per", "hop", "detail", "device", "links", "want", "one", "related", "topics"],"aliases":["node-list", "mesh-nodes", "peers", "hop-histogram"],"charCount":11264}, - {"id":"onboarding","title":"Getting Started","section":"user","locale":"no-rNO","resourcePath":"docs/no-rNO/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":4024}, + {"id":"onboarding","title":"Getting Started","section":"user","locale":"no-rNO","resourcePath":"docs/no-rNO/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "reviewing", "later", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":6885}, {"id":"settings-module-admin","title":"Settings — Modules & Admin","section":"user","locale":"no-rNO","resourcePath":"docs/no-rNO/user/settings-module-admin.html","navOrder":8,"keywords":["settings", "modules", "admin", "module", "configuration", "mqtt", "serial", "external", "notification", "store", "forward", "range", "test", "telemetry", "canned", "message", "audio", "remote", "hardware", "neighbor", "info", "ambient", "lighting", "detection", "sensor", "paxcounter", "tak", "administrasjon", "fjernadministrasjon", "clean"],"aliases":["modules", "module-config", "administration"],"charCount":15878}, {"id":"settings-radio-user","title":"Settings — Radio & User","section":"user","locale":"no-rNO","resourcePath":"docs/no-rNO/user/settings-radio-user.html","navOrder":7,"keywords":["settings", "radio", "user", "profile", "applying", "changes", "configuration", "device", "config", "lora", "modem", "presets", "display", "position", "power", "network", "bluetooth", "security", "related", "topics"],"aliases":["settings", "radio-config", "user-config", "lora"],"charCount":14946}, {"id":"signal-meter","title":"How the Meshtastic Signal Meter Works","section":"user","locale":"no-rNO","resourcePath":"docs/no-rNO/user/signal-meter.html","navOrder":15,"keywords":["how", "the", "meshtastic", "signal", "meter", "works", "two", "metrics", "loudness", "clarity", "magic", "lora", "hearing", "below", "noise", "floor", "calculates", "quality", "what", "this", "means", "for", "you", "where", "information", "appears", "related", "topics"],"aliases":["signal", "signal-meter", "snr", "rssi"],"charCount":5936}, @@ -583,7 +583,7 @@ {"id":"widget","title":"Home Screen Widget","section":"user","locale":"no-rNO","resourcePath":"docs/no-rNO/user/widget.html","navOrder":20,"keywords":["home", "screen", "widget", "what", "shows", "adding", "the", "related", "topics"],"aliases":["widget", "home-screen-widget", "local-stats-widget"],"charCount":1856}, {"id":"android-auto","title":"Android Auto","section":"user","locale":"pl-rPL","resourcePath":"docs/pl-rPL/user/android-auto.html","navOrder":18,"keywords":["android", "auto", "overview", "wiadomo", "status", "related", "topics"],"aliases":["android-auto", "car", "head-unit", "auto"],"charCount":2940}, {"id":"app-functions","title":"App Functions","section":"user","locale":"pl-rPL","resourcePath":"docs/pl-rPL/user/app-functions.html","navOrder":19,"keywords":["app", "functions", "enabling", "write", "read", "privacy", "related", "topics"],"aliases":["app-functions", "system-ai", "gemini", "assistant"],"charCount":3516}, - {"id":"connections","title":"Connections","section":"user","locale":"pl-rPL","resourcePath":"docs/pl-rPL/user/connections.html","navOrder":2,"keywords":["connections", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":4954}, + {"id":"connections","title":"Connections","section":"user","locale":"pl-rPL","resourcePath":"docs/pl-rPL/user/connections.html","navOrder":2,"keywords":["connections", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":6443}, {"id":"debug-logs","title":"Debug Logs","section":"user","locale":"pl-rPL","resourcePath":"docs/pl-rPL/user/debug-logs.html","navOrder":22,"keywords":["debug", "logs", "the", "two", "tabs", "viewing", "app", "exporting", "desktop", "related", "topics"],"aliases":["debug-logs", "logcat", "app-logs", "bug-report"],"charCount":3003}, {"id":"desktop","title":"Desktop App","section":"user","locale":"pl-rPL","resourcePath":"docs/pl-rPL/user/desktop.html","navOrder":14,"keywords":["desktop", "app", "installation", "linux", "macos", "windows", "connecting", "your", "radio", "usb", "serial", "primary", "tcp", "bluetooth", "ble", "feature", "parity", "differences", "keyboard", "shortcuts", "window", "system", "tray", "notification", "preferences", "built", "documentation", "browser", "building", "from"],"aliases":["desktop", "linux", "macos", "windows", "jvm"],"charCount":6180}, {"id":"discovery","title":"Discovery","section":"user","locale":"pl-rPL","resourcePath":"docs/pl-rPL/user/discovery.html","navOrder":12,"keywords":["discovery", "local", "mesh", "scanner", "setting", "scan", "live", "progress", "reading", "the", "results", "beacon", "manual", "exploration", "poka", "tras", "running", "traceroute", "troubleshooting", "with", "informacje", "siadze", "enabling", "neighbor", "info", "viewing", "data", "node", "list", "tool"],"aliases":["mesh-discovery", "local-discovery", "network-scan", "traceroute", "neighbor-info"],"charCount":12533}, @@ -594,7 +594,7 @@ {"id":"mqtt","title":"MQTT","section":"user","locale":"pl-rPL","resourcePath":"docs/pl-rPL/user/mqtt.html","navOrder":11,"keywords":["mqtt", "overview", "how", "works", "konfiguracja", "enabling", "proxy", "this", "phone", "default", "meshtastic", "broker", "private", "map", "reporting", "uplink", "downlink", "message", "formats", "encryption", "privacy", "best", "practices", "troubleshooting", "not", "connecting", "messages", "bridging", "related", "topics"],"aliases":["mqtt", "internet-bridge", "broker"],"charCount":7863}, {"id":"node-metrics","title":"Node Metrics","section":"user","locale":"pl-rPL","resourcePath":"docs/pl-rPL/user/node-metrics.html","navOrder":5,"keywords":["node", "metrics", "metryka", "urz", "dzenia", "metryki", "rodowiskowe", "air", "quality", "signal", "reference", "zasilania", "poka", "tras", "reading", "traceroute", "results", "historia", "pozycji", "informacje", "siadze", "viewing", "related", "topics"],"aliases":["metrics", "telemetry", "device-metrics", "signal"],"charCount":10002}, {"id":"nodes","title":"Węzły","section":"user","locale":"pl-rPL","resourcePath":"docs/pl-rPL/user/nodes.html","navOrder":4,"keywords":["node", "list", "status", "indicators", "roles", "choosing", "role", "encryption", "quick", "actions", "filtering", "sorting", "text", "search", "filter", "toggles", "sort", "options", "nodes", "per", "hop", "detail", "device", "links", "want", "one", "related", "topics"],"aliases":["node-list", "mesh-nodes", "peers", "hop-histogram"],"charCount":11347}, - {"id":"onboarding","title":"Getting Started","section":"user","locale":"pl-rPL","resourcePath":"docs/pl-rPL/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":4024}, + {"id":"onboarding","title":"Getting Started","section":"user","locale":"pl-rPL","resourcePath":"docs/pl-rPL/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "reviewing", "later", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":6885}, {"id":"settings-module-admin","title":"Settings — Modules & Admin","section":"user","locale":"pl-rPL","resourcePath":"docs/pl-rPL/user/settings-module-admin.html","navOrder":8,"keywords":["settings", "modules", "admin", "konfiguracja", "modu", "mqtt", "module", "serial", "external", "notification", "store", "forward", "range", "test", "telemetry", "canned", "message", "audio", "remote", "hardware", "neighbor", "info", "ambient", "lighting", "detection", "sensor", "paxcounter", "tak", "zarz", "dzanie"],"aliases":["modules", "module-config", "administration"],"charCount":15904}, {"id":"settings-radio-user","title":"Settings — Radio & User","section":"user","locale":"pl-rPL","resourcePath":"docs/pl-rPL/user/settings-radio-user.html","navOrder":7,"keywords":["settings", "radio", "user", "profile", "applying", "changes", "konfiguracja", "urz", "dzenia", "lora", "modem", "presets", "wietlacza", "pozycjonowania", "zarz", "dzania", "energi", "sieci", "bluetooth", "zabezpiecze", "related", "topics"],"aliases":["ustawienia", "radio-config", "user-config", "lora"],"charCount":15133}, {"id":"signal-meter","title":"How the Meshtastic Signal Meter Works","section":"user","locale":"pl-rPL","resourcePath":"docs/pl-rPL/user/signal-meter.html","navOrder":15,"keywords":["how", "the", "meshtastic", "signal", "meter", "works", "two", "metrics", "loudness", "clarity", "magic", "lora", "hearing", "below", "noise", "floor", "calculates", "quality", "what", "this", "means", "for", "you", "where", "information", "appears", "related", "topics"],"aliases":["signal", "signal-meter", "snr", "rssi"],"charCount":5948}, @@ -605,7 +605,7 @@ {"id":"widget","title":"Home Screen Widget","section":"user","locale":"pl-rPL","resourcePath":"docs/pl-rPL/user/widget.html","navOrder":20,"keywords":["home", "screen", "widget", "what", "shows", "adding", "the", "related", "topics"],"aliases":["widget", "home-screen-widget", "local-stats-widget"],"charCount":1856}, {"id":"android-auto","title":"Android Auto","section":"user","locale":"pt-rBR","resourcePath":"docs/pt-rBR/user/android-auto.html","navOrder":18,"keywords":["android", "auto", "overview", "mensagens", "status", "related", "topics"],"aliases":["android-auto", "car", "head-unit", "auto"],"charCount":2937}, {"id":"app-functions","title":"App Functions","section":"user","locale":"pt-rBR","resourcePath":"docs/pt-rBR/user/app-functions.html","navOrder":19,"keywords":["app", "functions", "enabling", "write", "read", "privacy", "related", "topics"],"aliases":["app-functions", "system-ai", "gemini", "assistant"],"charCount":3516}, - {"id":"connections","title":"Conexões","section":"user","locale":"pt-rBR","resourcePath":"docs/pt-rBR/user/connections.html","navOrder":2,"keywords":["conex", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "connections", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":4948}, + {"id":"connections","title":"Conexões","section":"user","locale":"pt-rBR","resourcePath":"docs/pt-rBR/user/connections.html","navOrder":2,"keywords":["conex", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "connections", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":6437}, {"id":"debug-logs","title":"Debug Logs","section":"user","locale":"pt-rBR","resourcePath":"docs/pt-rBR/user/debug-logs.html","navOrder":22,"keywords":["debug", "logs", "the", "two", "tabs", "viewing", "app", "exporting", "desktop", "related", "topics"],"aliases":["debug-logs", "logcat", "app-logs", "bug-report"],"charCount":3003}, {"id":"desktop","title":"Desktop App","section":"user","locale":"pt-rBR","resourcePath":"docs/pt-rBR/user/desktop.html","navOrder":14,"keywords":["desktop", "app", "installation", "linux", "macos", "windows", "connecting", "your", "radio", "usb", "serial", "primary", "tcp", "bluetooth", "ble", "feature", "parity", "differences", "keyboard", "shortcuts", "window", "system", "tray", "notification", "preferences", "built", "documentation", "browser", "building", "from"],"aliases":["desktop", "linux", "macos", "windows", "jvm"],"charCount":6180}, {"id":"discovery","title":"Discovery","section":"user","locale":"pt-rBR","resourcePath":"docs/pt-rBR/user/discovery.html","navOrder":12,"keywords":["discovery", "local", "mesh", "scanner", "setting", "scan", "live", "progress", "reading", "the", "results", "beacon", "manual", "exploration", "tra", "rota", "running", "traceroute", "troubleshooting", "with", "informa", "vizinho", "enabling", "neighbor", "info", "viewing", "data", "node", "list", "tool"],"aliases":["mesh-discovery", "local-discovery", "network-scan", "traceroute", "neighbor-info"],"charCount":12534}, @@ -616,7 +616,7 @@ {"id":"mqtt","title":"MQTT","section":"user","locale":"pt-rBR","resourcePath":"docs/pt-rBR/user/mqtt.html","navOrder":11,"keywords":["mqtt", "overview", "how", "works", "configuration", "enabling", "proxy", "this", "phone", "default", "meshtastic", "broker", "private", "map", "reporting", "uplink", "downlink", "message", "formats", "encryption", "privacy", "best", "practices", "troubleshooting", "not", "connecting", "messages", "bridging", "related", "topics"],"aliases":["mqtt", "internet-bridge", "broker"],"charCount":7844}, {"id":"node-metrics","title":"Node Metrics","section":"user","locale":"pt-rBR","resourcePath":"docs/pt-rBR/user/node-metrics.html","navOrder":5,"keywords":["node", "metrics", "device", "environment", "air", "quality", "signal", "reference", "power", "tra", "rota", "reading", "traceroute", "results", "log", "posi", "informa", "vizinho", "viewing", "related", "topics"],"aliases":["metrics", "telemetry", "device-metrics", "signal"],"charCount":9879}, {"id":"nodes","title":"Nós","section":"user","locale":"pt-rBR","resourcePath":"docs/pt-rBR/user/nodes.html","navOrder":4,"keywords":["node", "list", "status", "indicators", "roles", "choosing", "role", "encryption", "quick", "actions", "filtering", "sorting", "text", "search", "filter", "toggles", "sort", "options", "nodes", "per", "hop", "detail", "device", "links", "want", "one", "related", "topics"],"aliases":["node-list", "mesh-nodes", "peers", "hop-histogram"],"charCount":11309}, - {"id":"onboarding","title":"Getting Started","section":"user","locale":"pt-rBR","resourcePath":"docs/pt-rBR/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":4024}, + {"id":"onboarding","title":"Getting Started","section":"user","locale":"pt-rBR","resourcePath":"docs/pt-rBR/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "reviewing", "later", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":6885}, {"id":"settings-module-admin","title":"Settings — Modules & Admin","section":"user","locale":"pt-rBR","resourcePath":"docs/pt-rBR/user/settings-module-admin.html","navOrder":8,"keywords":["settings", "modules", "admin", "module", "configuration", "mqtt", "serial", "external", "notification", "store", "forward", "range", "test", "telemetry", "canned", "message", "audio", "remote", "hardware", "neighbor", "info", "ambient", "lighting", "detection", "sensor", "paxcounter", "tak", "administra", "remota", "limpar"],"aliases":["modules", "module-config", "administration"],"charCount":15890}, {"id":"settings-radio-user","title":"Settings — Radio & User","section":"user","locale":"pt-rBR","resourcePath":"docs/pt-rBR/user/settings-radio-user.html","navOrder":7,"keywords":["settings", "radio", "user", "profile", "applying", "changes", "configuration", "configura", "dispositivo", "lora", "modem", "presets", "tela", "posi", "energia", "rede", "bluetooth", "seguran", "related", "topics"],"aliases":["configurações", "radio-config", "user-config", "lora"],"charCount":15057}, {"id":"signal-meter","title":"How the Meshtastic Signal Meter Works","section":"user","locale":"pt-rBR","resourcePath":"docs/pt-rBR/user/signal-meter.html","navOrder":15,"keywords":["how", "the", "meshtastic", "signal", "meter", "works", "two", "metrics", "loudness", "clarity", "magic", "lora", "hearing", "below", "noise", "floor", "calculates", "quality", "what", "this", "means", "for", "you", "where", "information", "appears", "related", "topics"],"aliases":["signal", "signal-meter", "snr", "rssi"],"charCount":5906}, @@ -627,7 +627,7 @@ {"id":"widget","title":"Home Screen Widget","section":"user","locale":"pt-rBR","resourcePath":"docs/pt-rBR/user/widget.html","navOrder":20,"keywords":["home", "screen", "widget", "what", "shows", "adding", "the", "related", "topics"],"aliases":["widget", "home-screen-widget", "local-stats-widget"],"charCount":1856}, {"id":"android-auto","title":"Android Auto","section":"user","locale":"pt-rPT","resourcePath":"docs/pt-rPT/user/android-auto.html","navOrder":18,"keywords":["android", "auto", "overview", "mensagens", "nodes", "status", "related", "topics"],"aliases":["android-auto", "car", "head-unit", "auto"],"charCount":2939}, {"id":"app-functions","title":"App Functions","section":"user","locale":"pt-rPT","resourcePath":"docs/pt-rPT/user/app-functions.html","navOrder":19,"keywords":["app", "functions", "enabling", "write", "read", "privacy", "related", "topics"],"aliases":["app-functions", "system-ai", "gemini", "assistant"],"charCount":3516}, - {"id":"connections","title":"Ligações","section":"user","locale":"pt-rPT","resourcePath":"docs/pt-rPT/user/connections.html","navOrder":2,"keywords":["liga", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "connections", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":4948}, + {"id":"connections","title":"Ligações","section":"user","locale":"pt-rPT","resourcePath":"docs/pt-rPT/user/connections.html","navOrder":2,"keywords":["liga", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "connections", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":6437}, {"id":"debug-logs","title":"Debug Logs","section":"user","locale":"pt-rPT","resourcePath":"docs/pt-rPT/user/debug-logs.html","navOrder":22,"keywords":["debug", "logs", "the", "two", "tabs", "viewing", "app", "exporting", "desktop", "related", "topics"],"aliases":["debug-logs", "logcat", "app-logs", "bug-report"],"charCount":3003}, {"id":"desktop","title":"Desktop App","section":"user","locale":"pt-rPT","resourcePath":"docs/pt-rPT/user/desktop.html","navOrder":14,"keywords":["desktop", "app", "installation", "linux", "macos", "windows", "connecting", "your", "radio", "usb", "serial", "primary", "tcp", "bluetooth", "ble", "feature", "parity", "differences", "keyboard", "shortcuts", "window", "system", "tray", "notification", "preferences", "built", "documentation", "browser", "building", "from"],"aliases":["desktop", "linux", "macos", "windows", "jvm"],"charCount":6180}, {"id":"discovery","title":"Discovery","section":"user","locale":"pt-rPT","resourcePath":"docs/pt-rPT/user/discovery.html","navOrder":12,"keywords":["discovery", "local", "mesh", "scanner", "setting", "scan", "live", "progress", "reading", "the", "results", "beacon", "manual", "exploration", "tra", "rota", "running", "traceroute", "troubleshooting", "with", "informa", "vizinhan", "enabling", "neighbor", "info", "viewing", "data", "node", "list", "tool"],"aliases":["mesh-discovery", "local-discovery", "network-scan", "traceroute", "neighbor-info"],"charCount":12537}, @@ -638,7 +638,7 @@ {"id":"mqtt","title":"MQTT","section":"user","locale":"pt-rPT","resourcePath":"docs/pt-rPT/user/mqtt.html","navOrder":11,"keywords":["mqtt", "overview", "how", "works", "configura", "enabling", "proxy", "this", "phone", "default", "meshtastic", "broker", "private", "map", "reporting", "uplink", "downlink", "message", "formats", "encryption", "privacy", "best", "practices", "troubleshooting", "not", "connecting", "messages", "bridging", "related", "topics"],"aliases":["mqtt", "internet-bridge", "broker"],"charCount":7843}, {"id":"node-metrics","title":"Node Metrics","section":"user","locale":"pt-rPT","resourcePath":"docs/pt-rPT/user/node-metrics.html","navOrder":5,"keywords":["node", "metrics", "device", "environment", "air", "quality", "signal", "reference", "power", "tra", "rota", "reading", "traceroute", "results", "hist", "rico", "posi", "informa", "vizinhan", "viewing", "related", "topics"],"aliases":["metrics", "telemetry", "device-metrics", "signal"],"charCount":9894}, {"id":"nodes","title":"Nodes","section":"user","locale":"pt-rPT","resourcePath":"docs/pt-rPT/user/nodes.html","navOrder":4,"keywords":["nodes", "node", "list", "status", "indicators", "roles", "choosing", "role", "encryption", "quick", "actions", "filtering", "sorting", "text", "search", "filter", "toggles", "sort", "options", "per", "hop", "detail", "device", "links", "want", "one", "related", "topics"],"aliases":["node-list", "mesh-nodes", "peers", "hop-histogram"],"charCount":11436}, - {"id":"onboarding","title":"Getting Started","section":"user","locale":"pt-rPT","resourcePath":"docs/pt-rPT/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":4024}, + {"id":"onboarding","title":"Getting Started","section":"user","locale":"pt-rPT","resourcePath":"docs/pt-rPT/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "reviewing", "later", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":6885}, {"id":"settings-module-admin","title":"Settings — Modules & Admin","section":"user","locale":"pt-rPT","resourcePath":"docs/pt-rPT/user/settings-module-admin.html","navOrder":8,"keywords":["settings", "modules", "admin", "module", "configuration", "mqtt", "serial", "external", "notification", "store", "forward", "range", "test", "telemetry", "canned", "message", "audio", "remote", "hardware", "neighbor", "info", "ambient", "lighting", "detection", "sensor", "paxcounter", "tak", "administra", "remota", "clean"],"aliases":["modules", "module-config", "administration"],"charCount":15882}, {"id":"settings-radio-user","title":"Settings — Radio & User","section":"user","locale":"pt-rPT","resourcePath":"docs/pt-rPT/user/settings-radio-user.html","navOrder":7,"keywords":["settings", "radio", "user", "profile", "applying", "changes", "configura", "dispositivo", "lora", "modem", "presets", "ecr", "posi", "energia", "rede", "bluetooth", "seguran", "related", "topics"],"aliases":["definições", "radio-config", "user-config", "lora"],"charCount":15076}, {"id":"signal-meter","title":"How the Meshtastic Signal Meter Works","section":"user","locale":"pt-rPT","resourcePath":"docs/pt-rPT/user/signal-meter.html","navOrder":15,"keywords":["how", "the", "meshtastic", "signal", "meter", "works", "two", "metrics", "loudness", "clarity", "magic", "lora", "hearing", "below", "noise", "floor", "calculates", "quality", "what", "this", "means", "for", "you", "where", "information", "appears", "related", "topics"],"aliases":["signal", "signal-meter", "snr", "rssi"],"charCount":5918}, @@ -649,7 +649,7 @@ {"id":"widget","title":"Home Screen Widget","section":"user","locale":"pt-rPT","resourcePath":"docs/pt-rPT/user/widget.html","navOrder":20,"keywords":["home", "screen", "widget", "what", "shows", "adding", "the", "related", "topics"],"aliases":["widget", "home-screen-widget", "local-stats-widget"],"charCount":1856}, {"id":"android-auto","title":"Android Auto","section":"user","locale":"ro-rRO","resourcePath":"docs/ro-rRO/user/android-auto.html","navOrder":18,"keywords":["android", "auto", "overview", "mesaje", "noduri", "status", "related", "topics"],"aliases":["android-auto", "car", "head-unit", "auto"],"charCount":2937}, {"id":"app-functions","title":"App Functions","section":"user","locale":"ro-rRO","resourcePath":"docs/ro-rRO/user/app-functions.html","navOrder":19,"keywords":["app", "functions", "enabling", "write", "read", "privacy", "related", "topics"],"aliases":["app-functions", "system-ai", "gemini", "assistant"],"charCount":3516}, - {"id":"connections","title":"Connections","section":"user","locale":"ro-rRO","resourcePath":"docs/ro-rRO/user/connections.html","navOrder":2,"keywords":["connections", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":4954}, + {"id":"connections","title":"Connections","section":"user","locale":"ro-rRO","resourcePath":"docs/ro-rRO/user/connections.html","navOrder":2,"keywords":["connections", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":6443}, {"id":"debug-logs","title":"Debug Logs","section":"user","locale":"ro-rRO","resourcePath":"docs/ro-rRO/user/debug-logs.html","navOrder":22,"keywords":["debug", "logs", "the", "two", "tabs", "viewing", "app", "exporting", "desktop", "related", "topics"],"aliases":["debug-logs", "logcat", "app-logs", "bug-report"],"charCount":3003}, {"id":"desktop","title":"Desktop App","section":"user","locale":"ro-rRO","resourcePath":"docs/ro-rRO/user/desktop.html","navOrder":14,"keywords":["desktop", "app", "installation", "linux", "macos", "windows", "connecting", "your", "radio", "usb", "serial", "primary", "tcp", "bluetooth", "ble", "feature", "parity", "differences", "keyboard", "shortcuts", "window", "system", "tray", "notification", "preferences", "built", "documentation", "browser", "building", "from"],"aliases":["desktop", "linux", "macos", "windows", "jvm"],"charCount":6180}, {"id":"discovery","title":"Descoperiți","section":"user","locale":"ro-rRO","resourcePath":"docs/ro-rRO/user/discovery.html","navOrder":12,"keywords":["descoperi", "local", "mesh", "discovery", "scanner", "setting", "scan", "live", "progress", "reading", "the", "results", "beacon", "manual", "exploration", "trasare", "traseu", "running", "traceroute", "troubleshooting", "with", "informa", "vecin", "enabling", "neighbor", "info", "viewing", "data", "node", "list"],"aliases":["mesh-discovery", "local-discovery", "network-scan", "traceroute", "neighbor-info"],"charCount":12535}, @@ -660,7 +660,7 @@ {"id":"mqtt","title":"MQTT","section":"user","locale":"ro-rRO","resourcePath":"docs/ro-rRO/user/mqtt.html","navOrder":11,"keywords":["mqtt", "overview", "how", "works", "configuration", "enabling", "proxy", "this", "phone", "default", "meshtastic", "broker", "private", "map", "reporting", "uplink", "downlink", "message", "formats", "encryption", "privacy", "best", "practices", "troubleshooting", "not", "connecting", "messages", "bridging", "related", "topics"],"aliases":["mqtt", "internet-bridge", "broker"],"charCount":7874}, {"id":"node-metrics","title":"Node Metrics","section":"user","locale":"ro-rRO","resourcePath":"docs/ro-rRO/user/node-metrics.html","navOrder":5,"keywords":["node", "metrics", "valori", "dispozitiv", "indicatori", "mediu", "air", "quality", "signal", "reference", "putere", "trasare", "traseu", "reading", "traceroute", "results", "position", "log", "informa", "vecin", "viewing", "related", "topics"],"aliases":["metrics", "telemetry", "device-metrics", "signal"],"charCount":9911}, {"id":"nodes","title":"Noduri","section":"user","locale":"ro-rRO","resourcePath":"docs/ro-rRO/user/nodes.html","navOrder":4,"keywords":["noduri", "node", "list", "status", "indicators", "roles", "choosing", "role", "encryption", "quick", "actions", "filtering", "sorting", "text", "search", "filter", "toggles", "sort", "options", "nodes", "per", "hop", "detail", "device", "links", "want", "one", "related", "topics"],"aliases":["node-list", "mesh-nodes", "peers", "hop-histogram"],"charCount":11273}, - {"id":"onboarding","title":"Getting Started","section":"user","locale":"ro-rRO","resourcePath":"docs/ro-rRO/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":4024}, + {"id":"onboarding","title":"Getting Started","section":"user","locale":"ro-rRO","resourcePath":"docs/ro-rRO/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "reviewing", "later", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":6885}, {"id":"settings-module-admin","title":"Settings — Modules & Admin","section":"user","locale":"ro-rRO","resourcePath":"docs/ro-rRO/user/settings-module-admin.html","navOrder":8,"keywords":["settings", "modules", "admin", "module", "configuration", "mqtt", "serial", "external", "notification", "store", "forward", "range", "test", "telemetry", "canned", "message", "audio", "remote", "hardware", "neighbor", "info", "ambient", "lighting", "detection", "sensor", "paxcounter", "tak", "administrare", "distan", "cur"],"aliases":["modules", "module-config", "administration"],"charCount":15930}, {"id":"settings-radio-user","title":"Settings — Radio & User","section":"user","locale":"ro-rRO","resourcePath":"docs/ro-rRO/user/settings-radio-user.html","navOrder":7,"keywords":["settings", "radio", "user", "profile", "applying", "changes", "configuration", "device", "config", "lora", "modem", "presets", "display", "position", "configurare", "putere", "network", "bluetooth", "security", "related", "topics"],"aliases":["setari", "radio-config", "user-config", "lora"],"charCount":14973}, {"id":"signal-meter","title":"How the Meshtastic Signal Meter Works","section":"user","locale":"ro-rRO","resourcePath":"docs/ro-rRO/user/signal-meter.html","navOrder":15,"keywords":["how", "the", "meshtastic", "signal", "meter", "works", "two", "metrics", "loudness", "clarity", "magic", "lora", "hearing", "below", "noise", "floor", "calculates", "quality", "what", "this", "means", "for", "you", "where", "information", "appears", "related", "topics"],"aliases":["signal", "signal-meter", "snr", "rssi"],"charCount":5930}, @@ -671,7 +671,7 @@ {"id":"widget","title":"Home Screen Widget","section":"user","locale":"ro-rRO","resourcePath":"docs/ro-rRO/user/widget.html","navOrder":20,"keywords":["home", "screen", "widget", "what", "shows", "adding", "the", "related", "topics"],"aliases":["widget", "home-screen-widget", "local-stats-widget"],"charCount":1856}, {"id":"android-auto","title":"Android Auto","section":"user","locale":"ru-rRU","resourcePath":"docs/ru-rRU/user/android-auto.html","navOrder":18,"keywords":["android", "auto"],"aliases":["android-auto", "car", "head-unit", "auto"],"charCount":3258}, {"id":"app-functions","title":"Функции приложения","section":"user","locale":"ru-rRU","resourcePath":"docs/ru-rRU/user/app-functions.html","navOrder":19,"keywords":[],"aliases":["app-functions", "system-ai", "gemini", "assistant"],"charCount":3808}, - {"id":"connections","title":"Соединения","section":"user","locale":"ru-rRU","resourcePath":"docs/ru-rRU/user/connections.html","navOrder":2,"keywords":["bluetooth", "ble", "usb", "tcp"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":5577}, + {"id":"connections","title":"Соединения","section":"user","locale":"ru-rRU","resourcePath":"docs/ru-rRU/user/connections.html","navOrder":2,"keywords":["bluetooth", "ble", "usb", "tcp"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":7045}, {"id":"debug-logs","title":"Отладочные журналы","section":"user","locale":"ru-rRU","resourcePath":"docs/ru-rRU/user/debug-logs.html","navOrder":22,"keywords":["desktop"],"aliases":["debug-logs", "logcat", "app-logs", "bug-report"],"charCount":3561}, {"id":"desktop","title":"Настольное приложение","section":"user","locale":"ru-rRU","resourcePath":"docs/ru-rRU/user/desktop.html","navOrder":14,"keywords":["linux", "macos", "windows", "usb", "tcp", "bluetooth", "ble"],"aliases":["desktop", "linux", "macos", "windows", "jvm"],"charCount":7152}, {"id":"discovery","title":"Обнаружение","section":"user","locale":"ru-rRU","resourcePath":"docs/ru-rRU/user/discovery.html","navOrder":12,"keywords":[],"aliases":["mesh-discovery", "local-discovery", "network-scan", "traceroute", "neighbor-info"],"charCount":14360}, @@ -682,7 +682,7 @@ {"id":"mqtt","title":"MQTT","section":"user","locale":"ru-rRU","resourcePath":"docs/ru-rRU/user/mqtt.html","navOrder":11,"keywords":["mqtt", "meshtastic", "uplink", "downlink"],"aliases":["mqtt", "internet-bridge", "broker"],"charCount":8594}, {"id":"node-metrics","title":"Метрики ноды","section":"user","locale":"ru-rRU","resourcePath":"docs/ru-rRU/user/node-metrics.html","navOrder":5,"keywords":[],"aliases":["metrics", "telemetry", "device-metrics", "signal"],"charCount":11601}, {"id":"nodes","title":"Ноды","section":"user","locale":"ru-rRU","resourcePath":"docs/ru-rRU/user/nodes.html","navOrder":4,"keywords":[],"aliases":["node-list", "mesh-nodes", "peers", "hop-histogram"],"charCount":12561}, - {"id":"onboarding","title":"Начало работы","section":"user","locale":"ru-rRU","resourcePath":"docs/ru-rRU/user/onboarding.html","navOrder":1,"keywords":["bluetooth"],"aliases":["first-launch", "setup", "intro"],"charCount":4540}, + {"id":"onboarding","title":"Начало работы","section":"user","locale":"ru-rRU","resourcePath":"docs/ru-rRU/user/onboarding.html","navOrder":1,"keywords":["bluetooth", "reviewing", "permissions", "later"],"aliases":["first-launch", "setup", "intro"],"charCount":7273}, {"id":"settings-module-admin","title":"Настройки — Модули и администрирование","section":"user","locale":"ru-rRU","resourcePath":"docs/ru-rRU/user/settings-module-admin.html","navOrder":8,"keywords":["mqtt", "store", "forward", "paxcounter", "tak"],"aliases":["modules", "module-config", "administration"],"charCount":18614}, {"id":"settings-radio-user","title":"Настройки - Радио и пользователь","section":"user","locale":"ru-rRU","resourcePath":"docs/ru-rRU/user/settings-radio-user.html","navOrder":7,"keywords":["lora", "bluetooth"],"aliases":["настройки", "radio-config", "user-config", "lora"],"charCount":16781}, {"id":"signal-meter","title":"Как работает измеритель сигнала Meshtastic","section":"user","locale":"ru-rRU","resourcePath":"docs/ru-rRU/user/signal-meter.html","navOrder":15,"keywords":["meshtastic", "lora"],"aliases":["signal", "signal-meter", "snr", "rssi"],"charCount":6236}, @@ -693,7 +693,7 @@ {"id":"widget","title":"Виджет на главный экран","section":"user","locale":"ru-rRU","resourcePath":"docs/ru-rRU/user/widget.html","navOrder":20,"keywords":[],"aliases":["widget", "home-screen-widget", "local-stats-widget"],"charCount":2096}, {"id":"android-auto","title":"Android Auto","section":"user","locale":"sk-rSK","resourcePath":"docs/sk-rSK/user/android-auto.html","navOrder":18,"keywords":["android", "auto", "overview", "spr", "nodes", "status", "related", "topics"],"aliases":["android-auto", "car", "head-unit", "auto"],"charCount":2936}, {"id":"app-functions","title":"App Functions","section":"user","locale":"sk-rSK","resourcePath":"docs/sk-rSK/user/app-functions.html","navOrder":19,"keywords":["app", "functions", "enabling", "write", "read", "privacy", "related", "topics"],"aliases":["app-functions", "system-ai", "gemini", "assistant"],"charCount":3516}, - {"id":"connections","title":"Connections","section":"user","locale":"sk-rSK","resourcePath":"docs/sk-rSK/user/connections.html","navOrder":2,"keywords":["connections", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":5002}, + {"id":"connections","title":"Connections","section":"user","locale":"sk-rSK","resourcePath":"docs/sk-rSK/user/connections.html","navOrder":2,"keywords":["connections", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":6491}, {"id":"debug-logs","title":"Debug Logs","section":"user","locale":"sk-rSK","resourcePath":"docs/sk-rSK/user/debug-logs.html","navOrder":22,"keywords":["debug", "logs", "the", "two", "tabs", "viewing", "app", "exporting", "desktop", "related", "topics"],"aliases":["debug-logs", "logcat", "app-logs", "bug-report"],"charCount":3003}, {"id":"desktop","title":"Desktop App","section":"user","locale":"sk-rSK","resourcePath":"docs/sk-rSK/user/desktop.html","navOrder":14,"keywords":["desktop", "app", "installation", "linux", "macos", "windows", "connecting", "your", "radio", "usb", "serial", "primary", "tcp", "bluetooth", "ble", "feature", "parity", "differences", "keyboard", "shortcuts", "window", "system", "tray", "notification", "preferences", "built", "documentation", "browser", "building", "from"],"aliases":["desktop", "linux", "macos", "windows", "jvm"],"charCount":6180}, {"id":"discovery","title":"Discovery","section":"user","locale":"sk-rSK","resourcePath":"docs/sk-rSK/user/discovery.html","navOrder":12,"keywords":["discovery", "local", "mesh", "scanner", "setting", "scan", "live", "progress", "reading", "the", "results", "beacon", "manual", "exploration", "trasovanie", "running", "traceroute", "troubleshooting", "with", "inform", "cia", "susedoch", "enabling", "neighbor", "info", "viewing", "data", "node", "list", "tool"],"aliases":["mesh-discovery", "local-discovery", "network-scan", "traceroute", "neighbor-info"],"charCount":12532}, @@ -704,7 +704,7 @@ {"id":"mqtt","title":"MQTT","section":"user","locale":"sk-rSK","resourcePath":"docs/sk-rSK/user/mqtt.html","navOrder":11,"keywords":["mqtt", "overview", "how", "works", "configuration", "enabling", "proxy", "this", "phone", "default", "meshtastic", "broker", "private", "map", "reporting", "uplink", "downlink", "message", "formats", "encryption", "privacy", "best", "practices", "troubleshooting", "not", "connecting", "messages", "bridging", "related", "topics"],"aliases":["mqtt", "internet-bridge", "broker"],"charCount":7874}, {"id":"node-metrics","title":"Node Metrics","section":"user","locale":"sk-rSK","resourcePath":"docs/sk-rSK/user/node-metrics.html","navOrder":5,"keywords":["node", "metrics", "device", "environment", "air", "quality", "signal", "reference", "power", "trasovanie", "reading", "traceroute", "results", "log", "poz", "cie", "inform", "cia", "susedoch", "viewing", "related", "topics"],"aliases":["metrics", "telemetry", "device-metrics", "signal"],"charCount":9865}, {"id":"nodes","title":"Nodes","section":"user","locale":"sk-rSK","resourcePath":"docs/sk-rSK/user/nodes.html","navOrder":4,"keywords":["nodes", "node", "list", "status", "indicators", "roles", "choosing", "role", "encryption", "quick", "actions", "filtering", "sorting", "text", "search", "filter", "toggles", "sort", "options", "per", "hop", "detail", "device", "links", "want", "one", "related", "topics"],"aliases":["node-list", "mesh-nodes", "peers", "hop-histogram"],"charCount":11271}, - {"id":"onboarding","title":"Getting Started","section":"user","locale":"sk-rSK","resourcePath":"docs/sk-rSK/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":4024}, + {"id":"onboarding","title":"Getting Started","section":"user","locale":"sk-rSK","resourcePath":"docs/sk-rSK/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "reviewing", "later", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":6885}, {"id":"settings-module-admin","title":"Settings — Modules & Admin","section":"user","locale":"sk-rSK","resourcePath":"docs/sk-rSK/user/settings-module-admin.html","navOrder":8,"keywords":["settings", "modules", "admin", "module", "configuration", "mqtt", "serial", "external", "notification", "store", "forward", "range", "test", "telemetry", "canned", "message", "audio", "remote", "hardware", "neighbor", "info", "ambient", "lighting", "detection", "sensor", "paxcounter", "tak", "administr", "cia", "dia"],"aliases":["modules", "module-config", "administration"],"charCount":15911}, {"id":"settings-radio-user","title":"Settings — Radio & User","section":"user","locale":"sk-rSK","resourcePath":"docs/sk-rSK/user/settings-radio-user.html","navOrder":7,"keywords":["settings", "radio", "user", "profile", "applying", "changes", "configuration", "konfigur", "cia", "zariadenia", "lora", "modem", "presets", "displeju", "position", "config", "power", "siete", "bluetooth", "security", "related", "topics"],"aliases":["nastavenia", "radio-config", "user-config", "lora"],"charCount":14993}, {"id":"signal-meter","title":"How the Meshtastic Signal Meter Works","section":"user","locale":"sk-rSK","resourcePath":"docs/sk-rSK/user/signal-meter.html","navOrder":15,"keywords":["how", "the", "meshtastic", "signal", "meter", "works", "two", "metrics", "loudness", "clarity", "magic", "lora", "hearing", "below", "noise", "floor", "calculates", "quality", "what", "this", "means", "for", "you", "where", "information", "appears", "related", "topics"],"aliases":["signal", "signal-meter", "snr", "rssi"],"charCount":5924}, @@ -715,7 +715,7 @@ {"id":"widget","title":"Home Screen Widget","section":"user","locale":"sk-rSK","resourcePath":"docs/sk-rSK/user/widget.html","navOrder":20,"keywords":["home", "screen", "widget", "what", "shows", "adding", "the", "related", "topics"],"aliases":["widget", "home-screen-widget", "local-stats-widget"],"charCount":1856}, {"id":"android-auto","title":"Android Auto","section":"user","locale":"sl-rSI","resourcePath":"docs/sl-rSI/user/android-auto.html","navOrder":18,"keywords":["android", "auto", "overview", "messages", "nodes", "status", "related", "topics"],"aliases":["android-auto", "car", "head-unit", "auto"],"charCount":2938}, {"id":"app-functions","title":"App Functions","section":"user","locale":"sl-rSI","resourcePath":"docs/sl-rSI/user/app-functions.html","navOrder":19,"keywords":["app", "functions", "enabling", "write", "read", "privacy", "related", "topics"],"aliases":["app-functions", "system-ai", "gemini", "assistant"],"charCount":3516}, - {"id":"connections","title":"Connections","section":"user","locale":"sl-rSI","resourcePath":"docs/sl-rSI/user/connections.html","navOrder":2,"keywords":["connections", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":4954}, + {"id":"connections","title":"Connections","section":"user","locale":"sl-rSI","resourcePath":"docs/sl-rSI/user/connections.html","navOrder":2,"keywords":["connections", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":6443}, {"id":"debug-logs","title":"Debug Logs","section":"user","locale":"sl-rSI","resourcePath":"docs/sl-rSI/user/debug-logs.html","navOrder":22,"keywords":["debug", "logs", "the", "two", "tabs", "viewing", "app", "exporting", "desktop", "related", "topics"],"aliases":["debug-logs", "logcat", "app-logs", "bug-report"],"charCount":3003}, {"id":"desktop","title":"Desktop App","section":"user","locale":"sl-rSI","resourcePath":"docs/sl-rSI/user/desktop.html","navOrder":14,"keywords":["desktop", "app", "installation", "linux", "macos", "windows", "connecting", "your", "radio", "usb", "serial", "primary", "tcp", "bluetooth", "ble", "feature", "parity", "differences", "keyboard", "shortcuts", "window", "system", "tray", "notification", "preferences", "built", "documentation", "browser", "building", "from"],"aliases":["desktop", "linux", "macos", "windows", "jvm"],"charCount":6180}, {"id":"discovery","title":"Discovery","section":"user","locale":"sl-rSI","resourcePath":"docs/sl-rSI/user/discovery.html","navOrder":12,"keywords":["discovery", "local", "mesh", "scanner", "setting", "scan", "live", "progress", "reading", "the", "results", "beacon", "manual", "exploration", "pot", "running", "traceroute", "troubleshooting", "with", "neighbor", "info", "enabling", "viewing", "data", "node", "list", "tool", "finding", "new", "nodes"],"aliases":["mesh-discovery", "local-discovery", "network-scan", "traceroute", "neighbor-info"],"charCount":12517}, @@ -726,7 +726,7 @@ {"id":"mqtt","title":"MQTT","section":"user","locale":"sl-rSI","resourcePath":"docs/sl-rSI/user/mqtt.html","navOrder":11,"keywords":["mqtt", "overview", "how", "works", "configuration", "enabling", "proxy", "this", "phone", "default", "meshtastic", "broker", "private", "map", "reporting", "uplink", "downlink", "message", "formats", "encryption", "privacy", "best", "practices", "troubleshooting", "not", "connecting", "messages", "bridging", "related", "topics"],"aliases":["mqtt", "internet-bridge", "broker"],"charCount":7844}, {"id":"node-metrics","title":"Node Metrics","section":"user","locale":"sl-rSI","resourcePath":"docs/sl-rSI/user/node-metrics.html","navOrder":5,"keywords":["node", "metrics", "device", "environment", "air", "quality", "signal", "reference", "power", "pot", "reading", "traceroute", "results", "dnevnik", "lokacije", "neighbor", "info", "viewing", "related", "topics"],"aliases":["metrics", "telemetry", "device-metrics", "signal"],"charCount":9841}, {"id":"nodes","title":"Nodes","section":"user","locale":"sl-rSI","resourcePath":"docs/sl-rSI/user/nodes.html","navOrder":4,"keywords":["nodes", "node", "list", "status", "indicators", "roles", "choosing", "role", "encryption", "quick", "actions", "filtering", "sorting", "text", "search", "filter", "toggles", "sort", "options", "per", "hop", "detail", "device", "links", "want", "one", "related", "topics"],"aliases":["node-list", "mesh-nodes", "peers", "hop-histogram"],"charCount":11278}, - {"id":"onboarding","title":"Getting Started","section":"user","locale":"sl-rSI","resourcePath":"docs/sl-rSI/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":4024}, + {"id":"onboarding","title":"Getting Started","section":"user","locale":"sl-rSI","resourcePath":"docs/sl-rSI/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "reviewing", "later", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":6885}, {"id":"settings-module-admin","title":"Settings — Modules & Admin","section":"user","locale":"sl-rSI","resourcePath":"docs/sl-rSI/user/settings-module-admin.html","navOrder":8,"keywords":["settings", "modules", "admin", "module", "configuration", "mqtt", "serial", "external", "notification", "store", "forward", "range", "test", "telemetry", "canned", "message", "audio", "remote", "hardware", "neighbor", "info", "ambient", "lighting", "detection", "sensor", "paxcounter", "tak", "administracija", "daljavo", "clean"],"aliases":["modules", "module-config", "administration"],"charCount":15901}, {"id":"settings-radio-user","title":"Settings — Radio & User","section":"user","locale":"sl-rSI","resourcePath":"docs/sl-rSI/user/settings-radio-user.html","navOrder":7,"keywords":["settings", "radio", "user", "profile", "applying", "changes", "configuration", "device", "config", "lora", "modem", "presets", "display", "position", "power", "network", "bluetooth", "security", "related", "topics"],"aliases":["settings", "radio-config", "user-config", "lora"],"charCount":14946}, {"id":"signal-meter","title":"How the Meshtastic Signal Meter Works","section":"user","locale":"sl-rSI","resourcePath":"docs/sl-rSI/user/signal-meter.html","navOrder":15,"keywords":["how", "the", "meshtastic", "signal", "meter", "works", "two", "metrics", "loudness", "clarity", "magic", "lora", "hearing", "below", "noise", "floor", "calculates", "quality", "what", "this", "means", "for", "you", "where", "information", "appears", "related", "topics"],"aliases":["signal", "signal-meter", "snr", "rssi"],"charCount":5924}, @@ -737,7 +737,7 @@ {"id":"widget","title":"Home Screen Widget","section":"user","locale":"sl-rSI","resourcePath":"docs/sl-rSI/user/widget.html","navOrder":20,"keywords":["home", "screen", "widget", "what", "shows", "adding", "the", "related", "topics"],"aliases":["widget", "home-screen-widget", "local-stats-widget"],"charCount":1856}, {"id":"android-auto","title":"Android Auto","section":"user","locale":"sq-rAL","resourcePath":"docs/sq-rAL/user/android-auto.html","navOrder":18,"keywords":["android", "auto", "overview", "nodes", "status", "related", "topics"],"aliases":["android-auto", "car", "head-unit", "auto"],"charCount":2932}, {"id":"app-functions","title":"App Functions","section":"user","locale":"sq-rAL","resourcePath":"docs/sq-rAL/user/app-functions.html","navOrder":19,"keywords":["app", "functions", "enabling", "write", "read", "privacy", "related", "topics"],"aliases":["app-functions", "system-ai", "gemini", "assistant"],"charCount":3516}, - {"id":"connections","title":"Connections","section":"user","locale":"sq-rAL","resourcePath":"docs/sq-rAL/user/connections.html","navOrder":2,"keywords":["connections", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":4954}, + {"id":"connections","title":"Connections","section":"user","locale":"sq-rAL","resourcePath":"docs/sq-rAL/user/connections.html","navOrder":2,"keywords":["connections", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":6443}, {"id":"debug-logs","title":"Debug Logs","section":"user","locale":"sq-rAL","resourcePath":"docs/sq-rAL/user/debug-logs.html","navOrder":22,"keywords":["debug", "logs", "the", "two", "tabs", "viewing", "app", "exporting", "desktop", "related", "topics"],"aliases":["debug-logs", "logcat", "app-logs", "bug-report"],"charCount":3003}, {"id":"desktop","title":"Desktop App","section":"user","locale":"sq-rAL","resourcePath":"docs/sq-rAL/user/desktop.html","navOrder":14,"keywords":["desktop", "app", "installation", "linux", "macos", "windows", "connecting", "your", "radio", "usb", "serial", "primary", "tcp", "bluetooth", "ble", "feature", "parity", "differences", "keyboard", "shortcuts", "window", "system", "tray", "notification", "preferences", "built", "documentation", "browser", "building", "from"],"aliases":["desktop", "linux", "macos", "windows", "jvm"],"charCount":6180}, {"id":"discovery","title":"Discovery","section":"user","locale":"sq-rAL","resourcePath":"docs/sq-rAL/user/discovery.html","navOrder":12,"keywords":["discovery", "local", "mesh", "scanner", "setting", "scan", "live", "progress", "reading", "the", "results", "beacon", "manual", "exploration", "traceroute", "running", "troubleshooting", "with", "neighbor", "info", "enabling", "viewing", "data", "node", "list", "tool", "finding", "new", "nodes", "assessing"],"aliases":["mesh-discovery", "local-discovery", "network-scan", "traceroute", "neighbor-info"],"charCount":12524}, @@ -748,7 +748,7 @@ {"id":"mqtt","title":"MQTT","section":"user","locale":"sq-rAL","resourcePath":"docs/sq-rAL/user/mqtt.html","navOrder":11,"keywords":["mqtt", "overview", "how", "works", "configuration", "enabling", "proxy", "this", "phone", "default", "meshtastic", "broker", "private", "map", "reporting", "uplink", "downlink", "message", "formats", "encryption", "privacy", "best", "practices", "troubleshooting", "not", "connecting", "messages", "bridging", "related", "topics"],"aliases":["mqtt", "internet-bridge", "broker"],"charCount":7844}, {"id":"node-metrics","title":"Node Metrics","section":"user","locale":"sq-rAL","resourcePath":"docs/sq-rAL/user/node-metrics.html","navOrder":5,"keywords":["node", "metrics", "device", "environment", "air", "quality", "signal", "reference", "power", "traceroute", "reading", "results", "regjistri", "pozit", "neighbor", "info", "viewing", "related", "topics"],"aliases":["metrics", "telemetry", "device-metrics", "signal"],"charCount":9874}, {"id":"nodes","title":"Nodes","section":"user","locale":"sq-rAL","resourcePath":"docs/sq-rAL/user/nodes.html","navOrder":4,"keywords":["nodes", "node", "list", "status", "indicators", "roles", "choosing", "role", "encryption", "quick", "actions", "filtering", "sorting", "text", "search", "filter", "toggles", "sort", "options", "per", "hop", "detail", "device", "links", "want", "one", "related", "topics"],"aliases":["node-list", "mesh-nodes", "peers", "hop-histogram"],"charCount":11306}, - {"id":"onboarding","title":"Getting Started","section":"user","locale":"sq-rAL","resourcePath":"docs/sq-rAL/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":4024}, + {"id":"onboarding","title":"Getting Started","section":"user","locale":"sq-rAL","resourcePath":"docs/sq-rAL/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "reviewing", "later", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":6885}, {"id":"settings-module-admin","title":"Settings — Modules & Admin","section":"user","locale":"sq-rAL","resourcePath":"docs/sq-rAL/user/settings-module-admin.html","navOrder":8,"keywords":["settings", "modules", "admin", "module", "configuration", "mqtt", "serial", "external", "notification", "store", "forward", "range", "test", "telemetry", "canned", "message", "audio", "remote", "hardware", "neighbor", "info", "ambient", "lighting", "detection", "sensor", "paxcounter", "tak", "administrat", "larg", "clean"],"aliases":["modules", "module-config", "administration"],"charCount":15877}, {"id":"settings-radio-user","title":"Settings — Radio & User","section":"user","locale":"sq-rAL","resourcePath":"docs/sq-rAL/user/settings-radio-user.html","navOrder":7,"keywords":["settings", "radio", "user", "profile", "applying", "changes", "configuration", "device", "config", "lora", "modem", "presets", "display", "position", "power", "network", "bluetooth", "security", "related", "topics"],"aliases":["settings", "radio-config", "user-config", "lora"],"charCount":14946}, {"id":"signal-meter","title":"How the Meshtastic Signal Meter Works","section":"user","locale":"sq-rAL","resourcePath":"docs/sq-rAL/user/signal-meter.html","navOrder":15,"keywords":["how", "the", "meshtastic", "signal", "meter", "works", "two", "metrics", "loudness", "clarity", "magic", "lora", "hearing", "below", "noise", "floor", "calculates", "quality", "what", "this", "means", "for", "you", "where", "information", "appears", "related", "topics"],"aliases":["signal", "signal-meter", "snr", "rssi"],"charCount":5912}, @@ -759,7 +759,7 @@ {"id":"widget","title":"Home Screen Widget","section":"user","locale":"sq-rAL","resourcePath":"docs/sq-rAL/user/widget.html","navOrder":20,"keywords":["home", "screen", "widget", "what", "shows", "adding", "the", "related", "topics"],"aliases":["widget", "home-screen-widget", "local-stats-widget"],"charCount":1856}, {"id":"android-auto","title":"Android Auto","section":"user","locale":"srp","resourcePath":"docs/srp/user/android-auto.html","navOrder":18,"keywords":["android", "auto", "overview", "status", "related", "topics"],"aliases":["android-auto", "car", "head-unit", "auto"],"charCount":2938}, {"id":"app-functions","title":"App Functions","section":"user","locale":"srp","resourcePath":"docs/srp/user/app-functions.html","navOrder":19,"keywords":["app", "functions", "enabling", "write", "read", "privacy", "related", "topics"],"aliases":["app-functions", "system-ai", "gemini", "assistant"],"charCount":3516}, - {"id":"connections","title":"Connections","section":"user","locale":"srp","resourcePath":"docs/srp/user/connections.html","navOrder":2,"keywords":["connections", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":4972}, + {"id":"connections","title":"Connections","section":"user","locale":"srp","resourcePath":"docs/srp/user/connections.html","navOrder":2,"keywords":["connections", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":6461}, {"id":"debug-logs","title":"Дебаг логови","section":"user","locale":"srp","resourcePath":"docs/srp/user/debug-logs.html","navOrder":22,"keywords":["the", "two", "tabs", "viewing", "app", "logs", "exporting", "desktop", "related", "topics"],"aliases":["debug-logs", "logcat", "app-logs", "bug-report"],"charCount":3007}, {"id":"desktop","title":"Desktop App","section":"user","locale":"srp","resourcePath":"docs/srp/user/desktop.html","navOrder":14,"keywords":["desktop", "app", "installation", "linux", "macos", "windows", "connecting", "your", "radio", "usb", "serial", "primary", "tcp", "bluetooth", "ble", "feature", "parity", "differences", "keyboard", "shortcuts", "window", "system", "tray", "notification", "preferences", "built", "documentation", "browser", "building", "from"],"aliases":["desktop", "linux", "macos", "windows", "jvm"],"charCount":6180}, {"id":"discovery","title":"Discovery","section":"user","locale":"srp","resourcePath":"docs/srp/user/discovery.html","navOrder":12,"keywords":["discovery", "local", "mesh", "scanner", "setting", "scan", "live", "progress", "reading", "the", "results", "beacon", "manual", "exploration", "running", "traceroute", "troubleshooting", "with", "neighbor", "info", "enabling", "viewing", "data", "node", "list", "tool", "finding", "new", "nodes", "assessing"],"aliases":["mesh-discovery", "local-discovery", "network-scan", "traceroute", "neighbor-info"],"charCount":12526}, @@ -770,7 +770,7 @@ {"id":"mqtt","title":"MQTT","section":"user","locale":"srp","resourcePath":"docs/srp/user/mqtt.html","navOrder":11,"keywords":["mqtt", "overview", "how", "works", "configuration", "enabling", "proxy", "this", "phone", "default", "meshtastic", "broker", "private", "map", "reporting", "uplink", "downlink", "message", "formats", "encryption", "privacy", "best", "practices", "troubleshooting", "not", "connecting", "messages", "bridging", "related", "topics"],"aliases":["mqtt", "internet-bridge", "broker"],"charCount":7844}, {"id":"node-metrics","title":"Node Metrics","section":"user","locale":"srp","resourcePath":"docs/srp/user/node-metrics.html","navOrder":5,"keywords":["node", "metrics", "air", "quality", "signal", "reference", "reading", "traceroute", "results", "neighbor", "info", "viewing", "related", "topics"],"aliases":["metrics", "telemetry", "device-metrics", "signal"],"charCount":9899}, {"id":"nodes","title":"Чворови","section":"user","locale":"srp","resourcePath":"docs/srp/user/nodes.html","navOrder":4,"keywords":["node", "list", "status", "indicators", "roles", "choosing", "role", "encryption", "quick", "actions", "filtering", "sorting", "text", "search", "filter", "toggles", "sort", "options", "nodes", "per", "hop", "detail", "device", "links", "want", "one", "related", "topics"],"aliases":["node-list", "mesh-nodes", "peers", "hop-histogram"],"charCount":11296}, - {"id":"onboarding","title":"Getting Started","section":"user","locale":"srp","resourcePath":"docs/srp/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":4024}, + {"id":"onboarding","title":"Getting Started","section":"user","locale":"srp","resourcePath":"docs/srp/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "reviewing", "later", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":6885}, {"id":"settings-module-admin","title":"Settings — Modules & Admin","section":"user","locale":"srp","resourcePath":"docs/srp/user/settings-module-admin.html","navOrder":8,"keywords":["settings", "modules", "admin", "mqtt", "module", "serial", "external", "notification", "store", "forward", "range", "test", "telemetry", "canned", "message", "audio", "remote", "hardware", "neighbor", "info", "ambient", "lighting", "detection", "sensor", "paxcounter", "tak", "clean", "node", "database", "troubleshooting"],"aliases":["modules", "module-config", "administration"],"charCount":15920}, {"id":"settings-radio-user","title":"Settings — Radio & User","section":"user","locale":"srp","resourcePath":"docs/srp/user/settings-radio-user.html","navOrder":7,"keywords":["settings", "radio", "user", "profile", "applying", "changes", "configuration", "lora", "modem", "presets", "related", "topics"],"aliases":["подешавања", "radio-config", "user-config", "lora"],"charCount":15028}, {"id":"signal-meter","title":"How the Meshtastic Signal Meter Works","section":"user","locale":"srp","resourcePath":"docs/srp/user/signal-meter.html","navOrder":15,"keywords":["how", "the", "meshtastic", "signal", "meter", "works", "two", "metrics", "loudness", "clarity", "magic", "lora", "hearing", "below", "noise", "floor", "calculates", "quality", "what", "this", "means", "for", "you", "where", "information", "appears", "related", "topics"],"aliases":["signal", "signal-meter", "snr", "rssi"],"charCount":5930}, @@ -781,7 +781,7 @@ {"id":"widget","title":"Home Screen Widget","section":"user","locale":"srp","resourcePath":"docs/srp/user/widget.html","navOrder":20,"keywords":["home", "screen", "widget", "what", "shows", "adding", "the", "related", "topics"],"aliases":["widget", "home-screen-widget", "local-stats-widget"],"charCount":1856}, {"id":"android-auto","title":"Android Auto","section":"user","locale":"sv-rSE","resourcePath":"docs/sv-rSE/user/android-auto.html","navOrder":18,"keywords":["android", "auto", "overview", "meddelanden", "noder", "status", "related", "topics"],"aliases":["android-auto", "car", "head-unit", "auto"],"charCount":2944}, {"id":"app-functions","title":"App Functions","section":"user","locale":"sv-rSE","resourcePath":"docs/sv-rSE/user/app-functions.html","navOrder":19,"keywords":["app", "functions", "enabling", "write", "read", "privacy", "related", "topics"],"aliases":["app-functions", "system-ai", "gemini", "assistant"],"charCount":3519}, - {"id":"connections","title":"Connections","section":"user","locale":"sv-rSE","resourcePath":"docs/sv-rSE/user/connections.html","navOrder":2,"keywords":["connections", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":4954}, + {"id":"connections","title":"Connections","section":"user","locale":"sv-rSE","resourcePath":"docs/sv-rSE/user/connections.html","navOrder":2,"keywords":["connections", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":6443}, {"id":"debug-logs","title":"Debug Logs","section":"user","locale":"sv-rSE","resourcePath":"docs/sv-rSE/user/debug-logs.html","navOrder":22,"keywords":["debug", "logs", "the", "two", "tabs", "viewing", "app", "exporting", "desktop", "related", "topics"],"aliases":["debug-logs", "logcat", "app-logs", "bug-report"],"charCount":3006}, {"id":"desktop","title":"Desktop App","section":"user","locale":"sv-rSE","resourcePath":"docs/sv-rSE/user/desktop.html","navOrder":14,"keywords":["desktop", "app", "installation", "linux", "macos", "windows", "connecting", "your", "radio", "usb", "serial", "primary", "tcp", "bluetooth", "ble", "feature", "parity", "differences", "keyboard", "shortcuts", "window", "system", "tray", "notification", "preferences", "built", "documentation", "browser", "building", "from"],"aliases":["desktop", "linux", "macos", "windows", "jvm"],"charCount":6180}, {"id":"discovery","title":"Upptäckt","section":"user","locale":"sv-rSE","resourcePath":"docs/sv-rSE/user/discovery.html","navOrder":12,"keywords":["uppt", "ckt", "local", "mesh", "discovery", "scanner", "setting", "scan", "live", "progress", "reading", "the", "results", "beacon", "manual", "exploration", "traceroute", "rutt", "running", "troubleshooting", "with", "granninformation", "enabling", "neighbor", "info", "viewing", "data", "node", "list", "tool"],"aliases":["mesh-discovery", "local-discovery", "network-scan", "traceroute", "neighbor-info"],"charCount":12538}, @@ -792,7 +792,7 @@ {"id":"mqtt","title":"MQTT","section":"user","locale":"sv-rSE","resourcePath":"docs/sv-rSE/user/mqtt.html","navOrder":11,"keywords":["mqtt", "overview", "how", "works", "konfiguration", "enabling", "proxy", "this", "phone", "default", "meshtastic", "broker", "private", "map", "reporting", "uplink", "downlink", "message", "formats", "encryption", "privacy", "best", "practices", "fels", "kning", "not", "connecting", "messages", "bridging", "related"],"aliases":["mqtt", "internet-bridge", "broker"],"charCount":7839}, {"id":"node-metrics","title":"Node Metrics","section":"user","locale":"sv-rSE","resourcePath":"docs/sv-rSE/user/node-metrics.html","navOrder":5,"keywords":["node", "metrics", "enhetens", "rden", "milj", "air", "quality", "signal", "reference", "str", "mdata", "traceroute", "rutt", "reading", "results", "position", "loggbok", "granninformation", "viewing", "related", "topics"],"aliases":["metrics", "telemetry", "device-metrics", "signal"],"charCount":9857}, {"id":"nodes","title":"Noder","section":"user","locale":"sv-rSE","resourcePath":"docs/sv-rSE/user/nodes.html","navOrder":4,"keywords":["noder", "node", "list", "status", "indicators", "roles", "choosing", "role", "encryption", "quick", "actions", "filtering", "sorting", "text", "search", "filter", "toggles", "sort", "options", "nodes", "per", "hop", "detail", "device", "links", "want", "one", "related", "topics"],"aliases":["node-list", "mesh-nodes", "peers", "hop-histogram"],"charCount":11264}, - {"id":"onboarding","title":"Kom igång","section":"user","locale":"sv-rSE","resourcePath":"docs/sv-rSE/user/onboarding.html","navOrder":1,"keywords":["kom", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":4012}, + {"id":"onboarding","title":"Kom igång","section":"user","locale":"sv-rSE","resourcePath":"docs/sv-rSE/user/onboarding.html","navOrder":1,"keywords":["kom", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "reviewing", "later", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":6873}, {"id":"settings-module-admin","title":"Settings — Modules & Admin","section":"user","locale":"sv-rSE","resourcePath":"docs/sv-rSE/user/settings-module-admin.html","navOrder":8,"keywords":["settings", "modules", "admin", "module", "configuration", "mqtt", "serial", "external", "notification", "store", "forward", "range", "test", "telemetry", "canned", "message", "audio", "remote", "hardware", "neighbor", "info", "ambient", "lighting", "detection", "sensor", "paxcounter", "tak", "administration", "rradministration", "rensa"],"aliases":["modules", "module-config", "administration"],"charCount":15876}, {"id":"settings-radio-user","title":"Settings — Radio & User","section":"user","locale":"sv-rSE","resourcePath":"docs/sv-rSE/user/settings-radio-user.html","navOrder":7,"keywords":["settings", "radio", "user", "anv", "ndarinst", "llningar", "profile", "applying", "changes", "konfiguration", "enhetskonfiguration", "lora", "config", "modem", "presets", "display", "position", "str", "minst", "network", "bluetooth", "inst", "security", "related", "topics"],"aliases":["inställningar", "radio-config", "user-config", "lora"],"charCount":15032}, {"id":"signal-meter","title":"How the Meshtastic Signal Meter Works","section":"user","locale":"sv-rSE","resourcePath":"docs/sv-rSE/user/signal-meter.html","navOrder":15,"keywords":["how", "the", "meshtastic", "signal", "meter", "works", "two", "metrics", "loudness", "clarity", "magic", "lora", "hearing", "below", "noise", "floor", "calculates", "quality", "what", "this", "means", "for", "you", "where", "information", "appears", "related", "topics"],"aliases":["signal", "signal-meter", "snr", "rssi"],"charCount":5900}, @@ -803,7 +803,7 @@ {"id":"widget","title":"Home Screen Widget","section":"user","locale":"sv-rSE","resourcePath":"docs/sv-rSE/user/widget.html","navOrder":20,"keywords":["home", "screen", "widget", "what", "shows", "adding", "the", "related", "topics"],"aliases":["widget", "home-screen-widget", "local-stats-widget"],"charCount":1859}, {"id":"android-auto","title":"Android Auto","section":"user","locale":"tr-rTR","resourcePath":"docs/tr-rTR/user/android-auto.html","navOrder":18,"keywords":["android", "auto", "genel", "bak", "mesajlar", "nodelar", "status", "related", "topics"],"aliases":["android-auto", "car", "head-unit", "auto"],"charCount":2943}, {"id":"app-functions","title":"App Functions","section":"user","locale":"tr-rTR","resourcePath":"docs/tr-rTR/user/app-functions.html","navOrder":19,"keywords":["app", "functions", "enabling", "write", "read", "privacy", "related", "topics"],"aliases":["app-functions", "system-ai", "gemini", "assistant"],"charCount":3516}, - {"id":"connections","title":"Bağlantılar","section":"user","locale":"tr-rTR","resourcePath":"docs/tr-rTR/user/connections.html","navOrder":2,"keywords":["lant", "lar", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "connections", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":4966}, + {"id":"connections","title":"Bağlantılar","section":"user","locale":"tr-rTR","resourcePath":"docs/tr-rTR/user/connections.html","navOrder":2,"keywords":["lant", "lar", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "connections", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":6455}, {"id":"debug-logs","title":"Debug Logs","section":"user","locale":"tr-rTR","resourcePath":"docs/tr-rTR/user/debug-logs.html","navOrder":22,"keywords":["debug", "logs", "the", "two", "tabs", "viewing", "app", "exporting", "desktop", "related", "topics"],"aliases":["debug-logs", "logcat", "app-logs", "bug-report"],"charCount":3003}, {"id":"desktop","title":"Desktop App","section":"user","locale":"tr-rTR","resourcePath":"docs/tr-rTR/user/desktop.html","navOrder":14,"keywords":["desktop", "app", "installation", "linux", "macos", "windows", "connecting", "your", "radio", "usb", "serial", "primary", "tcp", "bluetooth", "ble", "feature", "parity", "differences", "keyboard", "shortcuts", "window", "system", "tray", "notification", "preferences", "built", "documentation", "browser", "building", "from"],"aliases":["desktop", "linux", "macos", "windows", "jvm"],"charCount":6180}, {"id":"discovery","title":"Discovery","section":"user","locale":"tr-rTR","resourcePath":"docs/tr-rTR/user/discovery.html","navOrder":12,"keywords":["discovery", "local", "mesh", "scanner", "setting", "scan", "live", "progress", "reading", "the", "results", "beacon", "manual", "exploration", "yol", "izle", "running", "traceroute", "troubleshooting", "with", "kom", "bilgisi", "enabling", "neighbor", "info", "viewing", "data", "node", "list", "tool"],"aliases":["mesh-discovery", "local-discovery", "network-scan", "traceroute", "neighbor-info"],"charCount":12522}, @@ -814,7 +814,7 @@ {"id":"mqtt","title":"MQTT","section":"user","locale":"tr-rTR","resourcePath":"docs/tr-rTR/user/mqtt.html","navOrder":11,"keywords":["mqtt", "genel", "bak", "how", "works", "yap", "land", "rma", "enabling", "proxy", "this", "phone", "default", "meshtastic", "broker", "private", "map", "reporting", "uplink", "downlink", "message", "formats", "encryption", "privacy", "best", "practices", "troubleshooting", "not", "connecting", "messages"],"aliases":["mqtt", "internet-bridge", "broker"],"charCount":7846}, {"id":"node-metrics","title":"Node Metrics","section":"user","locale":"tr-rTR","resourcePath":"docs/tr-rTR/user/node-metrics.html","navOrder":5,"keywords":["node", "metrics", "device", "environment", "air", "quality", "signal", "reference", "power", "yol", "izle", "reading", "traceroute", "results", "konum", "kay", "tlar", "kom", "bilgisi", "viewing", "related", "topics"],"aliases":["metrics", "telemetry", "device-metrics", "signal"],"charCount":9855}, {"id":"nodes","title":"Nodelar","section":"user","locale":"tr-rTR","resourcePath":"docs/tr-rTR/user/nodes.html","navOrder":4,"keywords":["nodelar", "node", "list", "status", "indicators", "roles", "choosing", "role", "encryption", "quick", "actions", "filtering", "sorting", "text", "search", "filter", "toggles", "sort", "options", "nodes", "per", "hop", "detail", "device", "links", "want", "one", "related", "topics"],"aliases":["node-list", "mesh-nodes", "peers", "hop-histogram"],"charCount":11265}, - {"id":"onboarding","title":"Getting Started","section":"user","locale":"tr-rTR","resourcePath":"docs/tr-rTR/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":4024}, + {"id":"onboarding","title":"Getting Started","section":"user","locale":"tr-rTR","resourcePath":"docs/tr-rTR/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "reviewing", "later", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":6885}, {"id":"settings-module-admin","title":"Settings — Modules & Admin","section":"user","locale":"tr-rTR","resourcePath":"docs/tr-rTR/user/settings-module-admin.html","navOrder":8,"keywords":["settings", "modules", "admin", "module", "configuration", "mqtt", "serial", "external", "notification", "store", "forward", "range", "test", "telemetry", "canned", "message", "audio", "remote", "hardware", "neighbor", "info", "ambient", "lighting", "detection", "sensor", "paxcounter", "tak", "netim", "uzaktan", "clean"],"aliases":["modules", "module-config", "administration"],"charCount":15877}, {"id":"settings-radio-user","title":"Settings — Radio & User","section":"user","locale":"tr-rTR","resourcePath":"docs/tr-rTR/user/settings-radio-user.html","navOrder":7,"keywords":["settings", "radio", "user", "profile", "applying", "changes", "yap", "land", "rma", "cihaz", "ayar", "lora", "modem", "presets", "akran", "konum", "bluetooth", "venlik", "related", "topics"],"aliases":["ayarlar", "radio-config", "user-config", "lora"],"charCount":14935}, {"id":"signal-meter","title":"How the Meshtastic Signal Meter Works","section":"user","locale":"tr-rTR","resourcePath":"docs/tr-rTR/user/signal-meter.html","navOrder":15,"keywords":["how", "the", "meshtastic", "signal", "meter", "works", "two", "metrics", "loudness", "clarity", "magic", "lora", "hearing", "below", "noise", "floor", "calculates", "quality", "what", "this", "means", "for", "you", "where", "information", "appears", "related", "topics"],"aliases":["signal", "signal-meter", "snr", "rssi"],"charCount":5930}, @@ -825,7 +825,7 @@ {"id":"widget","title":"Home Screen Widget","section":"user","locale":"tr-rTR","resourcePath":"docs/tr-rTR/user/widget.html","navOrder":20,"keywords":["home", "screen", "widget", "what", "shows", "adding", "the", "related", "topics"],"aliases":["widget", "home-screen-widget", "local-stats-widget"],"charCount":1856}, {"id":"android-auto","title":"Android Auto","section":"user","locale":"uk-rUA","resourcePath":"docs/uk-rUA/user/android-auto.html","navOrder":18,"keywords":["android", "auto", "overview", "status", "related", "topics"],"aliases":["android-auto", "car", "head-unit", "auto"],"charCount":2942}, {"id":"app-functions","title":"App Functions","section":"user","locale":"uk-rUA","resourcePath":"docs/uk-rUA/user/app-functions.html","navOrder":19,"keywords":["app", "functions", "enabling", "write", "read", "privacy", "related", "topics"],"aliases":["app-functions", "system-ai", "gemini", "assistant"],"charCount":3516}, - {"id":"connections","title":"Connections","section":"user","locale":"uk-rUA","resourcePath":"docs/uk-rUA/user/connections.html","navOrder":2,"keywords":["connections", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":4954}, + {"id":"connections","title":"Connections","section":"user","locale":"uk-rUA","resourcePath":"docs/uk-rUA/user/connections.html","navOrder":2,"keywords":["connections", "bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":6443}, {"id":"debug-logs","title":"Debug Logs","section":"user","locale":"uk-rUA","resourcePath":"docs/uk-rUA/user/debug-logs.html","navOrder":22,"keywords":["debug", "logs", "the", "two", "tabs", "viewing", "app", "exporting", "desktop", "related", "topics"],"aliases":["debug-logs", "logcat", "app-logs", "bug-report"],"charCount":3013}, {"id":"desktop","title":"Desktop App","section":"user","locale":"uk-rUA","resourcePath":"docs/uk-rUA/user/desktop.html","navOrder":14,"keywords":["desktop", "app", "installation", "linux", "macos", "windows", "connecting", "your", "radio", "usb", "serial", "primary", "tcp", "bluetooth", "ble", "feature", "parity", "differences", "keyboard", "shortcuts", "window", "system", "tray", "notification", "preferences", "built", "documentation", "browser", "building", "from"],"aliases":["desktop", "linux", "macos", "windows", "jvm"],"charCount":6180}, {"id":"discovery","title":"Discovery","section":"user","locale":"uk-rUA","resourcePath":"docs/uk-rUA/user/discovery.html","navOrder":12,"keywords":["discovery", "local", "mesh", "scanner", "setting", "scan", "live", "progress", "reading", "the", "results", "beacon", "manual", "exploration", "running", "traceroute", "troubleshooting", "with", "enabling", "neighbor", "info", "viewing", "data", "node", "list", "tool", "finding", "new", "nodes", "assessing"],"aliases":["mesh-discovery", "local-discovery", "network-scan", "traceroute", "neighbor-info"],"charCount":12530}, @@ -836,7 +836,7 @@ {"id":"mqtt","title":"MQTT","section":"user","locale":"uk-rUA","resourcePath":"docs/uk-rUA/user/mqtt.html","navOrder":11,"keywords":["mqtt", "overview", "how", "works", "enabling", "proxy", "this", "phone", "default", "meshtastic", "broker", "private", "map", "reporting", "uplink", "downlink", "message", "formats", "encryption", "privacy", "best", "practices", "troubleshooting", "not", "connecting", "messages", "bridging", "related", "topics"],"aliases":["mqtt", "internet-bridge", "broker"],"charCount":7853}, {"id":"node-metrics","title":"Node Metrics","section":"user","locale":"uk-rUA","resourcePath":"docs/uk-rUA/user/node-metrics.html","navOrder":5,"keywords":["node", "metrics", "air", "quality", "signal", "reference", "reading", "traceroute", "results", "position", "log", "viewing", "related", "topics"],"aliases":["metrics", "telemetry", "device-metrics", "signal"],"charCount":9931}, {"id":"nodes","title":"Вузли","section":"user","locale":"uk-rUA","resourcePath":"docs/uk-rUA/user/nodes.html","navOrder":4,"keywords":["node", "list", "status", "indicators", "roles", "choosing", "role", "encryption", "quick", "actions", "filtering", "sorting", "text", "search", "filter", "toggles", "sort", "options", "nodes", "per", "hop", "detail", "device", "links", "want", "one", "related", "topics"],"aliases":["node-list", "mesh-nodes", "peers", "hop-histogram"],"charCount":11313}, - {"id":"onboarding","title":"Getting Started","section":"user","locale":"uk-rUA","resourcePath":"docs/uk-rUA/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":4024}, + {"id":"onboarding","title":"Getting Started","section":"user","locale":"uk-rUA","resourcePath":"docs/uk-rUA/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "reviewing", "later", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":6885}, {"id":"settings-module-admin","title":"Settings — Modules & Admin","section":"user","locale":"uk-rUA","resourcePath":"docs/uk-rUA/user/settings-module-admin.html","navOrder":8,"keywords":["settings", "modules", "admin", "module", "configuration", "mqtt", "serial", "external", "notification", "store", "forward", "range", "test", "telemetry", "canned", "message", "audio", "remote", "hardware", "neighbor", "info", "ambient", "lighting", "detection", "sensor", "paxcounter", "tak", "factory", "reset", "troubleshooting"],"aliases":["modules", "module-config", "administration"],"charCount":15905}, {"id":"settings-radio-user","title":"Settings — Radio & User","section":"user","locale":"uk-rUA","resourcePath":"docs/uk-rUA/user/settings-radio-user.html","navOrder":7,"keywords":["settings", "radio", "user", "profile", "applying", "changes", "lora", "modem", "presets", "position", "config", "bluetooth", "related", "topics"],"aliases":["налаштування", "radio-config", "user-config", "lora"],"charCount":15042}, {"id":"signal-meter","title":"How the Meshtastic Signal Meter Works","section":"user","locale":"uk-rUA","resourcePath":"docs/uk-rUA/user/signal-meter.html","navOrder":15,"keywords":["how", "the", "meshtastic", "signal", "meter", "works", "two", "metrics", "loudness", "clarity", "magic", "lora", "hearing", "below", "noise", "floor", "calculates", "quality", "what", "this", "means", "for", "you", "where", "information", "appears", "related", "topics"],"aliases":["signal", "signal-meter", "snr", "rssi"],"charCount":5936}, @@ -847,7 +847,7 @@ {"id":"widget","title":"Home Screen Widget","section":"user","locale":"uk-rUA","resourcePath":"docs/uk-rUA/user/widget.html","navOrder":20,"keywords":["home", "screen", "widget", "what", "shows", "adding", "the", "related", "topics"],"aliases":["widget", "home-screen-widget", "local-stats-widget"],"charCount":1866}, {"id":"android-auto","title":"Android Auto","section":"user","locale":"zh-rCN","resourcePath":"docs/zh-rCN/user/android-auto.html","navOrder":18,"keywords":["android", "auto", "status", "related", "topics"],"aliases":["android-auto", "car", "head-unit", "auto"],"charCount":2923}, {"id":"app-functions","title":"App Functions","section":"user","locale":"zh-rCN","resourcePath":"docs/zh-rCN/user/app-functions.html","navOrder":19,"keywords":["app", "functions", "enabling", "write", "read", "privacy", "related", "topics"],"aliases":["app-functions", "system-ai", "gemini", "assistant"],"charCount":3516}, - {"id":"connections","title":"连接数","section":"user","locale":"zh-rCN","resourcePath":"docs/zh-rCN/user/connections.html","navOrder":2,"keywords":["bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "connections", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":4926}, + {"id":"connections","title":"连接数","section":"user","locale":"zh-rCN","resourcePath":"docs/zh-rCN/user/connections.html","navOrder":2,"keywords":["bluetooth", "ble", "pairing", "device", "connection", "status", "troubleshooting", "usb", "serial", "setup", "tcp", "network", "connecting", "over", "the", "when", "use", "reconnection", "behavior", "desktop", "connections", "related", "topics"],"aliases":["bluetooth", "usb", "tcp", "pairing"],"charCount":6415}, {"id":"debug-logs","title":"Debug Logs","section":"user","locale":"zh-rCN","resourcePath":"docs/zh-rCN/user/debug-logs.html","navOrder":22,"keywords":["debug", "logs", "the", "two", "tabs", "viewing", "app", "exporting", "desktop", "related", "topics"],"aliases":["debug-logs", "logcat", "app-logs", "bug-report"],"charCount":2997}, {"id":"desktop","title":"Desktop App","section":"user","locale":"zh-rCN","resourcePath":"docs/zh-rCN/user/desktop.html","navOrder":14,"keywords":["desktop", "app", "linux", "macos", "windows", "connecting", "your", "radio", "usb", "serial", "primary", "tcp", "bluetooth", "ble", "feature", "parity", "differences", "keyboard", "shortcuts", "window", "system", "tray", "notification", "preferences", "built", "documentation", "browser", "building", "from", "source"],"aliases":["desktop", "linux", "macos", "windows", "jvm"],"charCount":6170}, {"id":"discovery","title":"发现","section":"user","locale":"zh-rCN","resourcePath":"docs/zh-rCN/user/discovery.html","navOrder":12,"keywords":["local", "mesh", "discovery", "scanner", "setting", "scan", "live", "progress", "reading", "the", "results", "manual", "exploration", "running", "traceroute", "troubleshooting", "with", "enabling", "neighbor", "info", "viewing", "data", "node", "list", "tool", "finding", "new", "nodes", "assessing", "connectivity"],"aliases":["mesh-discovery", "local-discovery", "network-scan", "traceroute", "neighbor-info"],"charCount":12490}, @@ -858,7 +858,7 @@ {"id":"mqtt","title":"MQTT","section":"user","locale":"zh-rCN","resourcePath":"docs/zh-rCN/user/mqtt.html","navOrder":11,"keywords":["mqtt", "how", "works", "configuration", "enabling", "proxy", "this", "phone", "default", "meshtastic", "broker", "private", "map", "reporting", "uplink", "downlink", "message", "formats", "encryption", "privacy", "best", "practices", "not", "connecting", "messages", "bridging", "related", "topics"],"aliases":["mqtt", "internet-bridge", "broker"],"charCount":7827}, {"id":"node-metrics","title":"Node Metrics","section":"user","locale":"zh-rCN","resourcePath":"docs/zh-rCN/user/node-metrics.html","navOrder":5,"keywords":["node", "metrics", "air", "quality", "signal", "reference", "reading", "traceroute", "results", "viewing", "related", "topics"],"aliases":["metrics", "telemetry", "device-metrics", "signal"],"charCount":9705}, {"id":"nodes","title":"节点","section":"user","locale":"zh-rCN","resourcePath":"docs/zh-rCN/user/nodes.html","navOrder":4,"keywords":["node", "list", "status", "indicators", "roles", "choosing", "role", "encryption", "quick", "actions", "filtering", "sorting", "text", "search", "filter", "toggles", "sort", "options", "nodes", "per", "hop", "detail", "device", "links", "want", "one", "related", "topics"],"aliases":["node-list", "mesh-nodes", "peers", "hop-histogram"],"charCount":11251}, - {"id":"onboarding","title":"Getting Started","section":"user","locale":"zh-rCN","resourcePath":"docs/zh-rCN/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":4024}, + {"id":"onboarding","title":"Getting Started","section":"user","locale":"zh-rCN","resourcePath":"docs/zh-rCN/user/onboarding.html","navOrder":1,"keywords":["getting", "started", "first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "reviewing", "later", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":6885}, {"id":"settings-module-admin","title":"Settings — Modules & Admin","section":"user","locale":"zh-rCN","resourcePath":"docs/zh-rCN/user/settings-module-admin.html","navOrder":8,"keywords":["settings", "modules", "admin", "mqtt", "module", "serial", "external", "notification", "store", "forward", "range", "test", "telemetry", "canned", "message", "audio", "remote", "hardware", "neighbor", "info", "ambient", "lighting", "detection", "sensor", "paxcounter", "tak", "factory", "reset", "troubleshooting", "related"],"aliases":["modules", "module-config", "administration"],"charCount":15806}, {"id":"settings-radio-user","title":"Settings — Radio & User","section":"user","locale":"zh-rCN","resourcePath":"docs/zh-rCN/user/settings-radio-user.html","navOrder":7,"keywords":["settings", "radio", "user", "profile", "applying", "changes", "configuration", "lora", "modem", "presets", "related", "topics"],"aliases":["设置", "radio-config", "user-config", "lora"],"charCount":14849}, {"id":"signal-meter","title":"How the Meshtastic Signal Meter Works","section":"user","locale":"zh-rCN","resourcePath":"docs/zh-rCN/user/signal-meter.html","navOrder":15,"keywords":["how", "the", "meshtastic", "signal", "meter", "works", "two", "metrics", "loudness", "clarity", "magic", "lora", "hearing", "below", "noise", "floor", "calculates", "quality", "what", "this", "means", "for", "you", "where", "information", "appears", "related", "topics"],"aliases":["signal", "signal-meter", "snr", "rssi"],"charCount":5900}, @@ -869,7 +869,7 @@ {"id":"widget","title":"Home Screen Widget","section":"user","locale":"zh-rCN","resourcePath":"docs/zh-rCN/user/widget.html","navOrder":20,"keywords":["home", "screen", "widget", "what", "shows", "adding", "the", "related", "topics"],"aliases":["widget", "home-screen-widget", "local-stats-widget"],"charCount":1856}, {"id":"android-auto","title":"Android Auto","section":"user","locale":"zh-rTW","resourcePath":"docs/zh-rTW/user/android-auto.html","navOrder":18,"keywords":["android", "auto", "status"],"aliases":["android-auto", "car", "head-unit", "auto"],"charCount":2913}, {"id":"app-functions","title":"App Functions","section":"user","locale":"zh-rTW","resourcePath":"docs/zh-rTW/user/app-functions.html","navOrder":19,"keywords":["app", "functions", "enabling", "write", "read"],"aliases":["app-functions", "system-ai", "gemini", "assistant"],"charCount":3501}, - {"id":"connections","title":"連線","section":"user","locale":"zh-rTW","resourcePath":"docs/zh-rTW/user/connections.html","navOrder":2,"keywords":["ble", "usb", "tcp", "network", "connecting", "over", "the"],"aliases":["藍牙", "usb", "tcp", "配對"],"charCount":3344}, + {"id":"connections","title":"連線","section":"user","locale":"zh-rTW","resourcePath":"docs/zh-rTW/user/connections.html","navOrder":2,"keywords":["ble", "usb", "tcp", "network", "connecting", "over", "the"],"aliases":["藍牙", "usb", "tcp", "配對"],"charCount":4953}, {"id":"debug-logs","title":"Debug Logs","section":"user","locale":"zh-rTW","resourcePath":"docs/zh-rTW/user/debug-logs.html","navOrder":22,"keywords":["debug", "logs", "the", "two", "tabs", "viewing", "app", "exporting"],"aliases":["debug-logs", "logcat", "app-logs", "bug-report"],"charCount":2989}, {"id":"desktop","title":"桌面版應用程式","section":"user","locale":"zh-rTW","resourcePath":"docs/zh-rTW/user/desktop.html","navOrder":14,"keywords":["linux", "macos", "windows", "usb", "tcp", "ble"],"aliases":["桌面", "linux", "macos", "windows", "jvm"],"charCount":4592}, {"id":"discovery","title":"尋找","section":"user","locale":"zh-rTW","resourcePath":"docs/zh-rTW/user/discovery.html","navOrder":12,"keywords":["local", "mesh", "discovery", "scanner", "setting", "scan", "live", "progress", "beacon", "manual", "exploration"],"aliases":["mesh-探索", "本地-探索", "網路-掃描", "traceroute", "鄰居資訊"],"charCount":9846}, @@ -880,7 +880,7 @@ {"id":"mqtt","title":"MQTT","section":"user","locale":"zh-rTW","resourcePath":"docs/zh-rTW/user/mqtt.html","navOrder":11,"keywords":["mqtt", "proxy", "this", "phone", "meshtastic"],"aliases":["MQTT", "internet-bridge", "broker"],"charCount":4480}, {"id":"node-metrics","title":"Node Metrics","section":"user","locale":"zh-rTW","resourcePath":"docs/zh-rTW/user/node-metrics.html","navOrder":5,"keywords":["node", "metrics", "air", "quality", "signal", "reference", "reading", "traceroute", "results", "viewing", "related", "topics"],"aliases":["metrics", "遙測", "device-metrics", "signal"],"charCount":9779}, {"id":"nodes","title":"節點","section":"user","locale":"zh-rTW","resourcePath":"docs/zh-rTW/user/nodes.html","navOrder":4,"keywords":["node", "list", "status", "indicators", "roles", "choosing", "role", "encryption", "quick", "actions", "filtering", "sorting", "text", "search", "filter", "toggles", "sort", "options", "nodes", "per", "hop", "detail", "device", "links", "want", "one", "related", "topics"],"aliases":["node-list", "mesh-nodes", "peers", "hop-histogram"],"charCount":11251}, - {"id":"onboarding","title":"新手入門","section":"user","locale":"zh-rTW","resourcePath":"docs/zh-rTW/user/onboarding.html","navOrder":999,"keywords":["first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":11083}, + {"id":"onboarding","title":"新手入門","section":"user","locale":"zh-rTW","resourcePath":"docs/zh-rTW/user/onboarding.html","navOrder":999,"keywords":["first", "launch", "welcome", "screen", "permissions", "bluetooth", "permission", "location", "notifications", "critical", "alerts", "reviewing", "later", "after", "setup", "what", "next"],"aliases":["first-launch", "setup", "intro"],"charCount":13944}, {"id":"settings-module-admin","title":"Settings — Modules & Admin","section":"user","locale":"zh-rTW","resourcePath":"docs/zh-rTW/user/settings-module-admin.html","navOrder":8,"keywords":["settings", "modules", "admin", "mqtt", "module", "serial", "external", "notification", "store", "forward", "range", "test", "telemetry", "canned", "message", "audio", "remote", "hardware", "neighbor", "info", "ambient", "lighting", "detection", "sensor", "paxcounter", "tak", "troubleshooting", "related", "topics"],"aliases":["modules", "模組設定", "administration"],"charCount":15770}, {"id":"settings-radio-user","title":"Settings — Radio & User","section":"user","locale":"zh-rTW","resourcePath":"docs/zh-rTW/user/settings-radio-user.html","navOrder":7,"keywords":["settings", "radio", "user", "profile", "applying", "changes", "lora", "modem", "presets", "related", "topics"],"aliases":["設定", "radio-config", "user-config", "LoRa"],"charCount":14997}, {"id":"signal-meter","title":"How the Meshtastic Signal Meter Works","section":"user","locale":"zh-rTW","resourcePath":"docs/zh-rTW/user/signal-meter.html","navOrder":15,"keywords":["how", "the", "meshtastic", "signal", "meter", "works", "open", "source", "decentralized", "off", "grid", "privacy", "respecting", "encrypted", "communications", "platform", "built", "affordable", "readily", "available", "hardware", "enables", "you", "and", "your", "friends", "communicate", "securely", "with", "text"],"aliases":["signal", "signal-meter", "snr", "rssi"],"charCount":53211}, diff --git a/main/is-rIS/user/connections.html b/main/is-rIS/user/connections.html index 878150ec1c..db6199e6db 100644 --- a/main/is-rIS/user/connections.html +++ b/main/is-rIS/user/connections.html @@ -1 +1 @@ - Connections | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Íslenska
    Meshtastic Docs ↗

    🌐 Íslenska — Community translation View in English

    Connections

    Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

    Bluetooth (BLE)

    Bluetooth Low Energy is the default and most common connection method on Android.

    Pairing a Device

    1. Ensure your Meshtastic radio is powered on and in pairing mode.
    2. Open the app and navigate to the Connect tab.
    3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
    4. Select your device from the list.
    5. Accept the Bluetooth pairing prompt if shown.

    Scanning for Bluetooth devices, with a discovered radio in the list

    Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

    Transport selector

    💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device.

    Connection Status

    Icon State Lýsing
    🟢 Connected Active radio link established
    🟡 Connecting Handshake in progress
    🔴 Aftengd No active connection
    Not configured No device selected

    When connecting, a status indicator shows the current connection state:

    Connecting status

    If no devices are found, the app shows an empty state with instructions:

    No devices found

    Troubleshooting Bluetooth

    • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
    • Connection drops: Move closer to the radio; check for interference.
    • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

    USB Serial

    USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

    Setup

    1. Connect your radio via USB cable to your device.
    2. The app will prompt for USB permission — tap Allow.
    3. The connection is established automatically.

    ⚠️ Note: USB connections require OTG support on Android devices.

    TCP/IP (Network)

    Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

    Connecting over the Network

    1. Make sure the radio is on the same local network as your phone/desktop.
    2. On the Connect screen, select Network in the transport selector.
    3. Choose the radio one of two ways:
      • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
      • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
    4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

    💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

    When to Use TCP

    • Radio is on the same local network
    • Testing with a simulated radio
    • Environments where Bluetooth has interference issues

    Reconnection Behavior

    The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

    To disconnect, tap the disconnect button on the Connect screen:

    Disconnect from radio

    Desktop Connections

    On Desktop (Linux/macOS/Windows), the app supports:

    • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
    • USB Serial — primary wired connection method
    • TCP/IP — for network-connected radios

    See Desktop App for platform-specific details and keyboard shortcuts.



    + Connections | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Íslenska
    Meshtastic Docs ↗

    🌐 Íslenska — Community translation View in English

    Connections

    Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

    Bluetooth (BLE)

    Bluetooth Low Energy is the default and most common connection method on Android.

    Pairing a Device

    1. Ensure your Meshtastic radio is powered on and in pairing mode.
    2. Open the app and navigate to the Connect tab.
    3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
    4. Select your device from the list.
    5. Accept the Bluetooth pairing prompt if shown.

    Scanning for Bluetooth devices, with a discovered radio in the list

    Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

    Transport selector

    💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range.

    The screen names anything on the app’s side that is blocking a scan, with the fix attached:

    What you see What it means
    A card asking for Nearby devices The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings.
    Bluetooth is off The adapter is disabled — the card opens Bluetooth settings.
    Bluetooth scanning also needs location services Android 11 and older only: the permission is held but the system location toggle is off.
    No card, empty list Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere.

    Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered.

    Connection Status

    Icon State Lýsing
    🟢 Connected Active radio link established
    🟡 Connecting Handshake in progress
    🔴 Aftengd No active connection
    Not configured No device selected

    When connecting, a status indicator shows the current connection state:

    Connecting status

    If no devices are found, the app shows an empty state with instructions:

    No devices found

    Troubleshooting Bluetooth

    • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
    • Connection drops: Move closer to the radio; check for interference.
    • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

    USB Serial

    USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

    Setup

    1. Connect your radio via USB cable to your device.
    2. The app will prompt for USB permission — tap Allow.
    3. The connection is established automatically.

    ⚠️ Note: USB connections require OTG support on Android devices.

    TCP/IP (Network)

    Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

    Connecting over the Network

    1. Make sure the radio is on the same local network as your phone/desktop.
    2. On the Connect screen, select Network in the transport selector.
    3. Choose the radio one of two ways:
      • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
      • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
    4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

    💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

    When to Use TCP

    • Radio is on the same local network
    • Testing with a simulated radio
    • Environments where Bluetooth has interference issues

    Reconnection Behavior

    The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

    To disconnect, tap the disconnect button on the Connect screen:

    Disconnect from radio

    Desktop Connections

    On Desktop (Linux/macOS/Windows), the app supports:

    • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
    • USB Serial — primary wired connection method
    • TCP/IP — for network-connected radios

    See Desktop App for platform-specific details and keyboard shortcuts.



    diff --git a/main/is-rIS/user/onboarding.html b/main/is-rIS/user/onboarding.html index a231ef49a7..920194f364 100644 --- a/main/is-rIS/user/onboarding.html +++ b/main/is-rIS/user/onboarding.html @@ -1 +1 @@ - Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Íslenska
    Meshtastic Docs ↗

    🌐 Íslenska — Community translation View in English

    Getting Started

    Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

    First Launch

    When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings.

    Welcome Screen

    The welcome screen introduces Meshtastic and its core capabilities:

    • Off-grid mesh communication
    • No cellular or internet required
    • End-to-end encrypted messaging

    Tap Get Started to proceed through the setup flow.

    Welcome screen

    Permissions

    The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

    Bluetooth Permission

    Bluetooth is the primary connection method between your phone and Meshtastic radio:

    • Bluetooth scanning — discover nearby Meshtastic radios
    • Bluetooth connect — establish and maintain connections with paired radios

    Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

    Location Permission

    ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice.

    Meshtastic also uses your location for:

    • Showing your position on the mesh map
    • Calculating distances to other nodes
    • Sharing your GPS coordinates with other mesh members (if enabled)

    Grant “While using the app” or “Always” depending on your preference:

    • While using the app — position updates only when the app is open
    • Always — enables background position updates for always-on mesh presence

    If denied, Bluetooth scanning will not function and your node will not report a position.

    Notifications Permission

    Notifications alert you to:

    • Incoming messages from channels and direct messages
    • New nodes joining the mesh
    • Low battery on a remote node

    💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

    Critical Alerts Permission

    On supported devices, the app may request permission for critical alerts:

    • These are high-priority notifications that can break through Do Not Disturb mode
    • Useful for emergency mesh alerts or urgent messages
    • You can skip this step if you don’t need breakthrough notifications
    • Configure or revoke later in Android notification settings

    After Setup

    Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

    💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use.

    What’s Next?

    Once connected to a radio, explore:

    New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



    + Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Íslenska
    Meshtastic Docs ↗

    🌐 Íslenska — Community translation View in English

    Getting Started

    Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

    First Launch

    When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app.

    Welcome Screen

    The welcome screen introduces Meshtastic and its core capabilities:

    • Off-grid mesh communication
    • No cellular or internet required
    • End-to-end encrypted messaging

    Tap Get Started to proceed through the setup flow.

    Welcome screen

    Permissions

    The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

    Bluetooth Permission

    Bluetooth is the primary connection method between your phone and Meshtastic radio:

    • Bluetooth scanning — discover nearby Meshtastic radios
    • Bluetooth connect — establish and maintain connections with paired radios

    Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

    Location Permission

    ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio.

    Meshtastic also uses your location for:

    • Showing your position on the mesh map
    • Calculating distances to other nodes
    • Sharing your GPS coordinates with other mesh members (if enabled)

    Grant “While using the app” or “Always” depending on your preference:

    • While using the app — position updates only when the app is open
    • Always — enables background position updates for always-on mesh presence

    Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind.

    Notifications Permission

    Notifications alert you to:

    • Incoming messages from channels and direct messages
    • New nodes joining the mesh
    • Low battery on a remote node

    💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

    Critical Alerts Permission

    On supported devices, the app may request permission for critical alerts:

    • These are high-priority notifications that can break through Do Not Disturb mode
    • Useful for emergency mesh alerts or urgent messages
    • You can skip this step if you don’t need breakthrough notifications
    • Configure or revoke later in Android notification settings

    Reviewing permissions later

    Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time:

    State What tapping the row does
    Allowed Opens the system page, so you can review or revoke it
    Not asked yet Requests it
    Denied — tap to allow Explains what the permission is for, then asks again if you agree
    Blocked — tap to open system settings Android will no longer show its dialog, so this opens the page where you can turn it back on
    Not required on this version of Android Nothing — the permission does not exist on your device

    This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead.

    After Setup

    Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

    💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own.

    Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing.

    What’s Next?

    Once connected to a radio, explore:

    New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



    diff --git a/main/it-rIT/user/connections.html b/main/it-rIT/user/connections.html index c8896fb1b6..532b426b89 100644 --- a/main/it-rIT/user/connections.html +++ b/main/it-rIT/user/connections.html @@ -1 +1 @@ - Connessioni | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Italiano
    Meshtastic Docs ↗

    🌐 Italiano — Community translation View in English

    Connessioni

    Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

    Bluetooth (BLE)

    Bluetooth Low Energy is the default and most common connection method on Android.

    Pairing a Device

    1. Ensure your Meshtastic radio is powered on and in pairing mode.
    2. Open the app and navigate to the Connect tab.
    3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
    4. Select your device from the list.
    5. Accept the Bluetooth pairing prompt if shown.

    Scanning for Bluetooth devices, with a discovered radio in the list

    Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

    Transport selector

    💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device.

    Connection Status

    Icon State Descrizione
    🟢 Connesso Active radio link established
    🟡 Connessione in corso Handshake in progress
    🔴 Disconnesso No active connection
    Not configured Nessun dispositivo selezionato

    When connecting, a status indicator shows the current connection state:

    Connecting status

    If no devices are found, the app shows an empty state with instructions:

    No devices found

    Troubleshooting Bluetooth

    • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
    • Connection drops: Move closer to the radio; check for interference.
    • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

    USB Serial

    USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

    Configurazione

    1. Connect your radio via USB cable to your device.
    2. The app will prompt for USB permission — tap Allow.
    3. The connection is established automatically.

    ⚠️ Note: USB connections require OTG support on Android devices.

    TCP/IP (Network)

    Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

    Connecting over the Network

    1. Make sure the radio is on the same local network as your phone/desktop.
    2. On the Connect screen, select Network in the transport selector.
    3. Choose the radio one of two ways:
      • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
      • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
    4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

    💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

    When to Use TCP

    • Radio is on the same local network
    • Testing with a simulated radio
    • Environments where Bluetooth has interference issues

    Reconnection Behavior

    The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

    To disconnect, tap the disconnect button on the Connect screen:

    Disconnect from radio

    Desktop Connections

    On Desktop (Linux/macOS/Windows), the app supports:

    • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
    • USB Serial — primary wired connection method
    • TCP/IP — for network-connected radios

    See Desktop App for platform-specific details and keyboard shortcuts.



    + Connessioni | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Italiano
    Meshtastic Docs ↗

    🌐 Italiano — Community translation View in English

    Connessioni

    Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

    Bluetooth (BLE)

    Bluetooth Low Energy is the default and most common connection method on Android.

    Pairing a Device

    1. Ensure your Meshtastic radio is powered on and in pairing mode.
    2. Open the app and navigate to the Connect tab.
    3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
    4. Select your device from the list.
    5. Accept the Bluetooth pairing prompt if shown.

    Scanning for Bluetooth devices, with a discovered radio in the list

    Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

    Transport selector

    💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range.

    The screen names anything on the app’s side that is blocking a scan, with the fix attached:

    What you see What it means
    A card asking for Nearby devices The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings.
    Bluetooth is off The adapter is disabled — the card opens Bluetooth settings.
    Bluetooth scanning also needs location services Android 11 and older only: the permission is held but the system location toggle is off.
    No card, empty list Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere.

    Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered.

    Connection Status

    Icon State Descrizione
    🟢 Connesso Active radio link established
    🟡 Connessione in corso Handshake in progress
    🔴 Disconnesso No active connection
    Not configured Nessun dispositivo selezionato

    When connecting, a status indicator shows the current connection state:

    Connecting status

    If no devices are found, the app shows an empty state with instructions:

    No devices found

    Troubleshooting Bluetooth

    • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
    • Connection drops: Move closer to the radio; check for interference.
    • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

    USB Serial

    USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

    Configurazione

    1. Connect your radio via USB cable to your device.
    2. The app will prompt for USB permission — tap Allow.
    3. The connection is established automatically.

    ⚠️ Note: USB connections require OTG support on Android devices.

    TCP/IP (Network)

    Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

    Connecting over the Network

    1. Make sure the radio is on the same local network as your phone/desktop.
    2. On the Connect screen, select Network in the transport selector.
    3. Choose the radio one of two ways:
      • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
      • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
    4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

    💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

    When to Use TCP

    • Radio is on the same local network
    • Testing with a simulated radio
    • Environments where Bluetooth has interference issues

    Reconnection Behavior

    The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

    To disconnect, tap the disconnect button on the Connect screen:

    Disconnect from radio

    Desktop Connections

    On Desktop (Linux/macOS/Windows), the app supports:

    • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
    • USB Serial — primary wired connection method
    • TCP/IP — for network-connected radios

    See Desktop App for platform-specific details and keyboard shortcuts.



    diff --git a/main/it-rIT/user/onboarding.html b/main/it-rIT/user/onboarding.html index 127408644d..13d014c173 100644 --- a/main/it-rIT/user/onboarding.html +++ b/main/it-rIT/user/onboarding.html @@ -1 +1 @@ - Come iniziare | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Italiano
    Meshtastic Docs ↗

    🌐 Italiano — Community translation View in English

    Come iniziare

    Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

    First Launch

    When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings.

    Welcome Screen

    The welcome screen introduces Meshtastic and its core capabilities:

    • Off-grid mesh communication
    • No cellular or internet required
    • End-to-end encrypted messaging

    Tap Get Started to proceed through the setup flow.

    Welcome screen

    Permissions

    The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

    Bluetooth Permission

    Bluetooth is the primary connection method between your phone and Meshtastic radio:

    • Bluetooth scanning — discover nearby Meshtastic radios
    • Bluetooth connect — establish and maintain connections with paired radios

    Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

    Location Permission

    ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice.

    Meshtastic also uses your location for:

    • Showing your position on the mesh map
    • Calculating distances to other nodes
    • Sharing your GPS coordinates with other mesh members (if enabled)

    Grant “While using the app” or “Always” depending on your preference:

    • While using the app — position updates only when the app is open
    • Always — enables background position updates for always-on mesh presence

    If denied, Bluetooth scanning will not function and your node will not report a position.

    Notifications Permission

    Notifications alert you to:

    • Incoming messages from channels and direct messages
    • New nodes joining the mesh
    • Low battery on a remote node

    💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

    Critical Alerts Permission

    On supported devices, the app may request permission for critical alerts:

    • These are high-priority notifications that can break through Do Not Disturb mode
    • Useful for emergency mesh alerts or urgent messages
    • You can skip this step if you don’t need breakthrough notifications
    • Configure or revoke later in Android notification settings

    After Setup

    Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

    💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use.

    What’s Next?

    Once connected to a radio, explore:

    New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



    + Come iniziare | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Italiano
    Meshtastic Docs ↗

    🌐 Italiano — Community translation View in English

    Come iniziare

    Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

    First Launch

    When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app.

    Welcome Screen

    The welcome screen introduces Meshtastic and its core capabilities:

    • Off-grid mesh communication
    • No cellular or internet required
    • End-to-end encrypted messaging

    Tap Get Started to proceed through the setup flow.

    Welcome screen

    Permissions

    The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

    Bluetooth Permission

    Bluetooth is the primary connection method between your phone and Meshtastic radio:

    • Bluetooth scanning — discover nearby Meshtastic radios
    • Bluetooth connect — establish and maintain connections with paired radios

    Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

    Location Permission

    ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio.

    Meshtastic also uses your location for:

    • Showing your position on the mesh map
    • Calculating distances to other nodes
    • Sharing your GPS coordinates with other mesh members (if enabled)

    Grant “While using the app” or “Always” depending on your preference:

    • While using the app — position updates only when the app is open
    • Always — enables background position updates for always-on mesh presence

    Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind.

    Notifications Permission

    Notifications alert you to:

    • Incoming messages from channels and direct messages
    • New nodes joining the mesh
    • Low battery on a remote node

    💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

    Critical Alerts Permission

    On supported devices, the app may request permission for critical alerts:

    • These are high-priority notifications that can break through Do Not Disturb mode
    • Useful for emergency mesh alerts or urgent messages
    • You can skip this step if you don’t need breakthrough notifications
    • Configure or revoke later in Android notification settings

    Reviewing permissions later

    Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time:

    State What tapping the row does
    Allowed Opens the system page, so you can review or revoke it
    Not asked yet Requests it
    Denied — tap to allow Explains what the permission is for, then asks again if you agree
    Blocked — tap to open system settings Android will no longer show its dialog, so this opens the page where you can turn it back on
    Not required on this version of Android Nothing — the permission does not exist on your device

    This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead.

    After Setup

    Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

    💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own.

    Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing.

    What’s Next?

    Once connected to a radio, explore:

    New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



    diff --git a/main/iw-rIL/user/connections.html b/main/iw-rIL/user/connections.html index d5550d8134..c394cded70 100644 --- a/main/iw-rIL/user/connections.html +++ b/main/iw-rIL/user/connections.html @@ -1 +1 @@ - Connections | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 עברית
    Meshtastic Docs ↗

    🌐 עברית — Community translation View in English

    Connections

    Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

    Bluetooth (BLE)

    Bluetooth Low Energy is the default and most common connection method on Android.

    Pairing a Device

    1. Ensure your Meshtastic radio is powered on and in pairing mode.
    2. Open the app and navigate to the Connect tab.
    3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
    4. Select your device from the list.
    5. Accept the Bluetooth pairing prompt if shown.

    Scanning for Bluetooth devices, with a discovered radio in the list

    Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

    Transport selector

    💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device.

    Connection Status

    Icon State תיאור
    🟢 Connected Active radio link established
    🟡 Connecting Handshake in progress
    🔴 מנותק No active connection
    Not configured No device selected

    When connecting, a status indicator shows the current connection state:

    Connecting status

    If no devices are found, the app shows an empty state with instructions:

    No devices found

    Troubleshooting Bluetooth

    • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
    • Connection drops: Move closer to the radio; check for interference.
    • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

    USB Serial

    USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

    Setup

    1. Connect your radio via USB cable to your device.
    2. The app will prompt for USB permission — tap Allow.
    3. The connection is established automatically.

    ⚠️ Note: USB connections require OTG support on Android devices.

    TCP/IP (Network)

    Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

    Connecting over the Network

    1. Make sure the radio is on the same local network as your phone/desktop.
    2. On the Connect screen, select Network in the transport selector.
    3. Choose the radio one of two ways:
      • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
      • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
    4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

    💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

    When to Use TCP

    • Radio is on the same local network
    • Testing with a simulated radio
    • Environments where Bluetooth has interference issues

    Reconnection Behavior

    The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

    To disconnect, tap the disconnect button on the Connect screen:

    Disconnect from radio

    Desktop Connections

    On Desktop (Linux/macOS/Windows), the app supports:

    • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
    • USB Serial — primary wired connection method
    • TCP/IP — for network-connected radios

    See Desktop App for platform-specific details and keyboard shortcuts.



    + Connections | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 עברית
    Meshtastic Docs ↗

    🌐 עברית — Community translation View in English

    Connections

    Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

    Bluetooth (BLE)

    Bluetooth Low Energy is the default and most common connection method on Android.

    Pairing a Device

    1. Ensure your Meshtastic radio is powered on and in pairing mode.
    2. Open the app and navigate to the Connect tab.
    3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
    4. Select your device from the list.
    5. Accept the Bluetooth pairing prompt if shown.

    Scanning for Bluetooth devices, with a discovered radio in the list

    Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

    Transport selector

    💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range.

    The screen names anything on the app’s side that is blocking a scan, with the fix attached:

    What you see What it means
    A card asking for Nearby devices The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings.
    Bluetooth is off The adapter is disabled — the card opens Bluetooth settings.
    Bluetooth scanning also needs location services Android 11 and older only: the permission is held but the system location toggle is off.
    No card, empty list Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere.

    Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered.

    Connection Status

    Icon State תיאור
    🟢 Connected Active radio link established
    🟡 Connecting Handshake in progress
    🔴 מנותק No active connection
    Not configured No device selected

    When connecting, a status indicator shows the current connection state:

    Connecting status

    If no devices are found, the app shows an empty state with instructions:

    No devices found

    Troubleshooting Bluetooth

    • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
    • Connection drops: Move closer to the radio; check for interference.
    • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

    USB Serial

    USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

    Setup

    1. Connect your radio via USB cable to your device.
    2. The app will prompt for USB permission — tap Allow.
    3. The connection is established automatically.

    ⚠️ Note: USB connections require OTG support on Android devices.

    TCP/IP (Network)

    Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

    Connecting over the Network

    1. Make sure the radio is on the same local network as your phone/desktop.
    2. On the Connect screen, select Network in the transport selector.
    3. Choose the radio one of two ways:
      • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
      • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
    4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

    💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

    When to Use TCP

    • Radio is on the same local network
    • Testing with a simulated radio
    • Environments where Bluetooth has interference issues

    Reconnection Behavior

    The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

    To disconnect, tap the disconnect button on the Connect screen:

    Disconnect from radio

    Desktop Connections

    On Desktop (Linux/macOS/Windows), the app supports:

    • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
    • USB Serial — primary wired connection method
    • TCP/IP — for network-connected radios

    See Desktop App for platform-specific details and keyboard shortcuts.



    diff --git a/main/iw-rIL/user/onboarding.html b/main/iw-rIL/user/onboarding.html index f85748fdf0..45360bc3e6 100644 --- a/main/iw-rIL/user/onboarding.html +++ b/main/iw-rIL/user/onboarding.html @@ -1 +1 @@ - Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 עברית
    Meshtastic Docs ↗

    🌐 עברית — Community translation View in English

    Getting Started

    Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

    First Launch

    When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings.

    Welcome Screen

    The welcome screen introduces Meshtastic and its core capabilities:

    • Off-grid mesh communication
    • No cellular or internet required
    • End-to-end encrypted messaging

    Tap Get Started to proceed through the setup flow.

    Welcome screen

    Permissions

    The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

    Bluetooth Permission

    Bluetooth is the primary connection method between your phone and Meshtastic radio:

    • Bluetooth scanning — discover nearby Meshtastic radios
    • Bluetooth connect — establish and maintain connections with paired radios

    Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

    Location Permission

    ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice.

    Meshtastic also uses your location for:

    • Showing your position on the mesh map
    • Calculating distances to other nodes
    • Sharing your GPS coordinates with other mesh members (if enabled)

    Grant “While using the app” or “Always” depending on your preference:

    • While using the app — position updates only when the app is open
    • Always — enables background position updates for always-on mesh presence

    If denied, Bluetooth scanning will not function and your node will not report a position.

    Notifications Permission

    Notifications alert you to:

    • Incoming messages from channels and direct messages
    • New nodes joining the mesh
    • Low battery on a remote node

    💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

    Critical Alerts Permission

    On supported devices, the app may request permission for critical alerts:

    • These are high-priority notifications that can break through Do Not Disturb mode
    • Useful for emergency mesh alerts or urgent messages
    • You can skip this step if you don’t need breakthrough notifications
    • Configure or revoke later in Android notification settings

    After Setup

    Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

    💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use.

    What’s Next?

    Once connected to a radio, explore:

    New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



    + Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 עברית
    Meshtastic Docs ↗

    🌐 עברית — Community translation View in English

    Getting Started

    Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

    First Launch

    When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app.

    Welcome Screen

    The welcome screen introduces Meshtastic and its core capabilities:

    • Off-grid mesh communication
    • No cellular or internet required
    • End-to-end encrypted messaging

    Tap Get Started to proceed through the setup flow.

    Welcome screen

    Permissions

    The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

    Bluetooth Permission

    Bluetooth is the primary connection method between your phone and Meshtastic radio:

    • Bluetooth scanning — discover nearby Meshtastic radios
    • Bluetooth connect — establish and maintain connections with paired radios

    Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

    Location Permission

    ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio.

    Meshtastic also uses your location for:

    • Showing your position on the mesh map
    • Calculating distances to other nodes
    • Sharing your GPS coordinates with other mesh members (if enabled)

    Grant “While using the app” or “Always” depending on your preference:

    • While using the app — position updates only when the app is open
    • Always — enables background position updates for always-on mesh presence

    Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind.

    Notifications Permission

    Notifications alert you to:

    • Incoming messages from channels and direct messages
    • New nodes joining the mesh
    • Low battery on a remote node

    💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

    Critical Alerts Permission

    On supported devices, the app may request permission for critical alerts:

    • These are high-priority notifications that can break through Do Not Disturb mode
    • Useful for emergency mesh alerts or urgent messages
    • You can skip this step if you don’t need breakthrough notifications
    • Configure or revoke later in Android notification settings

    Reviewing permissions later

    Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time:

    State What tapping the row does
    Allowed Opens the system page, so you can review or revoke it
    Not asked yet Requests it
    Denied — tap to allow Explains what the permission is for, then asks again if you agree
    Blocked — tap to open system settings Android will no longer show its dialog, so this opens the page where you can turn it back on
    Not required on this version of Android Nothing — the permission does not exist on your device

    This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead.

    After Setup

    Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

    💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own.

    Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing.

    What’s Next?

    Once connected to a radio, explore:

    New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



    diff --git a/main/ja-rJP/user/connections.html b/main/ja-rJP/user/connections.html index 9a26d18a97..4b8455e087 100644 --- a/main/ja-rJP/user/connections.html +++ b/main/ja-rJP/user/connections.html @@ -1 +1 @@ - コネクション | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 日本語
    Meshtastic Docs ↗

    🌐 日本語 — Community translation View in English

    コネクション

    Meshtastic は、スマートフォン/デスクトップと無線機ノード間の通信に複数の接続方式をサポートしています。

    Bluetooth(BLE)

    Bluetooth Low Energy は、Android で標準的かつ最も一般的な接続方法です。

    デバイスをペアリングする

    1. Meshtastic 無線機の電源が入っていて、ペアリングモードになっていることを確認します。
    2. アプリを開き、「接続」タブに移動します。
    3. Bluetooth デバイスをスキャン」をタップすると、近くの Meshtastic 無線機が表示されます。
    4. リストからデバイスを選択します。
    5. Bluetooth のペアリング確認が表示されたら承認します。

    Bluetooth デバイスをスキャンし、見つかった無線機がリストに表示されている様子

    接続カードの下にあるセグメント化されたボタン列(接続方式のセレクター)を使って、Bluetooth・ネットワーク・USB の接続方式を切り替えます(一度に 1 つが有効になります):

    接続方式のセレクター

    💡 ヒント: デバイスが表示されない場合は、Bluetooth と位置情報の権限が許可されているか、また無線機が別のデバイスにすでに接続されていないかを確認してください。

    接続ステータス

    アイコン 状態 説明
    🟢 接続済 無線リンクが確立しています
    🟡 接続中 ハンドシェイク中
    🔴 切断 接続がありません
    未設定 デバイスが選択されていません

    接続時には、ステータスインジケーターが現在の接続状態を表示します:

    接続中のステータス

    デバイスが見つからない場合、アプリは操作手順とともに空の状態を表示します:

    デバイスが見つからない状態

    Bluetooth のトラブルシューティング

    • デバイスが見つからない: Bluetooth をオフ/オンし、位置情報が有効になっていることを確認します。
    • 接続が切れる: 無線機に近づき、電波干渉がないか確認します。
    • ペアリングが拒否される: Android の Bluetooth 設定でデバイスの登録を解除し、やり直します。

    USB シリアル

    USB 接続は有線での代替手段で、デスクトップや Bluetooth が使えない場合に便利です。

    セットアップ

    1. USB ケーブルで無線機をデバイスに接続します。
    2. アプリが USB の使用許可を求めるので、「許可」をタップします。
    3. 接続が自動的に確立されます。

    ⚠️ 注意: USB 接続には、Android デバイスの OTG 対応が必要です。

    TCP/IP(ネットワーク)

    一部の Meshtastic 無線機は WiFi/Ethernet 接続に対応しており、ローカルネットワーク経由の TCP 接続が可能です。 まず、無線機自身の WiFi 設定(ファームウェアのウェブインターフェースや別の接続方法を使用)で無線機をネットワークに接続し、その後アプリから接続します。

    ネットワーク経由で接続する

    1. 無線機がスマートフォン/デスクトップと同じローカルネットワーク上にあることを確認します。
    2. 接続画面で、接続方式のセレクターから「ネットワーク」を選択します。
    3. 無線機は次の 2 通りの方法で選べます:
      • ネットワークデバイスをスキャン:これをオンにすると、ローカルネットワーク上で自身を告知している無線機(mDNS / _meshtastic._tcp)を自動的に探索します。 見つかったデバイスがリストに表示されるので、タップして接続します。
      • デバイスを手動で追加…:無線機の IP アドレス(またはホスト名)とポート(既定:4403)を入力します。
    4. 以前使用したネットワークアドレスは「最近のネットワークデバイス」に記憶され、すばやく再接続できます(長押しで削除できます)。

    💡 ヒント: ネットワーク探索は mDNS を使用するため、両方のデバイスが同じサブネット上にある場合にのみ機能します。 Android 17 以降では、スキャンにローカルネットワークの権限が必要です。探索で何も見つからない場合は、IP アドレスでデバイスを手動追加してください。

    TCP を使う場面

    • 無線機が同じローカルネットワーク上にある
    • シミュレートされた無線機でテストする
    • Bluetooth の電波干渉が問題になる環境

    再接続の動作

    アプリは起動時に「最後に選択したデバイス」へ再接続します。 接続方式は、接続画面からいつでも切り替えられます。

    切断するには、接続画面の切断ボタンをタップします:

    無線機から切断

    デスクトップでの接続

    デスクトップ(Linux/macOS/Windows)では、アプリは次の接続方式に対応しています:

    • Bluetooth(BLE): Kable ライブラリを使用。macOS、Linux、Windows で動作します
    • USB シリアル: 主要な有線接続方法
    • TCP/IP: ネットワーク接続された無線機向け

    プラットフォームごとの詳細やキーボードショートカットについては、デスクトップアプリ を参照してください。

    関連トピック



    + コネクション | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 日本語
    Meshtastic Docs ↗

    🌐 日本語 — Community translation View in English

    コネクション

    Meshtastic は、スマートフォン/デスクトップと無線機ノード間の通信に複数の接続方式をサポートしています。

    Bluetooth(BLE)

    Bluetooth Low Energy は、Android で標準的かつ最も一般的な接続方法です。

    デバイスをペアリングする

    1. Meshtastic 無線機の電源が入っていて、ペアリングモードになっていることを確認します。
    2. アプリを開き、「接続」タブに移動します。
    3. Bluetooth デバイスをスキャン」をタップすると、近くの Meshtastic 無線機が表示されます。
    4. リストからデバイスを選択します。
    5. Bluetooth のペアリング確認が表示されたら承認します。

    Bluetooth デバイスをスキャンし、見つかった無線機がリストに表示されている様子

    接続カードの下にあるセグメント化されたボタン列(接続方式のセレクター)を使って、Bluetooth・ネットワーク・USB の接続方式を切り替えます(一度に 1 つが有効になります):

    接続方式のセレクター

    💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range.

    The screen names anything on the app’s side that is blocking a scan, with the fix attached:

    What you see 意味
    A card asking for Nearby devices The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings.
    Bluetooth is off The adapter is disabled — the card opens Bluetooth settings.
    Bluetooth scanning also needs location services Android 11 and older only: the permission is held but the system location toggle is off.
    No card, empty list Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere.

    Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered.

    接続ステータス

    アイコン 状態 説明
    🟢 接続済 無線リンクが確立しています
    🟡 接続中 ハンドシェイク中
    🔴 切断 接続がありません
    未設定 デバイスが選択されていません

    接続時には、ステータスインジケーターが現在の接続状態を表示します:

    接続中のステータス

    デバイスが見つからない場合、アプリは操作手順とともに空の状態を表示します:

    デバイスが見つからない状態

    Bluetooth のトラブルシューティング

    • デバイスが見つからない: Bluetooth をオフ/オンし、位置情報が有効になっていることを確認します。
    • 接続が切れる: 無線機に近づき、電波干渉がないか確認します。
    • ペアリングが拒否される: Android の Bluetooth 設定でデバイスの登録を解除し、やり直します。

    USB シリアル

    USB 接続は有線での代替手段で、デスクトップや Bluetooth が使えない場合に便利です。

    セットアップ

    1. USB ケーブルで無線機をデバイスに接続します。
    2. アプリが USB の使用許可を求めるので、「許可」をタップします。
    3. 接続が自動的に確立されます。

    ⚠️ 注意: USB 接続には、Android デバイスの OTG 対応が必要です。

    TCP/IP(ネットワーク)

    一部の Meshtastic 無線機は WiFi/Ethernet 接続に対応しており、ローカルネットワーク経由の TCP 接続が可能です。 まず、無線機自身の WiFi 設定(ファームウェアのウェブインターフェースや別の接続方法を使用)で無線機をネットワークに接続し、その後アプリから接続します。

    ネットワーク経由で接続する

    1. 無線機がスマートフォン/デスクトップと同じローカルネットワーク上にあることを確認します。
    2. 接続画面で、接続方式のセレクターから「ネットワーク」を選択します。
    3. 無線機は次の 2 通りの方法で選べます:
      • ネットワークデバイスをスキャン:これをオンにすると、ローカルネットワーク上で自身を告知している無線機(mDNS / _meshtastic._tcp)を自動的に探索します。 見つかったデバイスがリストに表示されるので、タップして接続します。
      • デバイスを手動で追加…:無線機の IP アドレス(またはホスト名)とポート(既定:4403)を入力します。
    4. 以前使用したネットワークアドレスは「最近のネットワークデバイス」に記憶され、すばやく再接続できます(長押しで削除できます)。

    💡 ヒント: ネットワーク探索は mDNS を使用するため、両方のデバイスが同じサブネット上にある場合にのみ機能します。 Android 17 以降では、スキャンにローカルネットワークの権限が必要です。探索で何も見つからない場合は、IP アドレスでデバイスを手動追加してください。

    TCP を使う場面

    • 無線機が同じローカルネットワーク上にある
    • シミュレートされた無線機でテストする
    • Bluetooth の電波干渉が問題になる環境

    再接続の動作

    アプリは起動時に「最後に選択したデバイス」へ再接続します。 接続方式は、接続画面からいつでも切り替えられます。

    切断するには、接続画面の切断ボタンをタップします:

    無線機から切断

    デスクトップでの接続

    デスクトップ(Linux/macOS/Windows)では、アプリは次の接続方式に対応しています:

    • Bluetooth(BLE): Kable ライブラリを使用。macOS、Linux、Windows で動作します
    • USB シリアル: 主要な有線接続方法
    • TCP/IP: ネットワーク接続された無線機向け

    プラットフォームごとの詳細やキーボードショートカットについては、デスクトップアプリ を参照してください。

    関連トピック



    diff --git a/main/ja-rJP/user/onboarding.html b/main/ja-rJP/user/onboarding.html index f2da2d7f92..8940b3e81a 100644 --- a/main/ja-rJP/user/onboarding.html +++ b/main/ja-rJP/user/onboarding.html @@ -1 +1 @@ - はじめに | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 日本語
    Meshtastic Docs ↗

    🌐 日本語 — Community translation View in English

    はじめに

    Meshtastic へようこそ! このガイドでは、Meshtastic Android アプリの初期設定を順を追って説明します。

    初回起動

    アプリを初めて開くと、必要な権限と設定を構成するための導入フローが案内されます。 各ステップは順番に完了することも、スキップして後で Android の設定で権限を構成することもできます。

    ようこそ画面

    ようこそ画面では、Meshtastic とその主な機能を紹介します:

    • オフグリッドのメッシュ通信
    • 携帯電話やインターネットは不要
    • エンドツーエンドで暗号化されたメッセージング

    開始するをタップして、セットアップフローを進めます。

    ようこそ画面

    権限

    アプリはセットアップ中にいくつかの権限を要求します。 それぞれに特定の目的があり、一部は主要な機能に必要です。

    Bluetooth の権限

    Bluetooth は、スマートフォンと Meshtastic 無線機の主な接続方法です:

    • Bluetooth スキャン:近くの Meshtastic 無線機を検出します
    • Bluetooth 接続:ペアリング済みの無線機との接続を確立して維持します

    プロンプトが表示されたら、両方の権限を許可してください。 Bluetooth がない場合は、代わりに USB または TCP 接続を使用する必要があります。

    位置情報の権限

    ⚠️ なぜ Bluetooth に位置情報が必要なのですか? Android では、近くの Bluetooth Low Energy デバイスを検出するために位置情報の権限が必要です。 これは Android システムの要件であり、Meshtastic 固有の仕様ではありません。

    Meshtastic は、次の目的でも位置情報を使用します:

    • メッシュマップ上に自分の位置を表示する
    • 他のノードまでの距離を計算する
    • 他のメッシュメンバーと GPS 座標を共有する(有効な場合)

    お好みに応じて、**「アプリの使用中のみ」または「常に許可」**を選択してください:

    • アプリの使用中のみ:アプリが開いているときだけ位置情報を更新します
    • 常に許可:常時メッシュに存在するために、バックグラウンドでの位置情報更新を有効にします

    拒否すると、Bluetooth スキャンが機能せず、ノードは位置情報を報告しません。

    通知の権限

    通知は、次のことをお知らせします:

    • チャンネルおよびダイレクトメッセージの受信
    • メッシュに参加する新しいノード
    • リモートノードのバッテリー低下

    💡 ヒント: 通知の設定は、後で Android のシステム設定で細かく調整できます。アプリはカテゴリごとに個別の通知チャンネルを作成する(さらに、バックグラウンドサービスなどの内部用のものもいくつか作成する)ため、個別に有効化したり消音したりできます。

    重要なアラートの権限

    対応デバイスでは、アプリが重要なアラートの権限を要求することがあります:

    • これらは、サイレントモードを突破できる高優先度の通知です
    • 緊急のメッシュアラートや至急のメッセージに役立ちます
    • 突破通知が不要な場合は、このステップをスキップできます
    • 後で Android の通知設定で構成または取り消しができます

    セットアップ後

    権限を許可すると、アプリはメイン画面に移行します。 最初に行うべきことは、Meshtastic 無線機への接続です。詳しい手順は接続を参照してください。

    💡 ヒント: セットアップ中に権限をスキップした場合は、後で**「Android 設定 → アプリ → Meshtastic → 権限」**から許可できます。 不足している権限が、使おうとする機能を妨げる場合は、アプリが再度確認を求めます。

    次のステップ

    無線機に接続したら、次を確認してみましょう:

    Meshtastic は初めてですか? meshtastic.org の入門ガイドでは、ハードウェアの選択、無線機の初期設定、最初のメッシュのセットアップについて説明しています。



    + はじめに | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 日本語
    Meshtastic Docs ↗

    🌐 日本語 — Community translation View in English

    はじめに

    Meshtastic へようこそ! このガイドでは、Meshtastic Android アプリの初期設定を順を追って説明します。

    初回起動

    アプリを初めて開くと、必要な権限と設定を構成するための導入フローが案内されます。 Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app.

    ようこそ画面

    ようこそ画面では、Meshtastic とその主な機能を紹介します:

    • オフグリッドのメッシュ通信
    • 携帯電話やインターネットは不要
    • エンドツーエンドで暗号化されたメッセージング

    開始するをタップして、セットアップフローを進めます。

    ようこそ画面

    権限

    アプリはセットアップ中にいくつかの権限を要求します。 それぞれに特定の目的があり、一部は主要な機能に必要です。

    Bluetooth の権限

    Bluetooth は、スマートフォンと Meshtastic 無線機の主な接続方法です:

    • Bluetooth スキャン:近くの Meshtastic 無線機を検出します
    • Bluetooth 接続:ペアリング済みの無線機との接続を確立して維持します

    プロンプトが表示されたら、両方の権限を許可してください。 Bluetooth がない場合は、代わりに USB または TCP 接続を使用する必要があります。

    位置情報の権限

    ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio.

    Meshtastic は、次の目的でも位置情報を使用します:

    • メッシュマップ上に自分の位置を表示する
    • 他のノードまでの距離を計算する
    • 他のメッシュメンバーと GPS 座標を共有する(有効な場合)

    お好みに応じて、**「アプリの使用中のみ」または「常に許可」**を選択してください:

    • アプリの使用中のみ:アプリが開いているときだけ位置情報を更新します
    • 常に許可:常時メッシュに存在するために、バックグラウンドでの位置情報更新を有効にします

    Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind.

    通知の権限

    通知は、次のことをお知らせします:

    • チャンネルおよびダイレクトメッセージの受信
    • メッシュに参加する新しいノード
    • リモートノードのバッテリー低下

    💡 ヒント: 通知の設定は、後で Android のシステム設定で細かく調整できます。アプリはカテゴリごとに個別の通知チャンネルを作成する(さらに、バックグラウンドサービスなどの内部用のものもいくつか作成する)ため、個別に有効化したり消音したりできます。

    重要なアラートの権限

    対応デバイスでは、アプリが重要なアラートの権限を要求することがあります:

    • これらは、サイレントモードを突破できる高優先度の通知です
    • 緊急のメッシュアラートや至急のメッセージに役立ちます
    • 突破通知が不要な場合は、このステップをスキップできます
    • 後で Android の通知設定で構成または取り消しができます

    Reviewing permissions later

    Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time:

    状態 What tapping the row does
    Allowed Opens the system page, so you can review or revoke it
    Not asked yet Requests it
    Denied — tap to allow Explains what the permission is for, then asks again if you agree
    Blocked — tap to open system settings Android will no longer show its dialog, so this opens the page where you can turn it back on
    Not required on this version of Android Nothing — the permission does not exist on your device

    This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead.

    セットアップ後

    権限を許可すると、アプリはメイン画面に移行します。 最初に行うべきことは、Meshtastic 無線機への接続です。詳しい手順は接続を参照してください。

    💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own.

    Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing.

    次のステップ

    無線機に接続したら、次を確認してみましょう:

    Meshtastic は初めてですか? meshtastic.org の入門ガイドでは、ハードウェアの選択、無線機の初期設定、最初のメッシュのセットアップについて説明しています。



    diff --git a/main/ko-rKR/user/connections.html b/main/ko-rKR/user/connections.html index bb79807ad4..9c37d8ab05 100644 --- a/main/ko-rKR/user/connections.html +++ b/main/ko-rKR/user/connections.html @@ -1 +1 @@ - Connections | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 한국어
    Meshtastic Docs ↗

    🌐 한국어 — Community translation View in English

    Connections

    Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

    Bluetooth (BLE)

    Bluetooth Low Energy is the default and most common connection method on Android.

    Pairing a Device

    1. Ensure your Meshtastic radio is powered on and in pairing mode.
    2. Open the app and navigate to the Connect tab.
    3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
    4. Select your device from the list.
    5. Accept the Bluetooth pairing prompt if shown.

    Scanning for Bluetooth devices, with a discovered radio in the list

    Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

    Transport selector

    💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device.

    Connection Status

    Icon State 설명
    🟢 연결됨 Active radio link established
    🟡 연결 중 Handshake in progress
    🔴 연결 끊김 No active connection
    Not configured No device selected

    When connecting, a status indicator shows the current connection state:

    Connecting status

    If no devices are found, the app shows an empty state with instructions:

    No devices found

    Troubleshooting Bluetooth

    • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
    • Connection drops: Move closer to the radio; check for interference.
    • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

    USB Serial

    USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

    Setup

    1. Connect your radio via USB cable to your device.
    2. The app will prompt for USB permission — tap Allow.
    3. The connection is established automatically.

    ⚠️ Note: USB connections require OTG support on Android devices.

    TCP/IP (Network)

    Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

    Connecting over the Network

    1. Make sure the radio is on the same local network as your phone/desktop.
    2. On the Connect screen, select Network in the transport selector.
    3. Choose the radio one of two ways:
      • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
      • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
    4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

    💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

    When to Use TCP

    • Radio is on the same local network
    • Testing with a simulated radio
    • Environments where Bluetooth has interference issues

    Reconnection Behavior

    The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

    To disconnect, tap the disconnect button on the Connect screen:

    Disconnect from radio

    Desktop Connections

    On Desktop (Linux/macOS/Windows), the app supports:

    • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
    • USB Serial — primary wired connection method
    • TCP/IP — for network-connected radios

    See Desktop App for platform-specific details and keyboard shortcuts.



    + Connections | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 한국어
    Meshtastic Docs ↗

    🌐 한국어 — Community translation View in English

    Connections

    Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

    Bluetooth (BLE)

    Bluetooth Low Energy is the default and most common connection method on Android.

    Pairing a Device

    1. Ensure your Meshtastic radio is powered on and in pairing mode.
    2. Open the app and navigate to the Connect tab.
    3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
    4. Select your device from the list.
    5. Accept the Bluetooth pairing prompt if shown.

    Scanning for Bluetooth devices, with a discovered radio in the list

    Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

    Transport selector

    💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range.

    The screen names anything on the app’s side that is blocking a scan, with the fix attached:

    What you see What it means
    A card asking for Nearby devices The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings.
    Bluetooth is off The adapter is disabled — the card opens Bluetooth settings.
    Bluetooth scanning also needs location services Android 11 and older only: the permission is held but the system location toggle is off.
    No card, empty list Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere.

    Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered.

    Connection Status

    Icon State 설명
    🟢 연결됨 Active radio link established
    🟡 연결 중 Handshake in progress
    🔴 연결 끊김 No active connection
    Not configured No device selected

    When connecting, a status indicator shows the current connection state:

    Connecting status

    If no devices are found, the app shows an empty state with instructions:

    No devices found

    Troubleshooting Bluetooth

    • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
    • Connection drops: Move closer to the radio; check for interference.
    • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

    USB Serial

    USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

    Setup

    1. Connect your radio via USB cable to your device.
    2. The app will prompt for USB permission — tap Allow.
    3. The connection is established automatically.

    ⚠️ Note: USB connections require OTG support on Android devices.

    TCP/IP (Network)

    Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

    Connecting over the Network

    1. Make sure the radio is on the same local network as your phone/desktop.
    2. On the Connect screen, select Network in the transport selector.
    3. Choose the radio one of two ways:
      • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
      • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
    4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

    💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

    When to Use TCP

    • Radio is on the same local network
    • Testing with a simulated radio
    • Environments where Bluetooth has interference issues

    Reconnection Behavior

    The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

    To disconnect, tap the disconnect button on the Connect screen:

    Disconnect from radio

    Desktop Connections

    On Desktop (Linux/macOS/Windows), the app supports:

    • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
    • USB Serial — primary wired connection method
    • TCP/IP — for network-connected radios

    See Desktop App for platform-specific details and keyboard shortcuts.



    diff --git a/main/ko-rKR/user/onboarding.html b/main/ko-rKR/user/onboarding.html index 4fdaf7a3c2..23ed2e9104 100644 --- a/main/ko-rKR/user/onboarding.html +++ b/main/ko-rKR/user/onboarding.html @@ -1 +1 @@ - Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 한국어
    Meshtastic Docs ↗

    🌐 한국어 — Community translation View in English

    Getting Started

    Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

    First Launch

    When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings.

    Welcome Screen

    The welcome screen introduces Meshtastic and its core capabilities:

    • Off-grid mesh communication
    • No cellular or internet required
    • End-to-end encrypted messaging

    Tap Get Started to proceed through the setup flow.

    Welcome screen

    Permissions

    The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

    Bluetooth Permission

    Bluetooth is the primary connection method between your phone and Meshtastic radio:

    • Bluetooth scanning — discover nearby Meshtastic radios
    • Bluetooth connect — establish and maintain connections with paired radios

    Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

    Location Permission

    ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice.

    Meshtastic also uses your location for:

    • Showing your position on the mesh map
    • Calculating distances to other nodes
    • Sharing your GPS coordinates with other mesh members (if enabled)

    Grant “While using the app” or “Always” depending on your preference:

    • While using the app — position updates only when the app is open
    • Always — enables background position updates for always-on mesh presence

    If denied, Bluetooth scanning will not function and your node will not report a position.

    Notifications Permission

    Notifications alert you to:

    • Incoming messages from channels and direct messages
    • New nodes joining the mesh
    • Low battery on a remote node

    💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

    Critical Alerts Permission

    On supported devices, the app may request permission for critical alerts:

    • These are high-priority notifications that can break through Do Not Disturb mode
    • Useful for emergency mesh alerts or urgent messages
    • You can skip this step if you don’t need breakthrough notifications
    • Configure or revoke later in Android notification settings

    After Setup

    Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

    💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use.

    What’s Next?

    Once connected to a radio, explore:

    New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



    + Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 한국어
    Meshtastic Docs ↗

    🌐 한국어 — Community translation View in English

    Getting Started

    Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

    First Launch

    When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app.

    Welcome Screen

    The welcome screen introduces Meshtastic and its core capabilities:

    • Off-grid mesh communication
    • No cellular or internet required
    • End-to-end encrypted messaging

    Tap Get Started to proceed through the setup flow.

    Welcome screen

    Permissions

    The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

    Bluetooth Permission

    Bluetooth is the primary connection method between your phone and Meshtastic radio:

    • Bluetooth scanning — discover nearby Meshtastic radios
    • Bluetooth connect — establish and maintain connections with paired radios

    Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

    Location Permission

    ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio.

    Meshtastic also uses your location for:

    • Showing your position on the mesh map
    • Calculating distances to other nodes
    • Sharing your GPS coordinates with other mesh members (if enabled)

    Grant “While using the app” or “Always” depending on your preference:

    • While using the app — position updates only when the app is open
    • Always — enables background position updates for always-on mesh presence

    Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind.

    Notifications Permission

    Notifications alert you to:

    • Incoming messages from channels and direct messages
    • New nodes joining the mesh
    • Low battery on a remote node

    💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

    Critical Alerts Permission

    On supported devices, the app may request permission for critical alerts:

    • These are high-priority notifications that can break through Do Not Disturb mode
    • Useful for emergency mesh alerts or urgent messages
    • You can skip this step if you don’t need breakthrough notifications
    • Configure or revoke later in Android notification settings

    Reviewing permissions later

    Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time:

    State What tapping the row does
    Allowed Opens the system page, so you can review or revoke it
    Not asked yet Requests it
    Denied — tap to allow Explains what the permission is for, then asks again if you agree
    Blocked — tap to open system settings Android will no longer show its dialog, so this opens the page where you can turn it back on
    Not required on this version of Android Nothing — the permission does not exist on your device

    This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead.

    After Setup

    Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

    💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own.

    Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing.

    What’s Next?

    Once connected to a radio, explore:

    New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



    diff --git a/main/lt-rLT/user/connections.html b/main/lt-rLT/user/connections.html index bb4e45da8b..325675f71a 100644 --- a/main/lt-rLT/user/connections.html +++ b/main/lt-rLT/user/connections.html @@ -1 +1 @@ - Connections | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Lietuvių
    Meshtastic Docs ↗

    🌐 Lietuvių — Community translation View in English

    Connections

    Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

    Bluetooth (BLE)

    Bluetooth Low Energy is the default and most common connection method on Android.

    Pairing a Device

    1. Ensure your Meshtastic radio is powered on and in pairing mode.
    2. Open the app and navigate to the Connect tab.
    3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
    4. Select your device from the list.
    5. Accept the Bluetooth pairing prompt if shown.

    Scanning for Bluetooth devices, with a discovered radio in the list

    Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

    Transport selector

    💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device.

    Connection Status

    Icon State Aprašymas
    🟢 Connected Active radio link established
    🟡 Connecting Handshake in progress
    🔴 Atsijungta No active connection
    Not configured No device selected

    When connecting, a status indicator shows the current connection state:

    Connecting status

    If no devices are found, the app shows an empty state with instructions:

    No devices found

    Troubleshooting Bluetooth

    • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
    • Connection drops: Move closer to the radio; check for interference.
    • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

    USB Serial

    USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

    Setup

    1. Connect your radio via USB cable to your device.
    2. The app will prompt for USB permission — tap Allow.
    3. The connection is established automatically.

    ⚠️ Note: USB connections require OTG support on Android devices.

    TCP/IP (Network)

    Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

    Connecting over the Network

    1. Make sure the radio is on the same local network as your phone/desktop.
    2. On the Connect screen, select Network in the transport selector.
    3. Choose the radio one of two ways:
      • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
      • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
    4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

    💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

    When to Use TCP

    • Radio is on the same local network
    • Testing with a simulated radio
    • Environments where Bluetooth has interference issues

    Reconnection Behavior

    The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

    To disconnect, tap the disconnect button on the Connect screen:

    Disconnect from radio

    Desktop Connections

    On Desktop (Linux/macOS/Windows), the app supports:

    • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
    • USB Serial — primary wired connection method
    • TCP/IP — for network-connected radios

    See Desktop App for platform-specific details and keyboard shortcuts.



    + Connections | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Lietuvių
    Meshtastic Docs ↗

    🌐 Lietuvių — Community translation View in English

    Connections

    Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

    Bluetooth (BLE)

    Bluetooth Low Energy is the default and most common connection method on Android.

    Pairing a Device

    1. Ensure your Meshtastic radio is powered on and in pairing mode.
    2. Open the app and navigate to the Connect tab.
    3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
    4. Select your device from the list.
    5. Accept the Bluetooth pairing prompt if shown.

    Scanning for Bluetooth devices, with a discovered radio in the list

    Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

    Transport selector

    💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range.

    The screen names anything on the app’s side that is blocking a scan, with the fix attached:

    What you see What it means
    A card asking for Nearby devices The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings.
    Bluetooth is off The adapter is disabled — the card opens Bluetooth settings.
    Bluetooth scanning also needs location services Android 11 and older only: the permission is held but the system location toggle is off.
    No card, empty list Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere.

    Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered.

    Connection Status

    Icon State Aprašymas
    🟢 Connected Active radio link established
    🟡 Connecting Handshake in progress
    🔴 Atsijungta No active connection
    Not configured No device selected

    When connecting, a status indicator shows the current connection state:

    Connecting status

    If no devices are found, the app shows an empty state with instructions:

    No devices found

    Troubleshooting Bluetooth

    • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
    • Connection drops: Move closer to the radio; check for interference.
    • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

    USB Serial

    USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

    Setup

    1. Connect your radio via USB cable to your device.
    2. The app will prompt for USB permission — tap Allow.
    3. The connection is established automatically.

    ⚠️ Note: USB connections require OTG support on Android devices.

    TCP/IP (Network)

    Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

    Connecting over the Network

    1. Make sure the radio is on the same local network as your phone/desktop.
    2. On the Connect screen, select Network in the transport selector.
    3. Choose the radio one of two ways:
      • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
      • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
    4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

    💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

    When to Use TCP

    • Radio is on the same local network
    • Testing with a simulated radio
    • Environments where Bluetooth has interference issues

    Reconnection Behavior

    The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

    To disconnect, tap the disconnect button on the Connect screen:

    Disconnect from radio

    Desktop Connections

    On Desktop (Linux/macOS/Windows), the app supports:

    • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
    • USB Serial — primary wired connection method
    • TCP/IP — for network-connected radios

    See Desktop App for platform-specific details and keyboard shortcuts.



    diff --git a/main/lt-rLT/user/onboarding.html b/main/lt-rLT/user/onboarding.html index 10c18a1174..6835fba690 100644 --- a/main/lt-rLT/user/onboarding.html +++ b/main/lt-rLT/user/onboarding.html @@ -1 +1 @@ - Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Lietuvių
    Meshtastic Docs ↗

    🌐 Lietuvių — Community translation View in English

    Getting Started

    Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

    First Launch

    When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings.

    Welcome Screen

    The welcome screen introduces Meshtastic and its core capabilities:

    • Off-grid mesh communication
    • No cellular or internet required
    • End-to-end encrypted messaging

    Tap Get Started to proceed through the setup flow.

    Welcome screen

    Permissions

    The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

    Bluetooth Permission

    Bluetooth is the primary connection method between your phone and Meshtastic radio:

    • Bluetooth scanning — discover nearby Meshtastic radios
    • Bluetooth connect — establish and maintain connections with paired radios

    Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

    Location Permission

    ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice.

    Meshtastic also uses your location for:

    • Showing your position on the mesh map
    • Calculating distances to other nodes
    • Sharing your GPS coordinates with other mesh members (if enabled)

    Grant “While using the app” or “Always” depending on your preference:

    • While using the app — position updates only when the app is open
    • Always — enables background position updates for always-on mesh presence

    If denied, Bluetooth scanning will not function and your node will not report a position.

    Notifications Permission

    Notifications alert you to:

    • Incoming messages from channels and direct messages
    • New nodes joining the mesh
    • Low battery on a remote node

    💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

    Critical Alerts Permission

    On supported devices, the app may request permission for critical alerts:

    • These are high-priority notifications that can break through Do Not Disturb mode
    • Useful for emergency mesh alerts or urgent messages
    • You can skip this step if you don’t need breakthrough notifications
    • Configure or revoke later in Android notification settings

    After Setup

    Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

    💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use.

    What’s Next?

    Once connected to a radio, explore:

    New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



    + Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Lietuvių
    Meshtastic Docs ↗

    🌐 Lietuvių — Community translation View in English

    Getting Started

    Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

    First Launch

    When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app.

    Welcome Screen

    The welcome screen introduces Meshtastic and its core capabilities:

    • Off-grid mesh communication
    • No cellular or internet required
    • End-to-end encrypted messaging

    Tap Get Started to proceed through the setup flow.

    Welcome screen

    Permissions

    The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

    Bluetooth Permission

    Bluetooth is the primary connection method between your phone and Meshtastic radio:

    • Bluetooth scanning — discover nearby Meshtastic radios
    • Bluetooth connect — establish and maintain connections with paired radios

    Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

    Location Permission

    ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio.

    Meshtastic also uses your location for:

    • Showing your position on the mesh map
    • Calculating distances to other nodes
    • Sharing your GPS coordinates with other mesh members (if enabled)

    Grant “While using the app” or “Always” depending on your preference:

    • While using the app — position updates only when the app is open
    • Always — enables background position updates for always-on mesh presence

    Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind.

    Notifications Permission

    Notifications alert you to:

    • Incoming messages from channels and direct messages
    • New nodes joining the mesh
    • Low battery on a remote node

    💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

    Critical Alerts Permission

    On supported devices, the app may request permission for critical alerts:

    • These are high-priority notifications that can break through Do Not Disturb mode
    • Useful for emergency mesh alerts or urgent messages
    • You can skip this step if you don’t need breakthrough notifications
    • Configure or revoke later in Android notification settings

    Reviewing permissions later

    Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time:

    State What tapping the row does
    Allowed Opens the system page, so you can review or revoke it
    Not asked yet Requests it
    Denied — tap to allow Explains what the permission is for, then asks again if you agree
    Blocked — tap to open system settings Android will no longer show its dialog, so this opens the page where you can turn it back on
    Not required on this version of Android Nothing — the permission does not exist on your device

    This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead.

    After Setup

    Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

    💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own.

    Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing.

    What’s Next?

    Once connected to a radio, explore:

    New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



    diff --git a/main/nl-rNL/user/connections.html b/main/nl-rNL/user/connections.html index 14c35c8dde..0a26e1de52 100644 --- a/main/nl-rNL/user/connections.html +++ b/main/nl-rNL/user/connections.html @@ -1 +1 @@ - Connections | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Nederlands
    Meshtastic Docs ↗

    🌐 Nederlands — Community translation View in English

    Connections

    Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

    Bluetooth (BLE)

    Bluetooth Low Energy is the default and most common connection method on Android.

    Pairing a Device

    1. Ensure your Meshtastic radio is powered on and in pairing mode.
    2. Open the app and navigate to the Connect tab.
    3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
    4. Select your device from the list.
    5. Accept the Bluetooth pairing prompt if shown.

    Scanning for Bluetooth devices, with a discovered radio in the list

    Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

    Transport selector

    💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device.

    Connection Status

    Icon State Beschrijving
    🟢 Verbonden Active radio link established
    🟡 Bezig met verbinden Handshake in progress
    🔴 Niet verbonden No active connection
    Not configured No device selected

    When connecting, a status indicator shows the current connection state:

    Connecting status

    If no devices are found, the app shows an empty state with instructions:

    No devices found

    Troubleshooting Bluetooth

    • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
    • Connection drops: Move closer to the radio; check for interference.
    • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

    USB Serial

    USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

    Setup

    1. Connect your radio via USB cable to your device.
    2. The app will prompt for USB permission — tap Allow.
    3. The connection is established automatically.

    ⚠️ Note: USB connections require OTG support on Android devices.

    TCP/IP (Network)

    Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

    Connecting over the Network

    1. Make sure the radio is on the same local network as your phone/desktop.
    2. On the Connect screen, select Network in the transport selector.
    3. Choose the radio one of two ways:
      • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
      • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
    4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

    💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

    When to Use TCP

    • Radio is on the same local network
    • Testing with a simulated radio
    • Environments where Bluetooth has interference issues

    Reconnection Behavior

    The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

    To disconnect, tap the disconnect button on the Connect screen:

    Disconnect from radio

    Desktop Connections

    On Desktop (Linux/macOS/Windows), the app supports:

    • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
    • USB Serial — primary wired connection method
    • TCP/IP — for network-connected radios

    See Desktop App for platform-specific details and keyboard shortcuts.



    + Connections | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Nederlands
    Meshtastic Docs ↗

    🌐 Nederlands — Community translation View in English

    Connections

    Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

    Bluetooth (BLE)

    Bluetooth Low Energy is the default and most common connection method on Android.

    Pairing a Device

    1. Ensure your Meshtastic radio is powered on and in pairing mode.
    2. Open the app and navigate to the Connect tab.
    3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
    4. Select your device from the list.
    5. Accept the Bluetooth pairing prompt if shown.

    Scanning for Bluetooth devices, with a discovered radio in the list

    Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

    Transport selector

    💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range.

    The screen names anything on the app’s side that is blocking a scan, with the fix attached:

    What you see What it means
    A card asking for Nearby devices The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings.
    Bluetooth is off The adapter is disabled — the card opens Bluetooth settings.
    Bluetooth scanning also needs location services Android 11 and older only: the permission is held but the system location toggle is off.
    No card, empty list Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere.

    Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered.

    Connection Status

    Icon State Beschrijving
    🟢 Verbonden Active radio link established
    🟡 Bezig met verbinden Handshake in progress
    🔴 Niet verbonden No active connection
    Not configured No device selected

    When connecting, a status indicator shows the current connection state:

    Connecting status

    If no devices are found, the app shows an empty state with instructions:

    No devices found

    Troubleshooting Bluetooth

    • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
    • Connection drops: Move closer to the radio; check for interference.
    • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

    USB Serial

    USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

    Setup

    1. Connect your radio via USB cable to your device.
    2. The app will prompt for USB permission — tap Allow.
    3. The connection is established automatically.

    ⚠️ Note: USB connections require OTG support on Android devices.

    TCP/IP (Network)

    Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

    Connecting over the Network

    1. Make sure the radio is on the same local network as your phone/desktop.
    2. On the Connect screen, select Network in the transport selector.
    3. Choose the radio one of two ways:
      • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
      • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
    4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

    💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

    When to Use TCP

    • Radio is on the same local network
    • Testing with a simulated radio
    • Environments where Bluetooth has interference issues

    Reconnection Behavior

    The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

    To disconnect, tap the disconnect button on the Connect screen:

    Disconnect from radio

    Desktop Connections

    On Desktop (Linux/macOS/Windows), the app supports:

    • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
    • USB Serial — primary wired connection method
    • TCP/IP — for network-connected radios

    See Desktop App for platform-specific details and keyboard shortcuts.



    diff --git a/main/nl-rNL/user/onboarding.html b/main/nl-rNL/user/onboarding.html index 4b93789d03..b8c394589b 100644 --- a/main/nl-rNL/user/onboarding.html +++ b/main/nl-rNL/user/onboarding.html @@ -1 +1 @@ - Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Nederlands
    Meshtastic Docs ↗

    🌐 Nederlands — Community translation View in English

    Getting Started

    Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

    First Launch

    When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings.

    Welcome Screen

    The welcome screen introduces Meshtastic and its core capabilities:

    • Off-grid mesh communication
    • No cellular or internet required
    • End-to-end encrypted messaging

    Tap Get Started to proceed through the setup flow.

    Welcome screen

    Permissions

    The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

    Bluetooth Permission

    Bluetooth is the primary connection method between your phone and Meshtastic radio:

    • Bluetooth scanning — discover nearby Meshtastic radios
    • Bluetooth connect — establish and maintain connections with paired radios

    Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

    Location Permission

    ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice.

    Meshtastic also uses your location for:

    • Showing your position on the mesh map
    • Calculating distances to other nodes
    • Sharing your GPS coordinates with other mesh members (if enabled)

    Grant “While using the app” or “Always” depending on your preference:

    • While using the app — position updates only when the app is open
    • Always — enables background position updates for always-on mesh presence

    If denied, Bluetooth scanning will not function and your node will not report a position.

    Notifications Permission

    Notifications alert you to:

    • Incoming messages from channels and direct messages
    • New nodes joining the mesh
    • Low battery on a remote node

    💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

    Critical Alerts Permission

    On supported devices, the app may request permission for critical alerts:

    • These are high-priority notifications that can break through Do Not Disturb mode
    • Useful for emergency mesh alerts or urgent messages
    • You can skip this step if you don’t need breakthrough notifications
    • Configure or revoke later in Android notification settings

    After Setup

    Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

    💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use.

    What’s Next?

    Once connected to a radio, explore:

    New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



    + Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Nederlands
    Meshtastic Docs ↗

    🌐 Nederlands — Community translation View in English

    Getting Started

    Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

    First Launch

    When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app.

    Welcome Screen

    The welcome screen introduces Meshtastic and its core capabilities:

    • Off-grid mesh communication
    • No cellular or internet required
    • End-to-end encrypted messaging

    Tap Get Started to proceed through the setup flow.

    Welcome screen

    Permissions

    The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

    Bluetooth Permission

    Bluetooth is the primary connection method between your phone and Meshtastic radio:

    • Bluetooth scanning — discover nearby Meshtastic radios
    • Bluetooth connect — establish and maintain connections with paired radios

    Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

    Location Permission

    ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio.

    Meshtastic also uses your location for:

    • Showing your position on the mesh map
    • Calculating distances to other nodes
    • Sharing your GPS coordinates with other mesh members (if enabled)

    Grant “While using the app” or “Always” depending on your preference:

    • While using the app — position updates only when the app is open
    • Always — enables background position updates for always-on mesh presence

    Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind.

    Notifications Permission

    Notifications alert you to:

    • Incoming messages from channels and direct messages
    • New nodes joining the mesh
    • Low battery on a remote node

    💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

    Critical Alerts Permission

    On supported devices, the app may request permission for critical alerts:

    • These are high-priority notifications that can break through Do Not Disturb mode
    • Useful for emergency mesh alerts or urgent messages
    • You can skip this step if you don’t need breakthrough notifications
    • Configure or revoke later in Android notification settings

    Reviewing permissions later

    Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time:

    State What tapping the row does
    Allowed Opens the system page, so you can review or revoke it
    Not asked yet Requests it
    Denied — tap to allow Explains what the permission is for, then asks again if you agree
    Blocked — tap to open system settings Android will no longer show its dialog, so this opens the page where you can turn it back on
    Not required on this version of Android Nothing — the permission does not exist on your device

    This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead.

    After Setup

    Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

    💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own.

    Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing.

    What’s Next?

    Once connected to a radio, explore:

    New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



    diff --git a/main/no-rNO/user/connections.html b/main/no-rNO/user/connections.html index f4f7e34752..9439752c94 100644 --- a/main/no-rNO/user/connections.html +++ b/main/no-rNO/user/connections.html @@ -1 +1 @@ - Connections | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Norsk
    Meshtastic Docs ↗

    🌐 Norsk — Community translation View in English

    Connections

    Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

    Bluetooth (BLE)

    Bluetooth Low Energy is the default and most common connection method on Android.

    Pairing a Device

    1. Ensure your Meshtastic radio is powered on and in pairing mode.
    2. Open the app and navigate to the Connect tab.
    3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
    4. Select your device from the list.
    5. Accept the Bluetooth pairing prompt if shown.

    Scanning for Bluetooth devices, with a discovered radio in the list

    Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

    Transport selector

    💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device.

    Connection Status

    Icon State Beskrivelse
    🟢 Connected Active radio link established
    🟡 Connecting Handshake in progress
    🔴 Frakoblet No active connection
    Not configured No device selected

    When connecting, a status indicator shows the current connection state:

    Connecting status

    If no devices are found, the app shows an empty state with instructions:

    No devices found

    Troubleshooting Bluetooth

    • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
    • Connection drops: Move closer to the radio; check for interference.
    • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

    USB Serial

    USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

    Setup

    1. Connect your radio via USB cable to your device.
    2. The app will prompt for USB permission — tap Allow.
    3. The connection is established automatically.

    ⚠️ Note: USB connections require OTG support on Android devices.

    TCP/IP (Network)

    Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

    Connecting over the Network

    1. Make sure the radio is on the same local network as your phone/desktop.
    2. On the Connect screen, select Network in the transport selector.
    3. Choose the radio one of two ways:
      • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
      • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
    4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

    💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

    When to Use TCP

    • Radio is on the same local network
    • Testing with a simulated radio
    • Environments where Bluetooth has interference issues

    Reconnection Behavior

    The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

    To disconnect, tap the disconnect button on the Connect screen:

    Disconnect from radio

    Desktop Connections

    On Desktop (Linux/macOS/Windows), the app supports:

    • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
    • USB Serial — primary wired connection method
    • TCP/IP — for network-connected radios

    See Desktop App for platform-specific details and keyboard shortcuts.



    + Connections | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Norsk
    Meshtastic Docs ↗

    🌐 Norsk — Community translation View in English

    Connections

    Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

    Bluetooth (BLE)

    Bluetooth Low Energy is the default and most common connection method on Android.

    Pairing a Device

    1. Ensure your Meshtastic radio is powered on and in pairing mode.
    2. Open the app and navigate to the Connect tab.
    3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
    4. Select your device from the list.
    5. Accept the Bluetooth pairing prompt if shown.

    Scanning for Bluetooth devices, with a discovered radio in the list

    Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

    Transport selector

    💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range.

    The screen names anything on the app’s side that is blocking a scan, with the fix attached:

    What you see What it means
    A card asking for Nearby devices The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings.
    Bluetooth is off The adapter is disabled — the card opens Bluetooth settings.
    Bluetooth scanning also needs location services Android 11 and older only: the permission is held but the system location toggle is off.
    No card, empty list Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere.

    Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered.

    Connection Status

    Icon State Beskrivelse
    🟢 Connected Active radio link established
    🟡 Connecting Handshake in progress
    🔴 Frakoblet No active connection
    Not configured No device selected

    When connecting, a status indicator shows the current connection state:

    Connecting status

    If no devices are found, the app shows an empty state with instructions:

    No devices found

    Troubleshooting Bluetooth

    • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
    • Connection drops: Move closer to the radio; check for interference.
    • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

    USB Serial

    USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

    Setup

    1. Connect your radio via USB cable to your device.
    2. The app will prompt for USB permission — tap Allow.
    3. The connection is established automatically.

    ⚠️ Note: USB connections require OTG support on Android devices.

    TCP/IP (Network)

    Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

    Connecting over the Network

    1. Make sure the radio is on the same local network as your phone/desktop.
    2. On the Connect screen, select Network in the transport selector.
    3. Choose the radio one of two ways:
      • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
      • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
    4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

    💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

    When to Use TCP

    • Radio is on the same local network
    • Testing with a simulated radio
    • Environments where Bluetooth has interference issues

    Reconnection Behavior

    The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

    To disconnect, tap the disconnect button on the Connect screen:

    Disconnect from radio

    Desktop Connections

    On Desktop (Linux/macOS/Windows), the app supports:

    • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
    • USB Serial — primary wired connection method
    • TCP/IP — for network-connected radios

    See Desktop App for platform-specific details and keyboard shortcuts.



    diff --git a/main/no-rNO/user/onboarding.html b/main/no-rNO/user/onboarding.html index 2efbf8e686..b6d7fbdcbd 100644 --- a/main/no-rNO/user/onboarding.html +++ b/main/no-rNO/user/onboarding.html @@ -1 +1 @@ - Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Norsk
    Meshtastic Docs ↗

    🌐 Norsk — Community translation View in English

    Getting Started

    Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

    First Launch

    When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings.

    Welcome Screen

    The welcome screen introduces Meshtastic and its core capabilities:

    • Off-grid mesh communication
    • No cellular or internet required
    • End-to-end encrypted messaging

    Tap Get Started to proceed through the setup flow.

    Welcome screen

    Permissions

    The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

    Bluetooth Permission

    Bluetooth is the primary connection method between your phone and Meshtastic radio:

    • Bluetooth scanning — discover nearby Meshtastic radios
    • Bluetooth connect — establish and maintain connections with paired radios

    Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

    Location Permission

    ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice.

    Meshtastic also uses your location for:

    • Showing your position on the mesh map
    • Calculating distances to other nodes
    • Sharing your GPS coordinates with other mesh members (if enabled)

    Grant “While using the app” or “Always” depending on your preference:

    • While using the app — position updates only when the app is open
    • Always — enables background position updates for always-on mesh presence

    If denied, Bluetooth scanning will not function and your node will not report a position.

    Notifications Permission

    Notifications alert you to:

    • Incoming messages from channels and direct messages
    • New nodes joining the mesh
    • Low battery on a remote node

    💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

    Critical Alerts Permission

    On supported devices, the app may request permission for critical alerts:

    • These are high-priority notifications that can break through Do Not Disturb mode
    • Useful for emergency mesh alerts or urgent messages
    • You can skip this step if you don’t need breakthrough notifications
    • Configure or revoke later in Android notification settings

    After Setup

    Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

    💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use.

    What’s Next?

    Once connected to a radio, explore:

    New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



    + Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Norsk
    Meshtastic Docs ↗

    🌐 Norsk — Community translation View in English

    Getting Started

    Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

    First Launch

    When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app.

    Welcome Screen

    The welcome screen introduces Meshtastic and its core capabilities:

    • Off-grid mesh communication
    • No cellular or internet required
    • End-to-end encrypted messaging

    Tap Get Started to proceed through the setup flow.

    Welcome screen

    Permissions

    The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

    Bluetooth Permission

    Bluetooth is the primary connection method between your phone and Meshtastic radio:

    • Bluetooth scanning — discover nearby Meshtastic radios
    • Bluetooth connect — establish and maintain connections with paired radios

    Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

    Location Permission

    ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio.

    Meshtastic also uses your location for:

    • Showing your position on the mesh map
    • Calculating distances to other nodes
    • Sharing your GPS coordinates with other mesh members (if enabled)

    Grant “While using the app” or “Always” depending on your preference:

    • While using the app — position updates only when the app is open
    • Always — enables background position updates for always-on mesh presence

    Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind.

    Notifications Permission

    Notifications alert you to:

    • Incoming messages from channels and direct messages
    • New nodes joining the mesh
    • Low battery on a remote node

    💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

    Critical Alerts Permission

    On supported devices, the app may request permission for critical alerts:

    • These are high-priority notifications that can break through Do Not Disturb mode
    • Useful for emergency mesh alerts or urgent messages
    • You can skip this step if you don’t need breakthrough notifications
    • Configure or revoke later in Android notification settings

    Reviewing permissions later

    Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time:

    State What tapping the row does
    Allowed Opens the system page, so you can review or revoke it
    Not asked yet Requests it
    Denied — tap to allow Explains what the permission is for, then asks again if you agree
    Blocked — tap to open system settings Android will no longer show its dialog, so this opens the page where you can turn it back on
    Not required on this version of Android Nothing — the permission does not exist on your device

    This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead.

    After Setup

    Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

    💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own.

    Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing.

    What’s Next?

    Once connected to a radio, explore:

    New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



    diff --git a/main/pl-rPL/user/connections.html b/main/pl-rPL/user/connections.html index 1be5068d82..85244f08b4 100644 --- a/main/pl-rPL/user/connections.html +++ b/main/pl-rPL/user/connections.html @@ -1 +1 @@ - Connections | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Polski
    Meshtastic Docs ↗

    🌐 Polski — Community translation View in English

    Connections

    Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

    Bluetooth (BLE)

    Bluetooth Low Energy is the default and most common connection method on Android.

    Pairing a Device

    1. Ensure your Meshtastic radio is powered on and in pairing mode.
    2. Open the app and navigate to the Connect tab.
    3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
    4. Select your device from the list.
    5. Accept the Bluetooth pairing prompt if shown.

    Scanning for Bluetooth devices, with a discovered radio in the list

    Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

    Transport selector

    💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device.

    Connection Status

    Icon State Opis
    🟢 Połączony Active radio link established
    🟡 Łączenie Handshake in progress
    🔴 Rozłączono No active connection
    Not configured Nie wybrano urządzenia

    When connecting, a status indicator shows the current connection state:

    Connecting status

    If no devices are found, the app shows an empty state with instructions:

    No devices found

    Troubleshooting Bluetooth

    • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
    • Connection drops: Move closer to the radio; check for interference.
    • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

    USB Serial

    USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

    Setup

    1. Connect your radio via USB cable to your device.
    2. The app will prompt for USB permission — tap Allow.
    3. The connection is established automatically.

    ⚠️ Note: USB connections require OTG support on Android devices.

    TCP/IP (Network)

    Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

    Connecting over the Network

    1. Make sure the radio is on the same local network as your phone/desktop.
    2. On the Connect screen, select Network in the transport selector.
    3. Choose the radio one of two ways:
      • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
      • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
    4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

    💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

    When to Use TCP

    • Radio is on the same local network
    • Testing with a simulated radio
    • Environments where Bluetooth has interference issues

    Reconnection Behavior

    The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

    To disconnect, tap the disconnect button on the Connect screen:

    Disconnect from radio

    Desktop Connections

    On Desktop (Linux/macOS/Windows), the app supports:

    • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
    • USB Serial — primary wired connection method
    • TCP/IP — for network-connected radios

    See Desktop App for platform-specific details and keyboard shortcuts.



    + Connections | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Polski
    Meshtastic Docs ↗

    🌐 Polski — Community translation View in English

    Connections

    Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

    Bluetooth (BLE)

    Bluetooth Low Energy is the default and most common connection method on Android.

    Pairing a Device

    1. Ensure your Meshtastic radio is powered on and in pairing mode.
    2. Open the app and navigate to the Connect tab.
    3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
    4. Select your device from the list.
    5. Accept the Bluetooth pairing prompt if shown.

    Scanning for Bluetooth devices, with a discovered radio in the list

    Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

    Transport selector

    💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range.

    The screen names anything on the app’s side that is blocking a scan, with the fix attached:

    What you see What it means
    A card asking for Nearby devices The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings.
    Bluetooth is off The adapter is disabled — the card opens Bluetooth settings.
    Bluetooth scanning also needs location services Android 11 and older only: the permission is held but the system location toggle is off.
    No card, empty list Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere.

    Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered.

    Connection Status

    Icon State Opis
    🟢 Połączony Active radio link established
    🟡 Łączenie Handshake in progress
    🔴 Rozłączono No active connection
    Not configured Nie wybrano urządzenia

    When connecting, a status indicator shows the current connection state:

    Connecting status

    If no devices are found, the app shows an empty state with instructions:

    No devices found

    Troubleshooting Bluetooth

    • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
    • Connection drops: Move closer to the radio; check for interference.
    • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

    USB Serial

    USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

    Setup

    1. Connect your radio via USB cable to your device.
    2. The app will prompt for USB permission — tap Allow.
    3. The connection is established automatically.

    ⚠️ Note: USB connections require OTG support on Android devices.

    TCP/IP (Network)

    Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

    Connecting over the Network

    1. Make sure the radio is on the same local network as your phone/desktop.
    2. On the Connect screen, select Network in the transport selector.
    3. Choose the radio one of two ways:
      • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
      • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
    4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

    💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

    When to Use TCP

    • Radio is on the same local network
    • Testing with a simulated radio
    • Environments where Bluetooth has interference issues

    Reconnection Behavior

    The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

    To disconnect, tap the disconnect button on the Connect screen:

    Disconnect from radio

    Desktop Connections

    On Desktop (Linux/macOS/Windows), the app supports:

    • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
    • USB Serial — primary wired connection method
    • TCP/IP — for network-connected radios

    See Desktop App for platform-specific details and keyboard shortcuts.



    diff --git a/main/pl-rPL/user/onboarding.html b/main/pl-rPL/user/onboarding.html index 35d850e913..78c6b856f6 100644 --- a/main/pl-rPL/user/onboarding.html +++ b/main/pl-rPL/user/onboarding.html @@ -1 +1 @@ - Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Polski
    Meshtastic Docs ↗

    🌐 Polski — Community translation View in English

    Getting Started

    Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

    First Launch

    When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings.

    Welcome Screen

    The welcome screen introduces Meshtastic and its core capabilities:

    • Off-grid mesh communication
    • No cellular or internet required
    • End-to-end encrypted messaging

    Tap Get Started to proceed through the setup flow.

    Welcome screen

    Permissions

    The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

    Bluetooth Permission

    Bluetooth is the primary connection method between your phone and Meshtastic radio:

    • Bluetooth scanning — discover nearby Meshtastic radios
    • Bluetooth connect — establish and maintain connections with paired radios

    Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

    Location Permission

    ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice.

    Meshtastic also uses your location for:

    • Showing your position on the mesh map
    • Calculating distances to other nodes
    • Sharing your GPS coordinates with other mesh members (if enabled)

    Grant “While using the app” or “Always” depending on your preference:

    • While using the app — position updates only when the app is open
    • Always — enables background position updates for always-on mesh presence

    If denied, Bluetooth scanning will not function and your node will not report a position.

    Notifications Permission

    Notifications alert you to:

    • Incoming messages from channels and direct messages
    • New nodes joining the mesh
    • Low battery on a remote node

    💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

    Critical Alerts Permission

    On supported devices, the app may request permission for critical alerts:

    • These are high-priority notifications that can break through Do Not Disturb mode
    • Useful for emergency mesh alerts or urgent messages
    • You can skip this step if you don’t need breakthrough notifications
    • Configure or revoke later in Android notification settings

    After Setup

    Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

    💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use.

    What’s Next?

    Once connected to a radio, explore:

    New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



    + Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Polski
    Meshtastic Docs ↗

    🌐 Polski — Community translation View in English

    Getting Started

    Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

    First Launch

    When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app.

    Welcome Screen

    The welcome screen introduces Meshtastic and its core capabilities:

    • Off-grid mesh communication
    • No cellular or internet required
    • End-to-end encrypted messaging

    Tap Get Started to proceed through the setup flow.

    Welcome screen

    Permissions

    The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

    Bluetooth Permission

    Bluetooth is the primary connection method between your phone and Meshtastic radio:

    • Bluetooth scanning — discover nearby Meshtastic radios
    • Bluetooth connect — establish and maintain connections with paired radios

    Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

    Location Permission

    ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio.

    Meshtastic also uses your location for:

    • Showing your position on the mesh map
    • Calculating distances to other nodes
    • Sharing your GPS coordinates with other mesh members (if enabled)

    Grant “While using the app” or “Always” depending on your preference:

    • While using the app — position updates only when the app is open
    • Always — enables background position updates for always-on mesh presence

    Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind.

    Notifications Permission

    Notifications alert you to:

    • Incoming messages from channels and direct messages
    • New nodes joining the mesh
    • Low battery on a remote node

    💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

    Critical Alerts Permission

    On supported devices, the app may request permission for critical alerts:

    • These are high-priority notifications that can break through Do Not Disturb mode
    • Useful for emergency mesh alerts or urgent messages
    • You can skip this step if you don’t need breakthrough notifications
    • Configure or revoke later in Android notification settings

    Reviewing permissions later

    Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time:

    State What tapping the row does
    Allowed Opens the system page, so you can review or revoke it
    Not asked yet Requests it
    Denied — tap to allow Explains what the permission is for, then asks again if you agree
    Blocked — tap to open system settings Android will no longer show its dialog, so this opens the page where you can turn it back on
    Not required on this version of Android Nothing — the permission does not exist on your device

    This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead.

    After Setup

    Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

    💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own.

    Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing.

    What’s Next?

    Once connected to a radio, explore:

    New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



    diff --git a/main/pt-rBR/user/connections.html b/main/pt-rBR/user/connections.html index e6f8972307..8dcca0406d 100644 --- a/main/pt-rBR/user/connections.html +++ b/main/pt-rBR/user/connections.html @@ -1 +1 @@ - Conexões | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Português (Brasil)
    Meshtastic Docs ↗

    🌐 Português (Brasil) — Community translation View in English

    Conexões

    Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

    Bluetooth (BLE)

    Bluetooth Low Energy is the default and most common connection method on Android.

    Pairing a Device

    1. Ensure your Meshtastic radio is powered on and in pairing mode.
    2. Open the app and navigate to the Connect tab.
    3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
    4. Select your device from the list.
    5. Accept the Bluetooth pairing prompt if shown.

    Scanning for Bluetooth devices, with a discovered radio in the list

    Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

    Transport selector

    💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device.

    Connection Status

    Icon State Descrição
    🟢 Conectado Active radio link established
    🟡 Connecting Handshake in progress
    🔴 Desconectado No active connection
    Not configured No device selected

    When connecting, a status indicator shows the current connection state:

    Connecting status

    If no devices are found, the app shows an empty state with instructions:

    No devices found

    Troubleshooting Bluetooth

    • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
    • Connection drops: Move closer to the radio; check for interference.
    • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

    USB Serial

    USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

    Setup

    1. Connect your radio via USB cable to your device.
    2. The app will prompt for USB permission — tap Allow.
    3. The connection is established automatically.

    ⚠️ Note: USB connections require OTG support on Android devices.

    TCP/IP (Network)

    Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

    Connecting over the Network

    1. Make sure the radio is on the same local network as your phone/desktop.
    2. On the Connect screen, select Network in the transport selector.
    3. Choose the radio one of two ways:
      • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
      • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
    4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

    💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

    When to Use TCP

    • Radio is on the same local network
    • Testing with a simulated radio
    • Environments where Bluetooth has interference issues

    Reconnection Behavior

    The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

    To disconnect, tap the disconnect button on the Connect screen:

    Disconnect from radio

    Desktop Connections

    On Desktop (Linux/macOS/Windows), the app supports:

    • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
    • USB Serial — primary wired connection method
    • TCP/IP — for network-connected radios

    See Desktop App for platform-specific details and keyboard shortcuts.



    + Conexões | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Português (Brasil)
    Meshtastic Docs ↗

    🌐 Português (Brasil) — Community translation View in English

    Conexões

    Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

    Bluetooth (BLE)

    Bluetooth Low Energy is the default and most common connection method on Android.

    Pairing a Device

    1. Ensure your Meshtastic radio is powered on and in pairing mode.
    2. Open the app and navigate to the Connect tab.
    3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
    4. Select your device from the list.
    5. Accept the Bluetooth pairing prompt if shown.

    Scanning for Bluetooth devices, with a discovered radio in the list

    Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

    Transport selector

    💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range.

    The screen names anything on the app’s side that is blocking a scan, with the fix attached:

    What you see What it means
    A card asking for Nearby devices The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings.
    Bluetooth is off The adapter is disabled — the card opens Bluetooth settings.
    Bluetooth scanning also needs location services Android 11 and older only: the permission is held but the system location toggle is off.
    No card, empty list Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere.

    Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered.

    Connection Status

    Icon State Descrição
    🟢 Conectado Active radio link established
    🟡 Connecting Handshake in progress
    🔴 Desconectado No active connection
    Not configured No device selected

    When connecting, a status indicator shows the current connection state:

    Connecting status

    If no devices are found, the app shows an empty state with instructions:

    No devices found

    Troubleshooting Bluetooth

    • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
    • Connection drops: Move closer to the radio; check for interference.
    • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

    USB Serial

    USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

    Setup

    1. Connect your radio via USB cable to your device.
    2. The app will prompt for USB permission — tap Allow.
    3. The connection is established automatically.

    ⚠️ Note: USB connections require OTG support on Android devices.

    TCP/IP (Network)

    Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

    Connecting over the Network

    1. Make sure the radio is on the same local network as your phone/desktop.
    2. On the Connect screen, select Network in the transport selector.
    3. Choose the radio one of two ways:
      • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
      • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
    4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

    💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

    When to Use TCP

    • Radio is on the same local network
    • Testing with a simulated radio
    • Environments where Bluetooth has interference issues

    Reconnection Behavior

    The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

    To disconnect, tap the disconnect button on the Connect screen:

    Disconnect from radio

    Desktop Connections

    On Desktop (Linux/macOS/Windows), the app supports:

    • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
    • USB Serial — primary wired connection method
    • TCP/IP — for network-connected radios

    See Desktop App for platform-specific details and keyboard shortcuts.



    diff --git a/main/pt-rBR/user/onboarding.html b/main/pt-rBR/user/onboarding.html index beb8e6d9cb..604f024cc6 100644 --- a/main/pt-rBR/user/onboarding.html +++ b/main/pt-rBR/user/onboarding.html @@ -1 +1 @@ - Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Português (Brasil)
    Meshtastic Docs ↗

    🌐 Português (Brasil) — Community translation View in English

    Getting Started

    Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

    First Launch

    When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings.

    Welcome Screen

    The welcome screen introduces Meshtastic and its core capabilities:

    • Off-grid mesh communication
    • No cellular or internet required
    • End-to-end encrypted messaging

    Tap Get Started to proceed through the setup flow.

    Welcome screen

    Permissions

    The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

    Bluetooth Permission

    Bluetooth is the primary connection method between your phone and Meshtastic radio:

    • Bluetooth scanning — discover nearby Meshtastic radios
    • Bluetooth connect — establish and maintain connections with paired radios

    Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

    Location Permission

    ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice.

    Meshtastic also uses your location for:

    • Showing your position on the mesh map
    • Calculating distances to other nodes
    • Sharing your GPS coordinates with other mesh members (if enabled)

    Grant “While using the app” or “Always” depending on your preference:

    • While using the app — position updates only when the app is open
    • Always — enables background position updates for always-on mesh presence

    If denied, Bluetooth scanning will not function and your node will not report a position.

    Notifications Permission

    Notifications alert you to:

    • Incoming messages from channels and direct messages
    • New nodes joining the mesh
    • Low battery on a remote node

    💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

    Critical Alerts Permission

    On supported devices, the app may request permission for critical alerts:

    • These are high-priority notifications that can break through Do Not Disturb mode
    • Useful for emergency mesh alerts or urgent messages
    • You can skip this step if you don’t need breakthrough notifications
    • Configure or revoke later in Android notification settings

    After Setup

    Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

    💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use.

    What’s Next?

    Once connected to a radio, explore:

    New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



    + Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Português (Brasil)
    Meshtastic Docs ↗

    🌐 Português (Brasil) — Community translation View in English

    Getting Started

    Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

    First Launch

    When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app.

    Welcome Screen

    The welcome screen introduces Meshtastic and its core capabilities:

    • Off-grid mesh communication
    • No cellular or internet required
    • End-to-end encrypted messaging

    Tap Get Started to proceed through the setup flow.

    Welcome screen

    Permissions

    The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

    Bluetooth Permission

    Bluetooth is the primary connection method between your phone and Meshtastic radio:

    • Bluetooth scanning — discover nearby Meshtastic radios
    • Bluetooth connect — establish and maintain connections with paired radios

    Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

    Location Permission

    ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio.

    Meshtastic also uses your location for:

    • Showing your position on the mesh map
    • Calculating distances to other nodes
    • Sharing your GPS coordinates with other mesh members (if enabled)

    Grant “While using the app” or “Always” depending on your preference:

    • While using the app — position updates only when the app is open
    • Always — enables background position updates for always-on mesh presence

    Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind.

    Notifications Permission

    Notifications alert you to:

    • Incoming messages from channels and direct messages
    • New nodes joining the mesh
    • Low battery on a remote node

    💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

    Critical Alerts Permission

    On supported devices, the app may request permission for critical alerts:

    • These are high-priority notifications that can break through Do Not Disturb mode
    • Useful for emergency mesh alerts or urgent messages
    • You can skip this step if you don’t need breakthrough notifications
    • Configure or revoke later in Android notification settings

    Reviewing permissions later

    Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time:

    State What tapping the row does
    Allowed Opens the system page, so you can review or revoke it
    Not asked yet Requests it
    Denied — tap to allow Explains what the permission is for, then asks again if you agree
    Blocked — tap to open system settings Android will no longer show its dialog, so this opens the page where you can turn it back on
    Not required on this version of Android Nothing — the permission does not exist on your device

    This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead.

    After Setup

    Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

    💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own.

    Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing.

    What’s Next?

    Once connected to a radio, explore:

    New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



    diff --git a/main/pt-rPT/user/connections.html b/main/pt-rPT/user/connections.html index 4664e57de7..096c4c2841 100644 --- a/main/pt-rPT/user/connections.html +++ b/main/pt-rPT/user/connections.html @@ -1 +1 @@ - Ligações | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Português
    Meshtastic Docs ↗

    🌐 Português — Community translation View in English

    Ligações

    Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

    Bluetooth (BLE)

    Bluetooth Low Energy is the default and most common connection method on Android.

    Pairing a Device

    1. Ensure your Meshtastic radio is powered on and in pairing mode.
    2. Open the app and navigate to the Connect tab.
    3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
    4. Select your device from the list.
    5. Accept the Bluetooth pairing prompt if shown.

    Scanning for Bluetooth devices, with a discovered radio in the list

    Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

    Transport selector

    💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device.

    Connection Status

    Icon State Descrição
    🟢 Ligado Active radio link established
    🟡 A ligar Handshake in progress
    🔴 Desconectado No active connection
    Not configured No device selected

    When connecting, a status indicator shows the current connection state:

    Connecting status

    If no devices are found, the app shows an empty state with instructions:

    No devices found

    Troubleshooting Bluetooth

    • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
    • Connection drops: Move closer to the radio; check for interference.
    • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

    USB Serial

    USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

    Setup

    1. Connect your radio via USB cable to your device.
    2. The app will prompt for USB permission — tap Allow.
    3. The connection is established automatically.

    ⚠️ Note: USB connections require OTG support on Android devices.

    TCP/IP (Network)

    Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

    Connecting over the Network

    1. Make sure the radio is on the same local network as your phone/desktop.
    2. On the Connect screen, select Network in the transport selector.
    3. Choose the radio one of two ways:
      • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
      • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
    4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

    💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

    When to Use TCP

    • Radio is on the same local network
    • Testing with a simulated radio
    • Environments where Bluetooth has interference issues

    Reconnection Behavior

    The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

    To disconnect, tap the disconnect button on the Connect screen:

    Disconnect from radio

    Desktop Connections

    On Desktop (Linux/macOS/Windows), the app supports:

    • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
    • USB Serial — primary wired connection method
    • TCP/IP — for network-connected radios

    See Desktop App for platform-specific details and keyboard shortcuts.



    + Ligações | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Português
    Meshtastic Docs ↗

    🌐 Português — Community translation View in English

    Ligações

    Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

    Bluetooth (BLE)

    Bluetooth Low Energy is the default and most common connection method on Android.

    Pairing a Device

    1. Ensure your Meshtastic radio is powered on and in pairing mode.
    2. Open the app and navigate to the Connect tab.
    3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
    4. Select your device from the list.
    5. Accept the Bluetooth pairing prompt if shown.

    Scanning for Bluetooth devices, with a discovered radio in the list

    Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

    Transport selector

    💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range.

    The screen names anything on the app’s side that is blocking a scan, with the fix attached:

    What you see What it means
    A card asking for Nearby devices The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings.
    Bluetooth is off The adapter is disabled — the card opens Bluetooth settings.
    Bluetooth scanning also needs location services Android 11 and older only: the permission is held but the system location toggle is off.
    No card, empty list Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere.

    Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered.

    Connection Status

    Icon State Descrição
    🟢 Ligado Active radio link established
    🟡 A ligar Handshake in progress
    🔴 Desconectado No active connection
    Not configured No device selected

    When connecting, a status indicator shows the current connection state:

    Connecting status

    If no devices are found, the app shows an empty state with instructions:

    No devices found

    Troubleshooting Bluetooth

    • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
    • Connection drops: Move closer to the radio; check for interference.
    • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

    USB Serial

    USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

    Setup

    1. Connect your radio via USB cable to your device.
    2. The app will prompt for USB permission — tap Allow.
    3. The connection is established automatically.

    ⚠️ Note: USB connections require OTG support on Android devices.

    TCP/IP (Network)

    Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

    Connecting over the Network

    1. Make sure the radio is on the same local network as your phone/desktop.
    2. On the Connect screen, select Network in the transport selector.
    3. Choose the radio one of two ways:
      • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
      • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
    4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

    💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

    When to Use TCP

    • Radio is on the same local network
    • Testing with a simulated radio
    • Environments where Bluetooth has interference issues

    Reconnection Behavior

    The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

    To disconnect, tap the disconnect button on the Connect screen:

    Disconnect from radio

    Desktop Connections

    On Desktop (Linux/macOS/Windows), the app supports:

    • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
    • USB Serial — primary wired connection method
    • TCP/IP — for network-connected radios

    See Desktop App for platform-specific details and keyboard shortcuts.



    diff --git a/main/pt-rPT/user/onboarding.html b/main/pt-rPT/user/onboarding.html index 0f4d236696..d110560cd0 100644 --- a/main/pt-rPT/user/onboarding.html +++ b/main/pt-rPT/user/onboarding.html @@ -1 +1 @@ - Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Português
    Meshtastic Docs ↗

    🌐 Português — Community translation View in English

    Getting Started

    Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

    First Launch

    When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings.

    Welcome Screen

    The welcome screen introduces Meshtastic and its core capabilities:

    • Off-grid mesh communication
    • No cellular or internet required
    • End-to-end encrypted messaging

    Tap Get Started to proceed through the setup flow.

    Welcome screen

    Permissions

    The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

    Bluetooth Permission

    Bluetooth is the primary connection method between your phone and Meshtastic radio:

    • Bluetooth scanning — discover nearby Meshtastic radios
    • Bluetooth connect — establish and maintain connections with paired radios

    Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

    Location Permission

    ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice.

    Meshtastic also uses your location for:

    • Showing your position on the mesh map
    • Calculating distances to other nodes
    • Sharing your GPS coordinates with other mesh members (if enabled)

    Grant “While using the app” or “Always” depending on your preference:

    • While using the app — position updates only when the app is open
    • Always — enables background position updates for always-on mesh presence

    If denied, Bluetooth scanning will not function and your node will not report a position.

    Notifications Permission

    Notifications alert you to:

    • Incoming messages from channels and direct messages
    • New nodes joining the mesh
    • Low battery on a remote node

    💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

    Critical Alerts Permission

    On supported devices, the app may request permission for critical alerts:

    • These are high-priority notifications that can break through Do Not Disturb mode
    • Useful for emergency mesh alerts or urgent messages
    • You can skip this step if you don’t need breakthrough notifications
    • Configure or revoke later in Android notification settings

    After Setup

    Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

    💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use.

    What’s Next?

    Once connected to a radio, explore:

    New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



    + Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Português
    Meshtastic Docs ↗

    🌐 Português — Community translation View in English

    Getting Started

    Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

    First Launch

    When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app.

    Welcome Screen

    The welcome screen introduces Meshtastic and its core capabilities:

    • Off-grid mesh communication
    • No cellular or internet required
    • End-to-end encrypted messaging

    Tap Get Started to proceed through the setup flow.

    Welcome screen

    Permissions

    The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

    Bluetooth Permission

    Bluetooth is the primary connection method between your phone and Meshtastic radio:

    • Bluetooth scanning — discover nearby Meshtastic radios
    • Bluetooth connect — establish and maintain connections with paired radios

    Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

    Location Permission

    ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio.

    Meshtastic also uses your location for:

    • Showing your position on the mesh map
    • Calculating distances to other nodes
    • Sharing your GPS coordinates with other mesh members (if enabled)

    Grant “While using the app” or “Always” depending on your preference:

    • While using the app — position updates only when the app is open
    • Always — enables background position updates for always-on mesh presence

    Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind.

    Notifications Permission

    Notifications alert you to:

    • Incoming messages from channels and direct messages
    • New nodes joining the mesh
    • Low battery on a remote node

    💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

    Critical Alerts Permission

    On supported devices, the app may request permission for critical alerts:

    • These are high-priority notifications that can break through Do Not Disturb mode
    • Useful for emergency mesh alerts or urgent messages
    • You can skip this step if you don’t need breakthrough notifications
    • Configure or revoke later in Android notification settings

    Reviewing permissions later

    Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time:

    State What tapping the row does
    Allowed Opens the system page, so you can review or revoke it
    Not asked yet Requests it
    Denied — tap to allow Explains what the permission is for, then asks again if you agree
    Blocked — tap to open system settings Android will no longer show its dialog, so this opens the page where you can turn it back on
    Not required on this version of Android Nothing — the permission does not exist on your device

    This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead.

    After Setup

    Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

    💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own.

    Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing.

    What’s Next?

    Once connected to a radio, explore:

    New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



    diff --git a/main/ro-rRO/user/connections.html b/main/ro-rRO/user/connections.html index 90a0272562..fee82fad4c 100644 --- a/main/ro-rRO/user/connections.html +++ b/main/ro-rRO/user/connections.html @@ -1 +1 @@ - Connections | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Română
    Meshtastic Docs ↗

    🌐 Română — Community translation View in English

    Connections

    Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

    Bluetooth (BLE)

    Bluetooth Low Energy is the default and most common connection method on Android.

    Pairing a Device

    1. Ensure your Meshtastic radio is powered on and in pairing mode.
    2. Open the app and navigate to the Connect tab.
    3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
    4. Select your device from the list.
    5. Accept the Bluetooth pairing prompt if shown.

    Scanning for Bluetooth devices, with a discovered radio in the list

    Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

    Transport selector

    💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device.

    Connection Status

    Icon State Descriere
    🟢 Conectat Active radio link established
    🟡 Conectare Handshake in progress
    🔴 Deconectat No active connection
    Not configured Nici un dispozitiv selectat

    When connecting, a status indicator shows the current connection state:

    Connecting status

    If no devices are found, the app shows an empty state with instructions:

    No devices found

    Troubleshooting Bluetooth

    • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
    • Connection drops: Move closer to the radio; check for interference.
    • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

    USB Serial

    USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

    Setup

    1. Connect your radio via USB cable to your device.
    2. The app will prompt for USB permission — tap Allow.
    3. The connection is established automatically.

    ⚠️ Note: USB connections require OTG support on Android devices.

    TCP/IP (Network)

    Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

    Connecting over the Network

    1. Make sure the radio is on the same local network as your phone/desktop.
    2. On the Connect screen, select Network in the transport selector.
    3. Choose the radio one of two ways:
      • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
      • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
    4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

    💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

    When to Use TCP

    • Radio is on the same local network
    • Testing with a simulated radio
    • Environments where Bluetooth has interference issues

    Reconnection Behavior

    The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

    To disconnect, tap the disconnect button on the Connect screen:

    Disconnect from radio

    Desktop Connections

    On Desktop (Linux/macOS/Windows), the app supports:

    • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
    • USB Serial — primary wired connection method
    • TCP/IP — for network-connected radios

    See Desktop App for platform-specific details and keyboard shortcuts.



    + Connections | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Română
    Meshtastic Docs ↗

    🌐 Română — Community translation View in English

    Connections

    Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

    Bluetooth (BLE)

    Bluetooth Low Energy is the default and most common connection method on Android.

    Pairing a Device

    1. Ensure your Meshtastic radio is powered on and in pairing mode.
    2. Open the app and navigate to the Connect tab.
    3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
    4. Select your device from the list.
    5. Accept the Bluetooth pairing prompt if shown.

    Scanning for Bluetooth devices, with a discovered radio in the list

    Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

    Transport selector

    💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range.

    The screen names anything on the app’s side that is blocking a scan, with the fix attached:

    What you see What it means
    A card asking for Nearby devices The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings.
    Bluetooth is off The adapter is disabled — the card opens Bluetooth settings.
    Bluetooth scanning also needs location services Android 11 and older only: the permission is held but the system location toggle is off.
    No card, empty list Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere.

    Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered.

    Connection Status

    Icon State Descriere
    🟢 Conectat Active radio link established
    🟡 Conectare Handshake in progress
    🔴 Deconectat No active connection
    Not configured Nici un dispozitiv selectat

    When connecting, a status indicator shows the current connection state:

    Connecting status

    If no devices are found, the app shows an empty state with instructions:

    No devices found

    Troubleshooting Bluetooth

    • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
    • Connection drops: Move closer to the radio; check for interference.
    • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

    USB Serial

    USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

    Setup

    1. Connect your radio via USB cable to your device.
    2. The app will prompt for USB permission — tap Allow.
    3. The connection is established automatically.

    ⚠️ Note: USB connections require OTG support on Android devices.

    TCP/IP (Network)

    Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

    Connecting over the Network

    1. Make sure the radio is on the same local network as your phone/desktop.
    2. On the Connect screen, select Network in the transport selector.
    3. Choose the radio one of two ways:
      • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
      • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
    4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

    💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

    When to Use TCP

    • Radio is on the same local network
    • Testing with a simulated radio
    • Environments where Bluetooth has interference issues

    Reconnection Behavior

    The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

    To disconnect, tap the disconnect button on the Connect screen:

    Disconnect from radio

    Desktop Connections

    On Desktop (Linux/macOS/Windows), the app supports:

    • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
    • USB Serial — primary wired connection method
    • TCP/IP — for network-connected radios

    See Desktop App for platform-specific details and keyboard shortcuts.



    diff --git a/main/ro-rRO/user/onboarding.html b/main/ro-rRO/user/onboarding.html index 355d788791..817f56b02d 100644 --- a/main/ro-rRO/user/onboarding.html +++ b/main/ro-rRO/user/onboarding.html @@ -1 +1 @@ - Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Română
    Meshtastic Docs ↗

    🌐 Română — Community translation View in English

    Getting Started

    Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

    First Launch

    When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings.

    Welcome Screen

    The welcome screen introduces Meshtastic and its core capabilities:

    • Off-grid mesh communication
    • No cellular or internet required
    • End-to-end encrypted messaging

    Tap Get Started to proceed through the setup flow.

    Welcome screen

    Permissions

    The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

    Bluetooth Permission

    Bluetooth is the primary connection method between your phone and Meshtastic radio:

    • Bluetooth scanning — discover nearby Meshtastic radios
    • Bluetooth connect — establish and maintain connections with paired radios

    Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

    Location Permission

    ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice.

    Meshtastic also uses your location for:

    • Showing your position on the mesh map
    • Calculating distances to other nodes
    • Sharing your GPS coordinates with other mesh members (if enabled)

    Grant “While using the app” or “Always” depending on your preference:

    • While using the app — position updates only when the app is open
    • Always — enables background position updates for always-on mesh presence

    If denied, Bluetooth scanning will not function and your node will not report a position.

    Notifications Permission

    Notifications alert you to:

    • Incoming messages from channels and direct messages
    • New nodes joining the mesh
    • Low battery on a remote node

    💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

    Critical Alerts Permission

    On supported devices, the app may request permission for critical alerts:

    • These are high-priority notifications that can break through Do Not Disturb mode
    • Useful for emergency mesh alerts or urgent messages
    • You can skip this step if you don’t need breakthrough notifications
    • Configure or revoke later in Android notification settings

    After Setup

    Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

    💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use.

    What’s Next?

    Once connected to a radio, explore:

    New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



    + Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Română
    Meshtastic Docs ↗

    🌐 Română — Community translation View in English

    Getting Started

    Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

    First Launch

    When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app.

    Welcome Screen

    The welcome screen introduces Meshtastic and its core capabilities:

    • Off-grid mesh communication
    • No cellular or internet required
    • End-to-end encrypted messaging

    Tap Get Started to proceed through the setup flow.

    Welcome screen

    Permissions

    The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

    Bluetooth Permission

    Bluetooth is the primary connection method between your phone and Meshtastic radio:

    • Bluetooth scanning — discover nearby Meshtastic radios
    • Bluetooth connect — establish and maintain connections with paired radios

    Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

    Location Permission

    ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio.

    Meshtastic also uses your location for:

    • Showing your position on the mesh map
    • Calculating distances to other nodes
    • Sharing your GPS coordinates with other mesh members (if enabled)

    Grant “While using the app” or “Always” depending on your preference:

    • While using the app — position updates only when the app is open
    • Always — enables background position updates for always-on mesh presence

    Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind.

    Notifications Permission

    Notifications alert you to:

    • Incoming messages from channels and direct messages
    • New nodes joining the mesh
    • Low battery on a remote node

    💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

    Critical Alerts Permission

    On supported devices, the app may request permission for critical alerts:

    • These are high-priority notifications that can break through Do Not Disturb mode
    • Useful for emergency mesh alerts or urgent messages
    • You can skip this step if you don’t need breakthrough notifications
    • Configure or revoke later in Android notification settings

    Reviewing permissions later

    Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time:

    State What tapping the row does
    Allowed Opens the system page, so you can review or revoke it
    Not asked yet Requests it
    Denied — tap to allow Explains what the permission is for, then asks again if you agree
    Blocked — tap to open system settings Android will no longer show its dialog, so this opens the page where you can turn it back on
    Not required on this version of Android Nothing — the permission does not exist on your device

    This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead.

    After Setup

    Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

    💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own.

    Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing.

    What’s Next?

    Once connected to a radio, explore:

    New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



    diff --git a/main/ru-rRU/user/connections.html b/main/ru-rRU/user/connections.html index c8a450dd3a..c4e9e1546d 100644 --- a/main/ru-rRU/user/connections.html +++ b/main/ru-rRU/user/connections.html @@ -1 +1 @@ - Соединения | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Русский
    Meshtastic Docs ↗

    🌐 Русский — Community translation View in English

    Соединения

    Meshtastic поддерживает несколько способов передачи данных между вашим телефоном/компьютером и радионодой.

    Bluetooth (BLE)

    Bluetooth Low Energy является наиболее распространенным методом подключения на Android.

    Привязка устройства

    1. Убедитесь, что устройство Meshtastic включено и находится в режиме сопряжения.
    2. Откройте приложение и перейдите на вкладку Подключение.
    3. Нажми Сканировать Bluetooth-устройства — рядом появятся радиостанции Meshtastic.
    4. Выберите ваше устройство из списка.
    5. Примите запрос на соединение Bluetooth, если показано.

    Сканирование устройств Bluetooth с обнаружением радиоустройств в списке

    Используйте селектор транспорта — ряд сегментированных кнопок под карточкой подключения — для переключения между транспортами Bluetooth, Network и USB (одновременно активен только один):

    Селектор транспорта

    💡 Подсказка: Если ваше радио Meshtastic не отображается, проверьте, предоставлены ли разрешения на Bluetooth и геолокацию, а также не подключено ли ваше радио к другому устройству.

    Статус подключения

    Иконка Состояние Описание
    🟢 Подключено Подключение активно
    🟡 Подключение Выполняется рукопожатие
    🔴 Отключено Нет активного соединения
    Не настроено Устройство не выбрано

    При подключении индикатор состояния показывает текущее состояние соединения:

    Состояние подключения

    Если устройства не найдены, приложение показывает пустое состояние с инструкциями:

    Устройства не найдены

    Устранение неполадок Bluetooth

    • Устройство не найдено: Выключи и снова включи Bluetooth, убедись, что включена служба определения местоположения.
    • Потеря связи: Подойди ближе к ноде; проверь наличие помех.
    • Сопряжение отклонено: Забыть устройство в настройках Bluetooth на Android и повторить попытку.

    Последовательный USB

    Подключения через USB предоставляют проводную альтернативу, полезную для настольных компьютеров или когда Bluetooth недоступен.

    Настройка

    1. Подключи свою ноду к устройству с помощью USB-кабеля.
    2. Приложение запросит разрешение на доступ к USB — нажми Разрешить.
    3. Соединение устанавливается автоматически.

    ⚠️ Примечание: Для подключения USB требуется поддержка OTG на устройствах Android.

    TCP/IP (Сеть)

    Некоторые радиостанции Meshtastic поддерживают подключение по WiFi/Ethernet, что позволяет устанавливать TCP-соединения через локальную сеть. Сначала подключи радиоустройство к своей сети — используя его собственные настройки Wi-Fi (через веб-интерфейс прошивки или другое подключение) — затем подключайся к нему через приложение.

    Подключение к сети

    1. Убедись, что радио подключено к той же локальной сети, что и твой телефон/компьютер.
    2. На экране “Подключение” выберите Network в селекторе транспорта.
    3. Выбери радиоустройство одним из двух способов:
      • Сканировать сетевые устройства — включи эту опцию чтобы автоматически обнаруживать радиоустройства, которые объявляют о себе в локальной сети (mDNS / _meshtastic._tcp). Обнаруженные устройства появляются в списке; нажми на одно, чтобы подключиться.
      • Добавить устройство вручную… — введи IP-адрес радиостанции (или имя хоста) и порт (по умолчанию: 4403).
    4. Ранее использованные сетевые адреса запоминаются в разделе Недавние сетевые устройства для быстрого повторного подключения (удерживай пальцем, чтобы удалить).

    💡 Совет: Обнаружение сети использует mDNS, который работает только когда оба устройства находятся в одной подсети. На Android 17+ приложению нужно разрешение на локальную сеть для сканирования; если поиск ничего не находит, добавь устройство вручную по IP.

    Когда использовать TCP

    • Радиостанция находится в той же локальной сети
    • Тестирование с использованием имитирования радиоприемника
    • Окружающая среда, где возникают помехи Bluetooth

    Поведение при повторном подключении

    Приложение подключается к последнему выбранному устройству при запуске. Вы можете переключать транспорт с экрана подключения в любое время.

    Чтобы отключиться, нажми кнопку отключения на экране подключения:

    Отключение от радиоприёмника

    Подключение к компьютеру

    На компьютере (Linux/macOS/Windows) приложение поддерживает:

    • Bluetooth (BLE) — через библиотеку Kable; работает на macOS, Linux и Windows
    • Последовательный USB — основной способ проводного подключения
    • TCP/IP — для радиостанций, подключенных к сети

    См. десктопное приложение для информации о платформе и сочетаниях клавиш.

    Связанные темы



    + Соединения | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Русский
    Meshtastic Docs ↗

    🌐 Русский — Community translation View in English

    Соединения

    Meshtastic поддерживает несколько способов передачи данных между вашим телефоном/компьютером и радионодой.

    Bluetooth (BLE)

    Bluetooth Low Energy является наиболее распространенным методом подключения на Android.

    Привязка устройства

    1. Убедитесь, что устройство Meshtastic включено и находится в режиме сопряжения.
    2. Откройте приложение и перейдите на вкладку Подключение.
    3. Нажми Сканировать Bluetooth-устройства — рядом появятся радиостанции Meshtastic.
    4. Выберите ваше устройство из списка.
    5. Примите запрос на соединение Bluetooth, если показано.

    Сканирование устройств Bluetooth с обнаружением радиоустройств в списке

    Используйте селектор транспорта — ряд сегментированных кнопок под карточкой подключения — для переключения между транспортами Bluetooth, Network и USB (одновременно активен только один):

    Селектор транспорта

    💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range.

    The screen names anything on the app’s side that is blocking a scan, with the fix attached:

    What you see Что это значит
    A card asking for Nearby devices The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings.
    Bluetooth is off The adapter is disabled — the card opens Bluetooth settings.
    Bluetooth scanning also needs location services Android 11 and older only: the permission is held but the system location toggle is off.
    No card, empty list Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere.

    Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered.

    Статус подключения

    Иконка Состояние Описание
    🟢 Подключено Подключение активно
    🟡 Подключение Выполняется рукопожатие
    🔴 Отключено Нет активного соединения
    Не настроено Устройство не выбрано

    При подключении индикатор состояния показывает текущее состояние соединения:

    Состояние подключения

    Если устройства не найдены, приложение показывает пустое состояние с инструкциями:

    Устройства не найдены

    Устранение неполадок Bluetooth

    • Устройство не найдено: Выключи и снова включи Bluetooth, убедись, что включена служба определения местоположения.
    • Потеря связи: Подойди ближе к ноде; проверь наличие помех.
    • Сопряжение отклонено: Забыть устройство в настройках Bluetooth на Android и повторить попытку.

    Последовательный USB

    Подключения через USB предоставляют проводную альтернативу, полезную для настольных компьютеров или когда Bluetooth недоступен.

    Настройка

    1. Подключи свою ноду к устройству с помощью USB-кабеля.
    2. Приложение запросит разрешение на доступ к USB — нажми Разрешить.
    3. Соединение устанавливается автоматически.

    ⚠️ Примечание: Для подключения USB требуется поддержка OTG на устройствах Android.

    TCP/IP (Сеть)

    Некоторые радиостанции Meshtastic поддерживают подключение по WiFi/Ethernet, что позволяет устанавливать TCP-соединения через локальную сеть. Сначала подключи радиоустройство к своей сети — используя его собственные настройки Wi-Fi (через веб-интерфейс прошивки или другое подключение) — затем подключайся к нему через приложение.

    Подключение к сети

    1. Убедись, что радио подключено к той же локальной сети, что и твой телефон/компьютер.
    2. На экране “Подключение” выберите Network в селекторе транспорта.
    3. Выбери радиоустройство одним из двух способов:
      • Сканировать сетевые устройства — включи эту опцию чтобы автоматически обнаруживать радиоустройства, которые объявляют о себе в локальной сети (mDNS / _meshtastic._tcp). Обнаруженные устройства появляются в списке; нажми на одно, чтобы подключиться.
      • Добавить устройство вручную… — введи IP-адрес радиостанции (или имя хоста) и порт (по умолчанию: 4403).
    4. Ранее использованные сетевые адреса запоминаются в разделе Недавние сетевые устройства для быстрого повторного подключения (удерживай пальцем, чтобы удалить).

    💡 Совет: Обнаружение сети использует mDNS, который работает только когда оба устройства находятся в одной подсети. На Android 17+ приложению нужно разрешение на локальную сеть для сканирования; если поиск ничего не находит, добавь устройство вручную по IP.

    Когда использовать TCP

    • Радиостанция находится в той же локальной сети
    • Тестирование с использованием имитирования радиоприемника
    • Окружающая среда, где возникают помехи Bluetooth

    Поведение при повторном подключении

    Приложение подключается к последнему выбранному устройству при запуске. Вы можете переключать транспорт с экрана подключения в любое время.

    Чтобы отключиться, нажми кнопку отключения на экране подключения:

    Отключение от радиоприёмника

    Подключение к компьютеру

    На компьютере (Linux/macOS/Windows) приложение поддерживает:

    • Bluetooth (BLE) — через библиотеку Kable; работает на macOS, Linux и Windows
    • Последовательный USB — основной способ проводного подключения
    • TCP/IP — для радиостанций, подключенных к сети

    См. десктопное приложение для информации о платформе и сочетаниях клавиш.

    Связанные темы



    diff --git a/main/ru-rRU/user/onboarding.html b/main/ru-rRU/user/onboarding.html index d2a91ec17b..86fc6c7adc 100644 --- a/main/ru-rRU/user/onboarding.html +++ b/main/ru-rRU/user/onboarding.html @@ -1 +1 @@ - Начало работы | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Русский
    Meshtastic Docs ↗

    🌐 Русский — Community translation View in English

    Начало работы

    Добро пожаловать в Meshtastic! Это руководство проведет тебя через начальную настройку приложения Meshtastic для Android.

    Первый запуск

    Когда ты запускаешь приложение впервые, то будет предложено пройти через начальный процесс, который поможет настроить основные разрешения и параметры. Каждый шаг нужно выполнить по порядку, или же можешь пропустить его и настроить разрешения позже в настройках Android.

    Экран приветствия

    Экран приветствия представляет Meshtastic и его основные возможности:

    • Автономная mesh-связь
    • Не требуется мобильная связь или интернет
    • Сквозное шифрование сообщений

    Нажми Начать для перехода к настройке.

    Экран приветствия

    Разрешения

    Приложение запрашивает несколько разрешений во время настройки. Каждое из них служит определенной цели, и некоторые необходимы для основной функциональности.

    Разрешения Bluetooth

    Bluetooth является основным методом соединения между телефоном и радиостанцией Meshtastic:

    • Сканирование Bluetooth — обнаружение ближайших радиостанций Meshtastic
    • Подключение по Bluetooth — установка и поддержание соединения с сопряжёнными радиоустройствами

    Предоставь оба разрешения при запросе. Без Bluetooth тебе придется использовать USB или TCP соединения.

    Разрешение на доступ к местоположению

    ⚠️ Почему для Bluetooth требуется местоположение? Android требует разрешение на определение местоположения для обнаружения устройств Bluetooth Low Energy поблизости. Это требование системы Android, а не специфический выбор Meshtastic.

    Meshtastic также использует местоположение для:

    • Показ вашего положения на карте
    • Вычисление расстояний до других нод
    • Обмен GPS-координатами с другими участниками сети (если включено)

    Предоставь доступ “При использовании приложения” или “Всегда” в зависимости от своих предпочтений:

    • При использовании приложения — обновление местоположения происходит только когда приложение открыто
    • Всегда — включает обновления позиции в фоновом режиме для активного присутствия в сети

    Если доступ будет запрещен, сканирование Bluetooth не будет работать, и нода не будет сообщать о положении.

    Разрешение на уведомления

    Уведомления оповещают тебя о:

    • Входящие сообщения из каналов и личных сообщений
    • Новые ноды, присоединившиеся к сети
    • Низкий заряд на удаленной ноде

    💡 Совет: Ты можешь тонко настроить уведомления позже в настройках системы — приложение создает отдельный канал уведомлений по категориям (плюс несколько внутренних, как фоновая служба), поэтому ты можешь включить или заглушить их по отдельности.

    Разрешение на критические уведомления

    На поддерживаемых устройствах приложение может запрашивать разрешение на критические уведомления:

    • Это уведомления высокого приоритета, которые могут прерывать режим “Не беспокоить”
    • Полезно для экстренных уведомлений в mesh-сети или срочных сообщений
    • Вы можете пропустить этот шаг, если не нужны уведомления о прорывах
    • Настроить или отменить можно позже в настройках уведомлений Android

    После настройки

    Как только разрешения предоставлены, приложение переходит к основному интерфейсу. Ваше первое действие должно заключаться в подключении к радиостанции Meshtastic — см. Подключения для подробных инструкций.

    💡 Совет: Если ты пропустил какие-либо разрешения во время настройки, то можешь выдать их позже через Настройки Android → Приложения → Meshtastic → Разрешения. Приложение снова запросит у тебя разрешение, если отсутствующее разрешение блокирует функцию, которую ты пытаешься использовать.

    Что дальше?

    После подключения к радиостанции, исследуй:

    Новичок в Meshtastic? Руководство по началу работы на meshtastic.org охватывает выбор оборудования, начальную настройку радиостанции и первую установку сети.



    + Начало работы | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Русский
    Meshtastic Docs ↗

    🌐 Русский — Community translation View in English

    Начало работы

    Добро пожаловать в Meshtastic! Это руководство проведет тебя через начальную настройку приложения Meshtastic для Android.

    Первый запуск

    Когда ты запускаешь приложение впервые, то будет предложено пройти через начальный процесс, который поможет настроить основные разрешения и параметры. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app.

    Экран приветствия

    Экран приветствия представляет Meshtastic и его основные возможности:

    • Автономная mesh-связь
    • Не требуется мобильная связь или интернет
    • Сквозное шифрование сообщений

    Нажми Начать для перехода к настройке.

    Экран приветствия

    Разрешения

    Приложение запрашивает несколько разрешений во время настройки. Каждое из них служит определенной цели, и некоторые необходимы для основной функциональности.

    Разрешения Bluetooth

    Bluetooth является основным методом соединения между телефоном и радиостанцией Meshtastic:

    • Сканирование Bluetooth — обнаружение ближайших радиостанций Meshtastic
    • Подключение по Bluetooth — установка и поддержание соединения с сопряжёнными радиоустройствами

    Предоставь оба разрешения при запросе. Без Bluetooth тебе придется использовать USB или TCP соединения.

    Разрешение на доступ к местоположению

    ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio.

    Meshtastic также использует местоположение для:

    • Показ вашего положения на карте
    • Вычисление расстояний до других нод
    • Обмен GPS-координатами с другими участниками сети (если включено)

    Предоставь доступ “При использовании приложения” или “Всегда” в зависимости от своих предпочтений:

    • При использовании приложения — обновление местоположения происходит только когда приложение открыто
    • Всегда — включает обновления позиции в фоновом режиме для активного присутствия в сети

    Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind.

    Разрешение на уведомления

    Уведомления оповещают тебя о:

    • Входящие сообщения из каналов и личных сообщений
    • Новые ноды, присоединившиеся к сети
    • Низкий заряд на удаленной ноде

    💡 Совет: Ты можешь тонко настроить уведомления позже в настройках системы — приложение создает отдельный канал уведомлений по категориям (плюс несколько внутренних, как фоновая служба), поэтому ты можешь включить или заглушить их по отдельности.

    Разрешение на критические уведомления

    На поддерживаемых устройствах приложение может запрашивать разрешение на критические уведомления:

    • Это уведомления высокого приоритета, которые могут прерывать режим “Не беспокоить”
    • Полезно для экстренных уведомлений в mesh-сети или срочных сообщений
    • Вы можете пропустить этот шаг, если не нужны уведомления о прорывах
    • Настроить или отменить можно позже в настройках уведомлений Android

    Reviewing permissions later

    Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time:

    Состояние What tapping the row does
    Allowed Opens the system page, so you can review or revoke it
    Not asked yet Requests it
    Denied — tap to allow Explains what the permission is for, then asks again if you agree
    Blocked — tap to open system settings Android will no longer show its dialog, so this opens the page where you can turn it back on
    Not required on this version of Android Nothing — the permission does not exist on your device

    This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead.

    После настройки

    Как только разрешения предоставлены, приложение переходит к основному интерфейсу. Ваше первое действие должно заключаться в подключении к радиостанции Meshtastic — см. Подключения для подробных инструкций.

    💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own.

    Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing.

    Что дальше?

    После подключения к радиостанции, исследуй:

    Новичок в Meshtastic? Руководство по началу работы на meshtastic.org охватывает выбор оборудования, начальную настройку радиостанции и первую установку сети.



    diff --git a/main/sk-rSK/user/connections.html b/main/sk-rSK/user/connections.html index c8fc73a671..314a208bf4 100644 --- a/main/sk-rSK/user/connections.html +++ b/main/sk-rSK/user/connections.html @@ -1 +1 @@ - Connections | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Slovenčina
    Meshtastic Docs ↗

    🌐 Slovenčina — Community translation View in English

    Connections

    Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

    Bluetooth (BLE)

    Bluetooth Low Energy is the default and most common connection method on Android.

    Pairing a Device

    1. Ensure your Meshtastic radio is powered on and in pairing mode.
    2. Open the app and navigate to the Connect tab.
    3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
    4. Select your device from the list.
    5. Accept the Bluetooth pairing prompt if shown.

    Scanning for Bluetooth devices, with a discovered radio in the list

    Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

    Transport selector

    💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device.

    Connection Status

    Icon State Popis
    🟢 Pripojený Active radio link established
    🟡 Prebieha pripájanie Handshake in progress
    🔴 Odpojené No active connection
    Not configured Nebolo vybrané žiadne zariadenie

    When connecting, a status indicator shows the current connection state:

    Connecting status

    If no devices are found, the app shows an empty state with instructions:

    No devices found

    Troubleshooting Bluetooth

    • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
    • Connection drops: Move closer to the radio; check for interference.
    • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

    USB Serial

    USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

    Setup

    1. Connect your radio via USB cable to your device.
    2. The app will prompt for USB permission — tap Allow.
    3. The connection is established automatically.

    ⚠️ Note: USB connections require OTG support on Android devices.

    TCP/IP (Network)

    Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

    Connecting over the Network

    1. Make sure the radio is on the same local network as your phone/desktop.
    2. On the Connect screen, select Network in the transport selector.
    3. Choose the radio one of two ways:
      • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
      • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
    4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

    💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

    When to Use TCP

    • Radio is on the same local network
    • Testing with a simulated radio
    • Environments where Bluetooth has interference issues

    Reconnection Behavior

    The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

    To disconnect, tap the disconnect button on the Connect screen:

    Disconnect from radio

    Desktop Connections

    On Desktop (Linux/macOS/Windows), the app supports:

    • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
    • USB Serial — primary wired connection method
    • TCP/IP — for network-connected radios

    See Desktop App for platform-specific details and keyboard shortcuts.



    + Connections | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Slovenčina
    Meshtastic Docs ↗

    🌐 Slovenčina — Community translation View in English

    Connections

    Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

    Bluetooth (BLE)

    Bluetooth Low Energy is the default and most common connection method on Android.

    Pairing a Device

    1. Ensure your Meshtastic radio is powered on and in pairing mode.
    2. Open the app and navigate to the Connect tab.
    3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
    4. Select your device from the list.
    5. Accept the Bluetooth pairing prompt if shown.

    Scanning for Bluetooth devices, with a discovered radio in the list

    Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

    Transport selector

    💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range.

    The screen names anything on the app’s side that is blocking a scan, with the fix attached:

    What you see What it means
    A card asking for Nearby devices The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings.
    Bluetooth is off The adapter is disabled — the card opens Bluetooth settings.
    Bluetooth scanning also needs location services Android 11 and older only: the permission is held but the system location toggle is off.
    No card, empty list Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere.

    Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered.

    Connection Status

    Icon State Popis
    🟢 Pripojený Active radio link established
    🟡 Prebieha pripájanie Handshake in progress
    🔴 Odpojené No active connection
    Not configured Nebolo vybrané žiadne zariadenie

    When connecting, a status indicator shows the current connection state:

    Connecting status

    If no devices are found, the app shows an empty state with instructions:

    No devices found

    Troubleshooting Bluetooth

    • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
    • Connection drops: Move closer to the radio; check for interference.
    • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

    USB Serial

    USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

    Setup

    1. Connect your radio via USB cable to your device.
    2. The app will prompt for USB permission — tap Allow.
    3. The connection is established automatically.

    ⚠️ Note: USB connections require OTG support on Android devices.

    TCP/IP (Network)

    Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

    Connecting over the Network

    1. Make sure the radio is on the same local network as your phone/desktop.
    2. On the Connect screen, select Network in the transport selector.
    3. Choose the radio one of two ways:
      • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
      • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
    4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

    💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

    When to Use TCP

    • Radio is on the same local network
    • Testing with a simulated radio
    • Environments where Bluetooth has interference issues

    Reconnection Behavior

    The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

    To disconnect, tap the disconnect button on the Connect screen:

    Disconnect from radio

    Desktop Connections

    On Desktop (Linux/macOS/Windows), the app supports:

    • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
    • USB Serial — primary wired connection method
    • TCP/IP — for network-connected radios

    See Desktop App for platform-specific details and keyboard shortcuts.



    diff --git a/main/sk-rSK/user/onboarding.html b/main/sk-rSK/user/onboarding.html index c41039123a..7ff4da0b19 100644 --- a/main/sk-rSK/user/onboarding.html +++ b/main/sk-rSK/user/onboarding.html @@ -1 +1 @@ - Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Slovenčina
    Meshtastic Docs ↗

    🌐 Slovenčina — Community translation View in English

    Getting Started

    Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

    First Launch

    When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings.

    Welcome Screen

    The welcome screen introduces Meshtastic and its core capabilities:

    • Off-grid mesh communication
    • No cellular or internet required
    • End-to-end encrypted messaging

    Tap Get Started to proceed through the setup flow.

    Welcome screen

    Permissions

    The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

    Bluetooth Permission

    Bluetooth is the primary connection method between your phone and Meshtastic radio:

    • Bluetooth scanning — discover nearby Meshtastic radios
    • Bluetooth connect — establish and maintain connections with paired radios

    Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

    Location Permission

    ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice.

    Meshtastic also uses your location for:

    • Showing your position on the mesh map
    • Calculating distances to other nodes
    • Sharing your GPS coordinates with other mesh members (if enabled)

    Grant “While using the app” or “Always” depending on your preference:

    • While using the app — position updates only when the app is open
    • Always — enables background position updates for always-on mesh presence

    If denied, Bluetooth scanning will not function and your node will not report a position.

    Notifications Permission

    Notifications alert you to:

    • Incoming messages from channels and direct messages
    • New nodes joining the mesh
    • Low battery on a remote node

    💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

    Critical Alerts Permission

    On supported devices, the app may request permission for critical alerts:

    • These are high-priority notifications that can break through Do Not Disturb mode
    • Useful for emergency mesh alerts or urgent messages
    • You can skip this step if you don’t need breakthrough notifications
    • Configure or revoke later in Android notification settings

    After Setup

    Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

    💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use.

    What’s Next?

    Once connected to a radio, explore:

    New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



    + Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Slovenčina
    Meshtastic Docs ↗

    🌐 Slovenčina — Community translation View in English

    Getting Started

    Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

    First Launch

    When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app.

    Welcome Screen

    The welcome screen introduces Meshtastic and its core capabilities:

    • Off-grid mesh communication
    • No cellular or internet required
    • End-to-end encrypted messaging

    Tap Get Started to proceed through the setup flow.

    Welcome screen

    Permissions

    The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

    Bluetooth Permission

    Bluetooth is the primary connection method between your phone and Meshtastic radio:

    • Bluetooth scanning — discover nearby Meshtastic radios
    • Bluetooth connect — establish and maintain connections with paired radios

    Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

    Location Permission

    ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio.

    Meshtastic also uses your location for:

    • Showing your position on the mesh map
    • Calculating distances to other nodes
    • Sharing your GPS coordinates with other mesh members (if enabled)

    Grant “While using the app” or “Always” depending on your preference:

    • While using the app — position updates only when the app is open
    • Always — enables background position updates for always-on mesh presence

    Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind.

    Notifications Permission

    Notifications alert you to:

    • Incoming messages from channels and direct messages
    • New nodes joining the mesh
    • Low battery on a remote node

    💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

    Critical Alerts Permission

    On supported devices, the app may request permission for critical alerts:

    • These are high-priority notifications that can break through Do Not Disturb mode
    • Useful for emergency mesh alerts or urgent messages
    • You can skip this step if you don’t need breakthrough notifications
    • Configure or revoke later in Android notification settings

    Reviewing permissions later

    Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time:

    State What tapping the row does
    Allowed Opens the system page, so you can review or revoke it
    Not asked yet Requests it
    Denied — tap to allow Explains what the permission is for, then asks again if you agree
    Blocked — tap to open system settings Android will no longer show its dialog, so this opens the page where you can turn it back on
    Not required on this version of Android Nothing — the permission does not exist on your device

    This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead.

    After Setup

    Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

    💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own.

    Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing.

    What’s Next?

    Once connected to a radio, explore:

    New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



    diff --git a/main/sl-rSI/user/connections.html b/main/sl-rSI/user/connections.html index cf1b7c20f1..9754ce3a8b 100644 --- a/main/sl-rSI/user/connections.html +++ b/main/sl-rSI/user/connections.html @@ -1 +1 @@ - Connections | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Slovenščina
    Meshtastic Docs ↗

    🌐 Slovenščina — Community translation View in English

    Connections

    Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

    Bluetooth (BLE)

    Bluetooth Low Energy is the default and most common connection method on Android.

    Pairing a Device

    1. Ensure your Meshtastic radio is powered on and in pairing mode.
    2. Open the app and navigate to the Connect tab.
    3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
    4. Select your device from the list.
    5. Accept the Bluetooth pairing prompt if shown.

    Scanning for Bluetooth devices, with a discovered radio in the list

    Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

    Transport selector

    💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device.

    Connection Status

    Icon State Opis
    🟢 Connected Active radio link established
    🟡 Connecting Handshake in progress
    🔴 Prekinjeno No active connection
    Not configured No device selected

    When connecting, a status indicator shows the current connection state:

    Connecting status

    If no devices are found, the app shows an empty state with instructions:

    No devices found

    Troubleshooting Bluetooth

    • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
    • Connection drops: Move closer to the radio; check for interference.
    • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

    USB Serial

    USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

    Setup

    1. Connect your radio via USB cable to your device.
    2. The app will prompt for USB permission — tap Allow.
    3. The connection is established automatically.

    ⚠️ Note: USB connections require OTG support on Android devices.

    TCP/IP (Network)

    Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

    Connecting over the Network

    1. Make sure the radio is on the same local network as your phone/desktop.
    2. On the Connect screen, select Network in the transport selector.
    3. Choose the radio one of two ways:
      • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
      • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
    4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

    💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

    When to Use TCP

    • Radio is on the same local network
    • Testing with a simulated radio
    • Environments where Bluetooth has interference issues

    Reconnection Behavior

    The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

    To disconnect, tap the disconnect button on the Connect screen:

    Disconnect from radio

    Desktop Connections

    On Desktop (Linux/macOS/Windows), the app supports:

    • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
    • USB Serial — primary wired connection method
    • TCP/IP — for network-connected radios

    See Desktop App for platform-specific details and keyboard shortcuts.



    + Connections | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Slovenščina
    Meshtastic Docs ↗

    🌐 Slovenščina — Community translation View in English

    Connections

    Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

    Bluetooth (BLE)

    Bluetooth Low Energy is the default and most common connection method on Android.

    Pairing a Device

    1. Ensure your Meshtastic radio is powered on and in pairing mode.
    2. Open the app and navigate to the Connect tab.
    3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
    4. Select your device from the list.
    5. Accept the Bluetooth pairing prompt if shown.

    Scanning for Bluetooth devices, with a discovered radio in the list

    Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

    Transport selector

    💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range.

    The screen names anything on the app’s side that is blocking a scan, with the fix attached:

    What you see What it means
    A card asking for Nearby devices The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings.
    Bluetooth is off The adapter is disabled — the card opens Bluetooth settings.
    Bluetooth scanning also needs location services Android 11 and older only: the permission is held but the system location toggle is off.
    No card, empty list Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere.

    Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered.

    Connection Status

    Icon State Opis
    🟢 Connected Active radio link established
    🟡 Connecting Handshake in progress
    🔴 Prekinjeno No active connection
    Not configured No device selected

    When connecting, a status indicator shows the current connection state:

    Connecting status

    If no devices are found, the app shows an empty state with instructions:

    No devices found

    Troubleshooting Bluetooth

    • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
    • Connection drops: Move closer to the radio; check for interference.
    • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

    USB Serial

    USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

    Setup

    1. Connect your radio via USB cable to your device.
    2. The app will prompt for USB permission — tap Allow.
    3. The connection is established automatically.

    ⚠️ Note: USB connections require OTG support on Android devices.

    TCP/IP (Network)

    Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

    Connecting over the Network

    1. Make sure the radio is on the same local network as your phone/desktop.
    2. On the Connect screen, select Network in the transport selector.
    3. Choose the radio one of two ways:
      • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
      • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
    4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

    💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

    When to Use TCP

    • Radio is on the same local network
    • Testing with a simulated radio
    • Environments where Bluetooth has interference issues

    Reconnection Behavior

    The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

    To disconnect, tap the disconnect button on the Connect screen:

    Disconnect from radio

    Desktop Connections

    On Desktop (Linux/macOS/Windows), the app supports:

    • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
    • USB Serial — primary wired connection method
    • TCP/IP — for network-connected radios

    See Desktop App for platform-specific details and keyboard shortcuts.



    diff --git a/main/sl-rSI/user/onboarding.html b/main/sl-rSI/user/onboarding.html index b21a705edb..c27d235d2e 100644 --- a/main/sl-rSI/user/onboarding.html +++ b/main/sl-rSI/user/onboarding.html @@ -1 +1 @@ - Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Slovenščina
    Meshtastic Docs ↗

    🌐 Slovenščina — Community translation View in English

    Getting Started

    Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

    First Launch

    When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings.

    Welcome Screen

    The welcome screen introduces Meshtastic and its core capabilities:

    • Off-grid mesh communication
    • No cellular or internet required
    • End-to-end encrypted messaging

    Tap Get Started to proceed through the setup flow.

    Welcome screen

    Permissions

    The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

    Bluetooth Permission

    Bluetooth is the primary connection method between your phone and Meshtastic radio:

    • Bluetooth scanning — discover nearby Meshtastic radios
    • Bluetooth connect — establish and maintain connections with paired radios

    Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

    Location Permission

    ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice.

    Meshtastic also uses your location for:

    • Showing your position on the mesh map
    • Calculating distances to other nodes
    • Sharing your GPS coordinates with other mesh members (if enabled)

    Grant “While using the app” or “Always” depending on your preference:

    • While using the app — position updates only when the app is open
    • Always — enables background position updates for always-on mesh presence

    If denied, Bluetooth scanning will not function and your node will not report a position.

    Notifications Permission

    Notifications alert you to:

    • Incoming messages from channels and direct messages
    • New nodes joining the mesh
    • Low battery on a remote node

    💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

    Critical Alerts Permission

    On supported devices, the app may request permission for critical alerts:

    • These are high-priority notifications that can break through Do Not Disturb mode
    • Useful for emergency mesh alerts or urgent messages
    • You can skip this step if you don’t need breakthrough notifications
    • Configure or revoke later in Android notification settings

    After Setup

    Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

    💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use.

    What’s Next?

    Once connected to a radio, explore:

    New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



    + Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Slovenščina
    Meshtastic Docs ↗

    🌐 Slovenščina — Community translation View in English

    Getting Started

    Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

    First Launch

    When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app.

    Welcome Screen

    The welcome screen introduces Meshtastic and its core capabilities:

    • Off-grid mesh communication
    • No cellular or internet required
    • End-to-end encrypted messaging

    Tap Get Started to proceed through the setup flow.

    Welcome screen

    Permissions

    The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

    Bluetooth Permission

    Bluetooth is the primary connection method between your phone and Meshtastic radio:

    • Bluetooth scanning — discover nearby Meshtastic radios
    • Bluetooth connect — establish and maintain connections with paired radios

    Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

    Location Permission

    ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio.

    Meshtastic also uses your location for:

    • Showing your position on the mesh map
    • Calculating distances to other nodes
    • Sharing your GPS coordinates with other mesh members (if enabled)

    Grant “While using the app” or “Always” depending on your preference:

    • While using the app — position updates only when the app is open
    • Always — enables background position updates for always-on mesh presence

    Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind.

    Notifications Permission

    Notifications alert you to:

    • Incoming messages from channels and direct messages
    • New nodes joining the mesh
    • Low battery on a remote node

    💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

    Critical Alerts Permission

    On supported devices, the app may request permission for critical alerts:

    • These are high-priority notifications that can break through Do Not Disturb mode
    • Useful for emergency mesh alerts or urgent messages
    • You can skip this step if you don’t need breakthrough notifications
    • Configure or revoke later in Android notification settings

    Reviewing permissions later

    Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time:

    State What tapping the row does
    Allowed Opens the system page, so you can review or revoke it
    Not asked yet Requests it
    Denied — tap to allow Explains what the permission is for, then asks again if you agree
    Blocked — tap to open system settings Android will no longer show its dialog, so this opens the page where you can turn it back on
    Not required on this version of Android Nothing — the permission does not exist on your device

    This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead.

    After Setup

    Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

    💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own.

    Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing.

    What’s Next?

    Once connected to a radio, explore:

    New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



    diff --git a/main/sq-rAL/user/connections.html b/main/sq-rAL/user/connections.html index 82c03788e6..437abedd04 100644 --- a/main/sq-rAL/user/connections.html +++ b/main/sq-rAL/user/connections.html @@ -1 +1 @@ - Connections | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Shqip
    Meshtastic Docs ↗

    🌐 Shqip — Community translation View in English

    Connections

    Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

    Bluetooth (BLE)

    Bluetooth Low Energy is the default and most common connection method on Android.

    Pairing a Device

    1. Ensure your Meshtastic radio is powered on and in pairing mode.
    2. Open the app and navigate to the Connect tab.
    3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
    4. Select your device from the list.
    5. Accept the Bluetooth pairing prompt if shown.

    Scanning for Bluetooth devices, with a discovered radio in the list

    Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

    Transport selector

    💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device.

    Connection Status

    Icon State Përshkrimi
    🟢 Connected Active radio link established
    🟡 Connecting Handshake in progress
    🔴 I shkëputur No active connection
    Not configured No device selected

    When connecting, a status indicator shows the current connection state:

    Connecting status

    If no devices are found, the app shows an empty state with instructions:

    No devices found

    Troubleshooting Bluetooth

    • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
    • Connection drops: Move closer to the radio; check for interference.
    • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

    USB Serial

    USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

    Setup

    1. Connect your radio via USB cable to your device.
    2. The app will prompt for USB permission — tap Allow.
    3. The connection is established automatically.

    ⚠️ Note: USB connections require OTG support on Android devices.

    TCP/IP (Network)

    Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

    Connecting over the Network

    1. Make sure the radio is on the same local network as your phone/desktop.
    2. On the Connect screen, select Network in the transport selector.
    3. Choose the radio one of two ways:
      • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
      • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
    4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

    💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

    When to Use TCP

    • Radio is on the same local network
    • Testing with a simulated radio
    • Environments where Bluetooth has interference issues

    Reconnection Behavior

    The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

    To disconnect, tap the disconnect button on the Connect screen:

    Disconnect from radio

    Desktop Connections

    On Desktop (Linux/macOS/Windows), the app supports:

    • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
    • USB Serial — primary wired connection method
    • TCP/IP — for network-connected radios

    See Desktop App for platform-specific details and keyboard shortcuts.



    + Connections | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Shqip
    Meshtastic Docs ↗

    🌐 Shqip — Community translation View in English

    Connections

    Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

    Bluetooth (BLE)

    Bluetooth Low Energy is the default and most common connection method on Android.

    Pairing a Device

    1. Ensure your Meshtastic radio is powered on and in pairing mode.
    2. Open the app and navigate to the Connect tab.
    3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
    4. Select your device from the list.
    5. Accept the Bluetooth pairing prompt if shown.

    Scanning for Bluetooth devices, with a discovered radio in the list

    Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

    Transport selector

    💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range.

    The screen names anything on the app’s side that is blocking a scan, with the fix attached:

    What you see What it means
    A card asking for Nearby devices The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings.
    Bluetooth is off The adapter is disabled — the card opens Bluetooth settings.
    Bluetooth scanning also needs location services Android 11 and older only: the permission is held but the system location toggle is off.
    No card, empty list Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere.

    Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered.

    Connection Status

    Icon State Përshkrimi
    🟢 Connected Active radio link established
    🟡 Connecting Handshake in progress
    🔴 I shkëputur No active connection
    Not configured No device selected

    When connecting, a status indicator shows the current connection state:

    Connecting status

    If no devices are found, the app shows an empty state with instructions:

    No devices found

    Troubleshooting Bluetooth

    • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
    • Connection drops: Move closer to the radio; check for interference.
    • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

    USB Serial

    USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

    Setup

    1. Connect your radio via USB cable to your device.
    2. The app will prompt for USB permission — tap Allow.
    3. The connection is established automatically.

    ⚠️ Note: USB connections require OTG support on Android devices.

    TCP/IP (Network)

    Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

    Connecting over the Network

    1. Make sure the radio is on the same local network as your phone/desktop.
    2. On the Connect screen, select Network in the transport selector.
    3. Choose the radio one of two ways:
      • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
      • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
    4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

    💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

    When to Use TCP

    • Radio is on the same local network
    • Testing with a simulated radio
    • Environments where Bluetooth has interference issues

    Reconnection Behavior

    The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

    To disconnect, tap the disconnect button on the Connect screen:

    Disconnect from radio

    Desktop Connections

    On Desktop (Linux/macOS/Windows), the app supports:

    • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
    • USB Serial — primary wired connection method
    • TCP/IP — for network-connected radios

    See Desktop App for platform-specific details and keyboard shortcuts.



    diff --git a/main/sq-rAL/user/onboarding.html b/main/sq-rAL/user/onboarding.html index ebcf209466..287cfd355c 100644 --- a/main/sq-rAL/user/onboarding.html +++ b/main/sq-rAL/user/onboarding.html @@ -1 +1 @@ - Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Shqip
    Meshtastic Docs ↗

    🌐 Shqip — Community translation View in English

    Getting Started

    Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

    First Launch

    When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings.

    Welcome Screen

    The welcome screen introduces Meshtastic and its core capabilities:

    • Off-grid mesh communication
    • No cellular or internet required
    • End-to-end encrypted messaging

    Tap Get Started to proceed through the setup flow.

    Welcome screen

    Permissions

    The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

    Bluetooth Permission

    Bluetooth is the primary connection method between your phone and Meshtastic radio:

    • Bluetooth scanning — discover nearby Meshtastic radios
    • Bluetooth connect — establish and maintain connections with paired radios

    Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

    Location Permission

    ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice.

    Meshtastic also uses your location for:

    • Showing your position on the mesh map
    • Calculating distances to other nodes
    • Sharing your GPS coordinates with other mesh members (if enabled)

    Grant “While using the app” or “Always” depending on your preference:

    • While using the app — position updates only when the app is open
    • Always — enables background position updates for always-on mesh presence

    If denied, Bluetooth scanning will not function and your node will not report a position.

    Notifications Permission

    Notifications alert you to:

    • Incoming messages from channels and direct messages
    • New nodes joining the mesh
    • Low battery on a remote node

    💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

    Critical Alerts Permission

    On supported devices, the app may request permission for critical alerts:

    • These are high-priority notifications that can break through Do Not Disturb mode
    • Useful for emergency mesh alerts or urgent messages
    • You can skip this step if you don’t need breakthrough notifications
    • Configure or revoke later in Android notification settings

    After Setup

    Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

    💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use.

    What’s Next?

    Once connected to a radio, explore:

    New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



    + Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Shqip
    Meshtastic Docs ↗

    🌐 Shqip — Community translation View in English

    Getting Started

    Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

    First Launch

    When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app.

    Welcome Screen

    The welcome screen introduces Meshtastic and its core capabilities:

    • Off-grid mesh communication
    • No cellular or internet required
    • End-to-end encrypted messaging

    Tap Get Started to proceed through the setup flow.

    Welcome screen

    Permissions

    The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

    Bluetooth Permission

    Bluetooth is the primary connection method between your phone and Meshtastic radio:

    • Bluetooth scanning — discover nearby Meshtastic radios
    • Bluetooth connect — establish and maintain connections with paired radios

    Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

    Location Permission

    ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio.

    Meshtastic also uses your location for:

    • Showing your position on the mesh map
    • Calculating distances to other nodes
    • Sharing your GPS coordinates with other mesh members (if enabled)

    Grant “While using the app” or “Always” depending on your preference:

    • While using the app — position updates only when the app is open
    • Always — enables background position updates for always-on mesh presence

    Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind.

    Notifications Permission

    Notifications alert you to:

    • Incoming messages from channels and direct messages
    • New nodes joining the mesh
    • Low battery on a remote node

    💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

    Critical Alerts Permission

    On supported devices, the app may request permission for critical alerts:

    • These are high-priority notifications that can break through Do Not Disturb mode
    • Useful for emergency mesh alerts or urgent messages
    • You can skip this step if you don’t need breakthrough notifications
    • Configure or revoke later in Android notification settings

    Reviewing permissions later

    Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time:

    State What tapping the row does
    Allowed Opens the system page, so you can review or revoke it
    Not asked yet Requests it
    Denied — tap to allow Explains what the permission is for, then asks again if you agree
    Blocked — tap to open system settings Android will no longer show its dialog, so this opens the page where you can turn it back on
    Not required on this version of Android Nothing — the permission does not exist on your device

    This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead.

    After Setup

    Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

    💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own.

    Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing.

    What’s Next?

    Once connected to a radio, explore:

    New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



    diff --git a/main/sr-rLatn/user/connections.html b/main/sr-rLatn/user/connections.html index 59a453f9d0..84220343c3 100644 --- a/main/sr-rLatn/user/connections.html +++ b/main/sr-rLatn/user/connections.html @@ -1 +1 @@ - Connections | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Српски (Latinica)
    Meshtastic Docs ↗

    🌐 Српски (Latinica) — Community translation View in English

    Connections

    Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

    Bluetooth (BLE)

    Bluetooth Low Energy is the default and most common connection method on Android.

    Pairing a Device

    1. Ensure your Meshtastic radio is powered on and in pairing mode.
    2. Open the app and navigate to the Connect tab.
    3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
    4. Select your device from the list.
    5. Accept the Bluetooth pairing prompt if shown.

    Scanning for Bluetooth devices, with a discovered radio in the list

    Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

    Transport selector

    💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device.

    Connection Status

    Иконица State Опис
    🟢 Блутут повезан Active radio link established
    🟡 Connecting Handshake in progress
    🔴 Raskačeno No active connection
    Not configured No device selected

    When connecting, a status indicator shows the current connection state:

    Connecting status

    If no devices are found, the app shows an empty state with instructions:

    No devices found

    Troubleshooting Bluetooth

    • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
    • Connection drops: Move closer to the radio; check for interference.
    • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

    USB Serial

    USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

    Setup

    1. Connect your radio via USB cable to your device.
    2. The app will prompt for USB permission — tap Allow.
    3. The connection is established automatically.

    ⚠️ Note: USB connections require OTG support on Android devices.

    TCP/IP (Network)

    Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

    Connecting over the Network

    1. Make sure the radio is on the same local network as your phone/desktop.
    2. On the Connect screen, select Network in the transport selector.
    3. Choose the radio one of two ways:
      • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
      • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
    4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

    💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

    When to Use TCP

    • Radio is on the same local network
    • Testing with a simulated radio
    • Environments where Bluetooth has interference issues

    Reconnection Behavior

    The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

    To disconnect, tap the disconnect button on the Connect screen:

    Disconnect from radio

    Desktop Connections

    On Desktop (Linux/macOS/Windows), the app supports:

    • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
    • USB Serial — primary wired connection method
    • TCP/IP — for network-connected radios

    See Desktop App for platform-specific details and keyboard shortcuts.



    + Connections | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Српски (Latinica)
    Meshtastic Docs ↗

    🌐 Српски (Latinica) — Community translation View in English

    Connections

    Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

    Bluetooth (BLE)

    Bluetooth Low Energy is the default and most common connection method on Android.

    Pairing a Device

    1. Ensure your Meshtastic radio is powered on and in pairing mode.
    2. Open the app and navigate to the Connect tab.
    3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
    4. Select your device from the list.
    5. Accept the Bluetooth pairing prompt if shown.

    Scanning for Bluetooth devices, with a discovered radio in the list

    Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

    Transport selector

    💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range.

    The screen names anything on the app’s side that is blocking a scan, with the fix attached:

    What you see What it means
    A card asking for Nearby devices The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings.
    Bluetooth is off The adapter is disabled — the card opens Bluetooth settings.
    Bluetooth scanning also needs location services Android 11 and older only: the permission is held but the system location toggle is off.
    No card, empty list Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere.

    Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered.

    Connection Status

    Иконица State Опис
    🟢 Блутут повезан Active radio link established
    🟡 Connecting Handshake in progress
    🔴 Raskačeno No active connection
    Not configured No device selected

    When connecting, a status indicator shows the current connection state:

    Connecting status

    If no devices are found, the app shows an empty state with instructions:

    No devices found

    Troubleshooting Bluetooth

    • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
    • Connection drops: Move closer to the radio; check for interference.
    • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

    USB Serial

    USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

    Setup

    1. Connect your radio via USB cable to your device.
    2. The app will prompt for USB permission — tap Allow.
    3. The connection is established automatically.

    ⚠️ Note: USB connections require OTG support on Android devices.

    TCP/IP (Network)

    Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

    Connecting over the Network

    1. Make sure the radio is on the same local network as your phone/desktop.
    2. On the Connect screen, select Network in the transport selector.
    3. Choose the radio one of two ways:
      • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
      • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
    4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

    💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

    When to Use TCP

    • Radio is on the same local network
    • Testing with a simulated radio
    • Environments where Bluetooth has interference issues

    Reconnection Behavior

    The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

    To disconnect, tap the disconnect button on the Connect screen:

    Disconnect from radio

    Desktop Connections

    On Desktop (Linux/macOS/Windows), the app supports:

    • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
    • USB Serial — primary wired connection method
    • TCP/IP — for network-connected radios

    See Desktop App for platform-specific details and keyboard shortcuts.



    diff --git a/main/sr-rLatn/user/onboarding.html b/main/sr-rLatn/user/onboarding.html index 0db17cbd45..9be9412f78 100644 --- a/main/sr-rLatn/user/onboarding.html +++ b/main/sr-rLatn/user/onboarding.html @@ -1 +1 @@ - Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Српски (Latinica)
    Meshtastic Docs ↗

    🌐 Српски (Latinica) — Community translation View in English

    Getting Started

    Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

    First Launch

    When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings.

    Welcome Screen

    The welcome screen introduces Meshtastic and its core capabilities:

    • Off-grid mesh communication
    • No cellular or internet required
    • End-to-end encrypted messaging

    Tap Get Started to proceed through the setup flow.

    Welcome screen

    Permissions

    The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

    Bluetooth Permission

    Bluetooth is the primary connection method between your phone and Meshtastic radio:

    • Bluetooth scanning — discover nearby Meshtastic radios
    • Bluetooth connect — establish and maintain connections with paired radios

    Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

    Location Permission

    ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice.

    Meshtastic also uses your location for:

    • Showing your position on the mesh map
    • Calculating distances to other nodes
    • Sharing your GPS coordinates with other mesh members (if enabled)

    Grant “While using the app” or “Always” depending on your preference:

    • While using the app — position updates only when the app is open
    • Always — enables background position updates for always-on mesh presence

    If denied, Bluetooth scanning will not function and your node will not report a position.

    Notifications Permission

    Notifications alert you to:

    • Incoming messages from channels and direct messages
    • New nodes joining the mesh
    • Low battery on a remote node

    💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

    Critical Alerts Permission

    On supported devices, the app may request permission for critical alerts:

    • These are high-priority notifications that can break through Do Not Disturb mode
    • Useful for emergency mesh alerts or urgent messages
    • You can skip this step if you don’t need breakthrough notifications
    • Configure or revoke later in Android notification settings

    After Setup

    Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

    💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use.

    What’s Next?

    Once connected to a radio, explore:

    New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



    + Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Српски (Latinica)
    Meshtastic Docs ↗

    🌐 Српски (Latinica) — Community translation View in English

    Getting Started

    Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

    First Launch

    When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app.

    Welcome Screen

    The welcome screen introduces Meshtastic and its core capabilities:

    • Off-grid mesh communication
    • No cellular or internet required
    • End-to-end encrypted messaging

    Tap Get Started to proceed through the setup flow.

    Welcome screen

    Permissions

    The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

    Bluetooth Permission

    Bluetooth is the primary connection method between your phone and Meshtastic radio:

    • Bluetooth scanning — discover nearby Meshtastic radios
    • Bluetooth connect — establish and maintain connections with paired radios

    Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

    Location Permission

    ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio.

    Meshtastic also uses your location for:

    • Showing your position on the mesh map
    • Calculating distances to other nodes
    • Sharing your GPS coordinates with other mesh members (if enabled)

    Grant “While using the app” or “Always” depending on your preference:

    • While using the app — position updates only when the app is open
    • Always — enables background position updates for always-on mesh presence

    Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind.

    Notifications Permission

    Notifications alert you to:

    • Incoming messages from channels and direct messages
    • New nodes joining the mesh
    • Low battery on a remote node

    💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

    Critical Alerts Permission

    On supported devices, the app may request permission for critical alerts:

    • These are high-priority notifications that can break through Do Not Disturb mode
    • Useful for emergency mesh alerts or urgent messages
    • You can skip this step if you don’t need breakthrough notifications
    • Configure or revoke later in Android notification settings

    Reviewing permissions later

    Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time:

    State What tapping the row does
    Allowed Opens the system page, so you can review or revoke it
    Not asked yet Requests it
    Denied — tap to allow Explains what the permission is for, then asks again if you agree
    Blocked — tap to open system settings Android will no longer show its dialog, so this opens the page where you can turn it back on
    Not required on this version of Android Nothing — the permission does not exist on your device

    This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead.

    After Setup

    Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

    💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own.

    Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing.

    What’s Next?

    Once connected to a radio, explore:

    New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



    diff --git a/main/srp/user/connections.html b/main/srp/user/connections.html index c0ed129b71..befdacd136 100644 --- a/main/srp/user/connections.html +++ b/main/srp/user/connections.html @@ -1 +1 @@ - Connections | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Српски (Ћирилица)
    Meshtastic Docs ↗

    🌐 Српски (Ћирилица) — Community translation View in English

    Connections

    Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

    Bluetooth (BLE)

    Bluetooth Low Energy is the default and most common connection method on Android.

    Pairing a Device

    1. Ensure your Meshtastic radio is powered on and in pairing mode.
    2. Open the app and navigate to the Connect tab.
    3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
    4. Select your device from the list.
    5. Accept the Bluetooth pairing prompt if shown.

    Scanning for Bluetooth devices, with a discovered radio in the list

    Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

    Transport selector

    💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device.

    Connection Status

    Иконица State Опис
    🟢 Блутут повезан Active radio link established
    🟡 Connecting Handshake in progress
    🔴 Раскачено No active connection
    Not configured No device selected

    When connecting, a status indicator shows the current connection state:

    Connecting status

    If no devices are found, the app shows an empty state with instructions:

    No devices found

    Troubleshooting Bluetooth

    • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
    • Connection drops: Move closer to the radio; check for interference.
    • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

    USB Serial

    USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

    Setup

    1. Connect your radio via USB cable to your device.
    2. The app will prompt for USB permission — tap Allow.
    3. The connection is established automatically.

    ⚠️ Note: USB connections require OTG support on Android devices.

    TCP/IP (Network)

    Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

    Connecting over the Network

    1. Make sure the radio is on the same local network as your phone/desktop.
    2. On the Connect screen, select Network in the transport selector.
    3. Choose the radio one of two ways:
      • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
      • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
    4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

    💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

    When to Use TCP

    • Radio is on the same local network
    • Testing with a simulated radio
    • Environments where Bluetooth has interference issues

    Reconnection Behavior

    The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

    To disconnect, tap the disconnect button on the Connect screen:

    Disconnect from radio

    Desktop Connections

    On Desktop (Linux/macOS/Windows), the app supports:

    • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
    • USB Serial — primary wired connection method
    • TCP/IP — for network-connected radios

    See Desktop App for platform-specific details and keyboard shortcuts.



    + Connections | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Српски (Ћирилица)
    Meshtastic Docs ↗

    🌐 Српски (Ћирилица) — Community translation View in English

    Connections

    Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

    Bluetooth (BLE)

    Bluetooth Low Energy is the default and most common connection method on Android.

    Pairing a Device

    1. Ensure your Meshtastic radio is powered on and in pairing mode.
    2. Open the app and navigate to the Connect tab.
    3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
    4. Select your device from the list.
    5. Accept the Bluetooth pairing prompt if shown.

    Scanning for Bluetooth devices, with a discovered radio in the list

    Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

    Transport selector

    💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range.

    The screen names anything on the app’s side that is blocking a scan, with the fix attached:

    What you see What it means
    A card asking for Nearby devices The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings.
    Bluetooth is off The adapter is disabled — the card opens Bluetooth settings.
    Bluetooth scanning also needs location services Android 11 and older only: the permission is held but the system location toggle is off.
    No card, empty list Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere.

    Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered.

    Connection Status

    Иконица State Опис
    🟢 Блутут повезан Active radio link established
    🟡 Connecting Handshake in progress
    🔴 Раскачено No active connection
    Not configured No device selected

    When connecting, a status indicator shows the current connection state:

    Connecting status

    If no devices are found, the app shows an empty state with instructions:

    No devices found

    Troubleshooting Bluetooth

    • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
    • Connection drops: Move closer to the radio; check for interference.
    • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

    USB Serial

    USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

    Setup

    1. Connect your radio via USB cable to your device.
    2. The app will prompt for USB permission — tap Allow.
    3. The connection is established automatically.

    ⚠️ Note: USB connections require OTG support on Android devices.

    TCP/IP (Network)

    Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

    Connecting over the Network

    1. Make sure the radio is on the same local network as your phone/desktop.
    2. On the Connect screen, select Network in the transport selector.
    3. Choose the radio one of two ways:
      • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
      • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
    4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

    💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

    When to Use TCP

    • Radio is on the same local network
    • Testing with a simulated radio
    • Environments where Bluetooth has interference issues

    Reconnection Behavior

    The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

    To disconnect, tap the disconnect button on the Connect screen:

    Disconnect from radio

    Desktop Connections

    On Desktop (Linux/macOS/Windows), the app supports:

    • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
    • USB Serial — primary wired connection method
    • TCP/IP — for network-connected radios

    See Desktop App for platform-specific details and keyboard shortcuts.



    diff --git a/main/srp/user/onboarding.html b/main/srp/user/onboarding.html index 48dcefc23e..a49a1119f3 100644 --- a/main/srp/user/onboarding.html +++ b/main/srp/user/onboarding.html @@ -1 +1 @@ - Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Српски (Ћирилица)
    Meshtastic Docs ↗

    🌐 Српски (Ћирилица) — Community translation View in English

    Getting Started

    Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

    First Launch

    When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings.

    Welcome Screen

    The welcome screen introduces Meshtastic and its core capabilities:

    • Off-grid mesh communication
    • No cellular or internet required
    • End-to-end encrypted messaging

    Tap Get Started to proceed through the setup flow.

    Welcome screen

    Permissions

    The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

    Bluetooth Permission

    Bluetooth is the primary connection method between your phone and Meshtastic radio:

    • Bluetooth scanning — discover nearby Meshtastic radios
    • Bluetooth connect — establish and maintain connections with paired radios

    Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

    Location Permission

    ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice.

    Meshtastic also uses your location for:

    • Showing your position on the mesh map
    • Calculating distances to other nodes
    • Sharing your GPS coordinates with other mesh members (if enabled)

    Grant “While using the app” or “Always” depending on your preference:

    • While using the app — position updates only when the app is open
    • Always — enables background position updates for always-on mesh presence

    If denied, Bluetooth scanning will not function and your node will not report a position.

    Notifications Permission

    Notifications alert you to:

    • Incoming messages from channels and direct messages
    • New nodes joining the mesh
    • Low battery on a remote node

    💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

    Critical Alerts Permission

    On supported devices, the app may request permission for critical alerts:

    • These are high-priority notifications that can break through Do Not Disturb mode
    • Useful for emergency mesh alerts or urgent messages
    • You can skip this step if you don’t need breakthrough notifications
    • Configure or revoke later in Android notification settings

    After Setup

    Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

    💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use.

    What’s Next?

    Once connected to a radio, explore:

    New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



    + Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Српски (Ћирилица)
    Meshtastic Docs ↗

    🌐 Српски (Ћирилица) — Community translation View in English

    Getting Started

    Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

    First Launch

    When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app.

    Welcome Screen

    The welcome screen introduces Meshtastic and its core capabilities:

    • Off-grid mesh communication
    • No cellular or internet required
    • End-to-end encrypted messaging

    Tap Get Started to proceed through the setup flow.

    Welcome screen

    Permissions

    The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

    Bluetooth Permission

    Bluetooth is the primary connection method between your phone and Meshtastic radio:

    • Bluetooth scanning — discover nearby Meshtastic radios
    • Bluetooth connect — establish and maintain connections with paired radios

    Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

    Location Permission

    ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio.

    Meshtastic also uses your location for:

    • Showing your position on the mesh map
    • Calculating distances to other nodes
    • Sharing your GPS coordinates with other mesh members (if enabled)

    Grant “While using the app” or “Always” depending on your preference:

    • While using the app — position updates only when the app is open
    • Always — enables background position updates for always-on mesh presence

    Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind.

    Notifications Permission

    Notifications alert you to:

    • Incoming messages from channels and direct messages
    • New nodes joining the mesh
    • Low battery on a remote node

    💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

    Critical Alerts Permission

    On supported devices, the app may request permission for critical alerts:

    • These are high-priority notifications that can break through Do Not Disturb mode
    • Useful for emergency mesh alerts or urgent messages
    • You can skip this step if you don’t need breakthrough notifications
    • Configure or revoke later in Android notification settings

    Reviewing permissions later

    Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time:

    State What tapping the row does
    Allowed Opens the system page, so you can review or revoke it
    Not asked yet Requests it
    Denied — tap to allow Explains what the permission is for, then asks again if you agree
    Blocked — tap to open system settings Android will no longer show its dialog, so this opens the page where you can turn it back on
    Not required on this version of Android Nothing — the permission does not exist on your device

    This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead.

    After Setup

    Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

    💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own.

    Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing.

    What’s Next?

    Once connected to a radio, explore:

    New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



    diff --git a/main/sv-rSE/user/connections.html b/main/sv-rSE/user/connections.html index 4fa4cd9e57..96a6f8f143 100644 --- a/main/sv-rSE/user/connections.html +++ b/main/sv-rSE/user/connections.html @@ -1 +1 @@ - Connections | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Svenska
    Meshtastic Docs ↗

    🌐 Svenska — Community translation View in English

    Connections

    Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

    Bluetooth (BLE)

    Bluetooth Low Energy is the default and most common connection method on Android.

    Pairing a Device

    1. Ensure your Meshtastic radio is powered on and in pairing mode.
    2. Open the app and navigate to the Connect tab.
    3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
    4. Select your device from the list.
    5. Accept the Bluetooth pairing prompt if shown.

    Scanning for Bluetooth devices, with a discovered radio in the list

    Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

    Transport selector

    💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device.

    Connection Status

    Icon State Beskrivning
    🟢 Ansluten Active radio link established
    🟡 Ansluter Handshake in progress
    🔴 Frånkopplad No active connection
    Not configured Ingen enhet vald

    When connecting, a status indicator shows the current connection state:

    Connecting status

    If no devices are found, the app shows an empty state with instructions:

    No devices found

    Troubleshooting Bluetooth

    • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
    • Connection drops: Move closer to the radio; check for interference.
    • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

    USB Serial

    USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

    Setup

    1. Connect your radio via USB cable to your device.
    2. The app will prompt for USB permission — tap Allow.
    3. The connection is established automatically.

    ⚠️ Note: USB connections require OTG support on Android devices.

    TCP/IP (Network)

    Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

    Connecting over the Network

    1. Make sure the radio is on the same local network as your phone/desktop.
    2. On the Connect screen, select Network in the transport selector.
    3. Choose the radio one of two ways:
      • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
      • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
    4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

    💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

    When to Use TCP

    • Radio is on the same local network
    • Testing with a simulated radio
    • Environments where Bluetooth has interference issues

    Reconnection Behavior

    The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

    To disconnect, tap the disconnect button on the Connect screen:

    Disconnect from radio

    Desktop Connections

    On Desktop (Linux/macOS/Windows), the app supports:

    • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
    • USB Serial — primary wired connection method
    • TCP/IP — for network-connected radios

    See Desktop App for platform-specific details and keyboard shortcuts.



    + Connections | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Svenska
    Meshtastic Docs ↗

    🌐 Svenska — Community translation View in English

    Connections

    Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

    Bluetooth (BLE)

    Bluetooth Low Energy is the default and most common connection method on Android.

    Pairing a Device

    1. Ensure your Meshtastic radio is powered on and in pairing mode.
    2. Open the app and navigate to the Connect tab.
    3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
    4. Select your device from the list.
    5. Accept the Bluetooth pairing prompt if shown.

    Scanning for Bluetooth devices, with a discovered radio in the list

    Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

    Transport selector

    💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range.

    The screen names anything on the app’s side that is blocking a scan, with the fix attached:

    What you see What it means
    A card asking for Nearby devices The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings.
    Bluetooth is off The adapter is disabled — the card opens Bluetooth settings.
    Bluetooth scanning also needs location services Android 11 and older only: the permission is held but the system location toggle is off.
    No card, empty list Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere.

    Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered.

    Connection Status

    Icon State Beskrivning
    🟢 Ansluten Active radio link established
    🟡 Ansluter Handshake in progress
    🔴 Frånkopplad No active connection
    Not configured Ingen enhet vald

    When connecting, a status indicator shows the current connection state:

    Connecting status

    If no devices are found, the app shows an empty state with instructions:

    No devices found

    Troubleshooting Bluetooth

    • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
    • Connection drops: Move closer to the radio; check for interference.
    • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

    USB Serial

    USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

    Setup

    1. Connect your radio via USB cable to your device.
    2. The app will prompt for USB permission — tap Allow.
    3. The connection is established automatically.

    ⚠️ Note: USB connections require OTG support on Android devices.

    TCP/IP (Network)

    Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

    Connecting over the Network

    1. Make sure the radio is on the same local network as your phone/desktop.
    2. On the Connect screen, select Network in the transport selector.
    3. Choose the radio one of two ways:
      • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
      • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
    4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

    💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

    When to Use TCP

    • Radio is on the same local network
    • Testing with a simulated radio
    • Environments where Bluetooth has interference issues

    Reconnection Behavior

    The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

    To disconnect, tap the disconnect button on the Connect screen:

    Disconnect from radio

    Desktop Connections

    On Desktop (Linux/macOS/Windows), the app supports:

    • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
    • USB Serial — primary wired connection method
    • TCP/IP — for network-connected radios

    See Desktop App for platform-specific details and keyboard shortcuts.



    diff --git a/main/sv-rSE/user/onboarding.html b/main/sv-rSE/user/onboarding.html index 034545b031..767ce68cf5 100644 --- a/main/sv-rSE/user/onboarding.html +++ b/main/sv-rSE/user/onboarding.html @@ -1 +1 @@ - Kom igång | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Svenska
    Meshtastic Docs ↗

    🌐 Svenska — Community translation View in English

    Kom igång

    Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

    First Launch

    When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings.

    Welcome Screen

    The welcome screen introduces Meshtastic and its core capabilities:

    • Off-grid mesh communication
    • No cellular or internet required
    • End-to-end encrypted messaging

    Tap Get Started to proceed through the setup flow.

    Welcome screen

    Permissions

    The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

    Bluetooth Permission

    Bluetooth is the primary connection method between your phone and Meshtastic radio:

    • Bluetooth scanning — discover nearby Meshtastic radios
    • Bluetooth connect — establish and maintain connections with paired radios

    Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

    Location Permission

    ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice.

    Meshtastic also uses your location for:

    • Showing your position on the mesh map
    • Calculating distances to other nodes
    • Sharing your GPS coordinates with other mesh members (if enabled)

    Grant “While using the app” or “Always” depending on your preference:

    • While using the app — position updates only when the app is open
    • Always — enables background position updates for always-on mesh presence

    If denied, Bluetooth scanning will not function and your node will not report a position.

    Notifications Permission

    Notifications alert you to:

    • Incoming messages from channels and direct messages
    • New nodes joining the mesh
    • Low battery on a remote node

    💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

    Critical Alerts Permission

    On supported devices, the app may request permission for critical alerts:

    • These are high-priority notifications that can break through Do Not Disturb mode
    • Useful for emergency mesh alerts or urgent messages
    • You can skip this step if you don’t need breakthrough notifications
    • Configure or revoke later in Android notification settings

    After Setup

    Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

    💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use.

    What’s Next?

    Once connected to a radio, explore:

    New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



    + Kom igång | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Svenska
    Meshtastic Docs ↗

    🌐 Svenska — Community translation View in English

    Kom igång

    Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

    First Launch

    When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app.

    Welcome Screen

    The welcome screen introduces Meshtastic and its core capabilities:

    • Off-grid mesh communication
    • No cellular or internet required
    • End-to-end encrypted messaging

    Tap Get Started to proceed through the setup flow.

    Welcome screen

    Permissions

    The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

    Bluetooth Permission

    Bluetooth is the primary connection method between your phone and Meshtastic radio:

    • Bluetooth scanning — discover nearby Meshtastic radios
    • Bluetooth connect — establish and maintain connections with paired radios

    Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

    Location Permission

    ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio.

    Meshtastic also uses your location for:

    • Showing your position on the mesh map
    • Calculating distances to other nodes
    • Sharing your GPS coordinates with other mesh members (if enabled)

    Grant “While using the app” or “Always” depending on your preference:

    • While using the app — position updates only when the app is open
    • Always — enables background position updates for always-on mesh presence

    Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind.

    Notifications Permission

    Notifications alert you to:

    • Incoming messages from channels and direct messages
    • New nodes joining the mesh
    • Low battery on a remote node

    💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

    Critical Alerts Permission

    On supported devices, the app may request permission for critical alerts:

    • These are high-priority notifications that can break through Do Not Disturb mode
    • Useful for emergency mesh alerts or urgent messages
    • You can skip this step if you don’t need breakthrough notifications
    • Configure or revoke later in Android notification settings

    Reviewing permissions later

    Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time:

    State What tapping the row does
    Allowed Opens the system page, so you can review or revoke it
    Not asked yet Requests it
    Denied — tap to allow Explains what the permission is for, then asks again if you agree
    Blocked — tap to open system settings Android will no longer show its dialog, so this opens the page where you can turn it back on
    Not required on this version of Android Nothing — the permission does not exist on your device

    This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead.

    After Setup

    Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

    💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own.

    Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing.

    What’s Next?

    Once connected to a radio, explore:

    New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



    diff --git a/main/tr-rTR/user/connections.html b/main/tr-rTR/user/connections.html index 6bdac7c2ae..60bafc288b 100644 --- a/main/tr-rTR/user/connections.html +++ b/main/tr-rTR/user/connections.html @@ -1 +1 @@ - Bağlantılar | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Türkçe
    Meshtastic Docs ↗

    🌐 Türkçe — Community translation View in English

    Bağlantılar

    Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

    Bluetooth (BLE)

    Bluetooth Low Energy is the default and most common connection method on Android.

    Pairing a Device

    1. Ensure your Meshtastic radio is powered on and in pairing mode.
    2. Open the app and navigate to the Connect tab.
    3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
    4. Select your device from the list.
    5. Accept the Bluetooth pairing prompt if shown.

    Scanning for Bluetooth devices, with a discovered radio in the list

    Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

    Transport selector

    💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device.

    Connection Status

    Icon State Açıklaması
    🟢 Bağlandı Active radio link established
    🟡 Bağlanıyor Handshake in progress
    🔴 Bağlantı kesildi No active connection
    Not configured No device selected

    When connecting, a status indicator shows the current connection state:

    Connecting status

    If no devices are found, the app shows an empty state with instructions:

    No devices found

    Troubleshooting Bluetooth

    • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
    • Connection drops: Move closer to the radio; check for interference.
    • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

    USB Serial

    USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

    Setup

    1. Connect your radio via USB cable to your device.
    2. The app will prompt for USB permission — tap Allow.
    3. The connection is established automatically.

    ⚠️ Note: USB connections require OTG support on Android devices.

    TCP/IP (Network)

    Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

    Connecting over the Network

    1. Make sure the radio is on the same local network as your phone/desktop.
    2. On the Connect screen, select Network in the transport selector.
    3. Choose the radio one of two ways:
      • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
      • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
    4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

    💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

    When to Use TCP

    • Radio is on the same local network
    • Testing with a simulated radio
    • Environments where Bluetooth has interference issues

    Reconnection Behavior

    The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

    To disconnect, tap the disconnect button on the Connect screen:

    Disconnect from radio

    Desktop Connections

    On Desktop (Linux/macOS/Windows), the app supports:

    • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
    • USB Serial — primary wired connection method
    • TCP/IP — for network-connected radios

    See Desktop App for platform-specific details and keyboard shortcuts.



    + Bağlantılar | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Türkçe
    Meshtastic Docs ↗

    🌐 Türkçe — Community translation View in English

    Bağlantılar

    Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

    Bluetooth (BLE)

    Bluetooth Low Energy is the default and most common connection method on Android.

    Pairing a Device

    1. Ensure your Meshtastic radio is powered on and in pairing mode.
    2. Open the app and navigate to the Connect tab.
    3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
    4. Select your device from the list.
    5. Accept the Bluetooth pairing prompt if shown.

    Scanning for Bluetooth devices, with a discovered radio in the list

    Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

    Transport selector

    💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range.

    The screen names anything on the app’s side that is blocking a scan, with the fix attached:

    What you see What it means
    A card asking for Nearby devices The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings.
    Bluetooth is off The adapter is disabled — the card opens Bluetooth settings.
    Bluetooth scanning also needs location services Android 11 and older only: the permission is held but the system location toggle is off.
    No card, empty list Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere.

    Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered.

    Connection Status

    Icon State Açıklaması
    🟢 Bağlandı Active radio link established
    🟡 Bağlanıyor Handshake in progress
    🔴 Bağlantı kesildi No active connection
    Not configured No device selected

    When connecting, a status indicator shows the current connection state:

    Connecting status

    If no devices are found, the app shows an empty state with instructions:

    No devices found

    Troubleshooting Bluetooth

    • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
    • Connection drops: Move closer to the radio; check for interference.
    • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

    USB Serial

    USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

    Setup

    1. Connect your radio via USB cable to your device.
    2. The app will prompt for USB permission — tap Allow.
    3. The connection is established automatically.

    ⚠️ Note: USB connections require OTG support on Android devices.

    TCP/IP (Network)

    Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

    Connecting over the Network

    1. Make sure the radio is on the same local network as your phone/desktop.
    2. On the Connect screen, select Network in the transport selector.
    3. Choose the radio one of two ways:
      • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
      • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
    4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

    💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

    When to Use TCP

    • Radio is on the same local network
    • Testing with a simulated radio
    • Environments where Bluetooth has interference issues

    Reconnection Behavior

    The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

    To disconnect, tap the disconnect button on the Connect screen:

    Disconnect from radio

    Desktop Connections

    On Desktop (Linux/macOS/Windows), the app supports:

    • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
    • USB Serial — primary wired connection method
    • TCP/IP — for network-connected radios

    See Desktop App for platform-specific details and keyboard shortcuts.



    diff --git a/main/tr-rTR/user/onboarding.html b/main/tr-rTR/user/onboarding.html index f9a992c71c..0a3f7c962d 100644 --- a/main/tr-rTR/user/onboarding.html +++ b/main/tr-rTR/user/onboarding.html @@ -1 +1 @@ - Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Türkçe
    Meshtastic Docs ↗

    🌐 Türkçe — Community translation View in English

    Getting Started

    Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

    First Launch

    When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings.

    Welcome Screen

    The welcome screen introduces Meshtastic and its core capabilities:

    • Off-grid mesh communication
    • No cellular or internet required
    • End-to-end encrypted messaging

    Tap Get Started to proceed through the setup flow.

    Welcome screen

    Permissions

    The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

    Bluetooth Permission

    Bluetooth is the primary connection method between your phone and Meshtastic radio:

    • Bluetooth scanning — discover nearby Meshtastic radios
    • Bluetooth connect — establish and maintain connections with paired radios

    Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

    Location Permission

    ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice.

    Meshtastic also uses your location for:

    • Showing your position on the mesh map
    • Calculating distances to other nodes
    • Sharing your GPS coordinates with other mesh members (if enabled)

    Grant “While using the app” or “Always” depending on your preference:

    • While using the app — position updates only when the app is open
    • Always — enables background position updates for always-on mesh presence

    If denied, Bluetooth scanning will not function and your node will not report a position.

    Notifications Permission

    Notifications alert you to:

    • Incoming messages from channels and direct messages
    • New nodes joining the mesh
    • Low battery on a remote node

    💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

    Critical Alerts Permission

    On supported devices, the app may request permission for critical alerts:

    • These are high-priority notifications that can break through Do Not Disturb mode
    • Useful for emergency mesh alerts or urgent messages
    • You can skip this step if you don’t need breakthrough notifications
    • Configure or revoke later in Android notification settings

    After Setup

    Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

    💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use.

    What’s Next?

    Once connected to a radio, explore:

    New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



    + Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Türkçe
    Meshtastic Docs ↗

    🌐 Türkçe — Community translation View in English

    Getting Started

    Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

    First Launch

    When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app.

    Welcome Screen

    The welcome screen introduces Meshtastic and its core capabilities:

    • Off-grid mesh communication
    • No cellular or internet required
    • End-to-end encrypted messaging

    Tap Get Started to proceed through the setup flow.

    Welcome screen

    Permissions

    The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

    Bluetooth Permission

    Bluetooth is the primary connection method between your phone and Meshtastic radio:

    • Bluetooth scanning — discover nearby Meshtastic radios
    • Bluetooth connect — establish and maintain connections with paired radios

    Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

    Location Permission

    ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio.

    Meshtastic also uses your location for:

    • Showing your position on the mesh map
    • Calculating distances to other nodes
    • Sharing your GPS coordinates with other mesh members (if enabled)

    Grant “While using the app” or “Always” depending on your preference:

    • While using the app — position updates only when the app is open
    • Always — enables background position updates for always-on mesh presence

    Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind.

    Notifications Permission

    Notifications alert you to:

    • Incoming messages from channels and direct messages
    • New nodes joining the mesh
    • Low battery on a remote node

    💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

    Critical Alerts Permission

    On supported devices, the app may request permission for critical alerts:

    • These are high-priority notifications that can break through Do Not Disturb mode
    • Useful for emergency mesh alerts or urgent messages
    • You can skip this step if you don’t need breakthrough notifications
    • Configure or revoke later in Android notification settings

    Reviewing permissions later

    Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time:

    State What tapping the row does
    Allowed Opens the system page, so you can review or revoke it
    Not asked yet Requests it
    Denied — tap to allow Explains what the permission is for, then asks again if you agree
    Blocked — tap to open system settings Android will no longer show its dialog, so this opens the page where you can turn it back on
    Not required on this version of Android Nothing — the permission does not exist on your device

    This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead.

    After Setup

    Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

    💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own.

    Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing.

    What’s Next?

    Once connected to a radio, explore:

    New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



    diff --git a/main/uk-rUA/user/connections.html b/main/uk-rUA/user/connections.html index 30023bdddc..40e909e632 100644 --- a/main/uk-rUA/user/connections.html +++ b/main/uk-rUA/user/connections.html @@ -1 +1 @@ - Connections | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Українська
    Meshtastic Docs ↗

    🌐 Українська — Community translation View in English

    Connections

    Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

    Bluetooth (BLE)

    Bluetooth Low Energy is the default and most common connection method on Android.

    Pairing a Device

    1. Ensure your Meshtastic radio is powered on and in pairing mode.
    2. Open the app and navigate to the Connect tab.
    3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
    4. Select your device from the list.
    5. Accept the Bluetooth pairing prompt if shown.

    Scanning for Bluetooth devices, with a discovered radio in the list

    Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

    Transport selector

    💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device.

    Connection Status

    Icon State Опис
    🟢 Під’єднано Active radio link established
    🟡 Під’єднання Handshake in progress
    🔴 Відключено No active connection
    Not configured Не вибраний пристрій

    When connecting, a status indicator shows the current connection state:

    Connecting status

    If no devices are found, the app shows an empty state with instructions:

    No devices found

    Troubleshooting Bluetooth

    • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
    • Connection drops: Move closer to the radio; check for interference.
    • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

    USB Serial

    USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

    Setup

    1. Connect your radio via USB cable to your device.
    2. The app will prompt for USB permission — tap Allow.
    3. The connection is established automatically.

    ⚠️ Note: USB connections require OTG support on Android devices.

    TCP/IP (Network)

    Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

    Connecting over the Network

    1. Make sure the radio is on the same local network as your phone/desktop.
    2. On the Connect screen, select Network in the transport selector.
    3. Choose the radio one of two ways:
      • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
      • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
    4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

    💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

    When to Use TCP

    • Radio is on the same local network
    • Testing with a simulated radio
    • Environments where Bluetooth has interference issues

    Reconnection Behavior

    The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

    To disconnect, tap the disconnect button on the Connect screen:

    Disconnect from radio

    Desktop Connections

    On Desktop (Linux/macOS/Windows), the app supports:

    • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
    • USB Serial — primary wired connection method
    • TCP/IP — for network-connected radios

    See Desktop App for platform-specific details and keyboard shortcuts.



    + Connections | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Українська
    Meshtastic Docs ↗

    🌐 Українська — Community translation View in English

    Connections

    Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

    Bluetooth (BLE)

    Bluetooth Low Energy is the default and most common connection method on Android.

    Pairing a Device

    1. Ensure your Meshtastic radio is powered on and in pairing mode.
    2. Open the app and navigate to the Connect tab.
    3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
    4. Select your device from the list.
    5. Accept the Bluetooth pairing prompt if shown.

    Scanning for Bluetooth devices, with a discovered radio in the list

    Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

    Transport selector

    💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range.

    The screen names anything on the app’s side that is blocking a scan, with the fix attached:

    What you see What it means
    A card asking for Nearby devices The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings.
    Bluetooth is off The adapter is disabled — the card opens Bluetooth settings.
    Bluetooth scanning also needs location services Android 11 and older only: the permission is held but the system location toggle is off.
    No card, empty list Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere.

    Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered.

    Connection Status

    Icon State Опис
    🟢 Під’єднано Active radio link established
    🟡 Під’єднання Handshake in progress
    🔴 Відключено No active connection
    Not configured Не вибраний пристрій

    When connecting, a status indicator shows the current connection state:

    Connecting status

    If no devices are found, the app shows an empty state with instructions:

    No devices found

    Troubleshooting Bluetooth

    • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
    • Connection drops: Move closer to the radio; check for interference.
    • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

    USB Serial

    USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

    Setup

    1. Connect your radio via USB cable to your device.
    2. The app will prompt for USB permission — tap Allow.
    3. The connection is established automatically.

    ⚠️ Note: USB connections require OTG support on Android devices.

    TCP/IP (Network)

    Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

    Connecting over the Network

    1. Make sure the radio is on the same local network as your phone/desktop.
    2. On the Connect screen, select Network in the transport selector.
    3. Choose the radio one of two ways:
      • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
      • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
    4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

    💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

    When to Use TCP

    • Radio is on the same local network
    • Testing with a simulated radio
    • Environments where Bluetooth has interference issues

    Reconnection Behavior

    The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

    To disconnect, tap the disconnect button on the Connect screen:

    Disconnect from radio

    Desktop Connections

    On Desktop (Linux/macOS/Windows), the app supports:

    • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
    • USB Serial — primary wired connection method
    • TCP/IP — for network-connected radios

    See Desktop App for platform-specific details and keyboard shortcuts.



    diff --git a/main/uk-rUA/user/onboarding.html b/main/uk-rUA/user/onboarding.html index fc98b767b2..1bc7b3caf8 100644 --- a/main/uk-rUA/user/onboarding.html +++ b/main/uk-rUA/user/onboarding.html @@ -1 +1 @@ - Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Українська
    Meshtastic Docs ↗

    🌐 Українська — Community translation View in English

    Getting Started

    Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

    First Launch

    When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings.

    Welcome Screen

    The welcome screen introduces Meshtastic and its core capabilities:

    • Off-grid mesh communication
    • No cellular or internet required
    • End-to-end encrypted messaging

    Tap Get Started to proceed through the setup flow.

    Welcome screen

    Permissions

    The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

    Bluetooth Permission

    Bluetooth is the primary connection method between your phone and Meshtastic radio:

    • Bluetooth scanning — discover nearby Meshtastic radios
    • Bluetooth connect — establish and maintain connections with paired radios

    Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

    Location Permission

    ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice.

    Meshtastic also uses your location for:

    • Showing your position on the mesh map
    • Calculating distances to other nodes
    • Sharing your GPS coordinates with other mesh members (if enabled)

    Grant “While using the app” or “Always” depending on your preference:

    • While using the app — position updates only when the app is open
    • Always — enables background position updates for always-on mesh presence

    If denied, Bluetooth scanning will not function and your node will not report a position.

    Notifications Permission

    Notifications alert you to:

    • Incoming messages from channels and direct messages
    • New nodes joining the mesh
    • Low battery on a remote node

    💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

    Critical Alerts Permission

    On supported devices, the app may request permission for critical alerts:

    • These are high-priority notifications that can break through Do Not Disturb mode
    • Useful for emergency mesh alerts or urgent messages
    • You can skip this step if you don’t need breakthrough notifications
    • Configure or revoke later in Android notification settings

    After Setup

    Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

    💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use.

    What’s Next?

    Once connected to a radio, explore:

    New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



    + Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 Українська
    Meshtastic Docs ↗

    🌐 Українська — Community translation View in English

    Getting Started

    Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

    First Launch

    When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app.

    Welcome Screen

    The welcome screen introduces Meshtastic and its core capabilities:

    • Off-grid mesh communication
    • No cellular or internet required
    • End-to-end encrypted messaging

    Tap Get Started to proceed through the setup flow.

    Welcome screen

    Permissions

    The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

    Bluetooth Permission

    Bluetooth is the primary connection method between your phone and Meshtastic radio:

    • Bluetooth scanning — discover nearby Meshtastic radios
    • Bluetooth connect — establish and maintain connections with paired radios

    Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

    Location Permission

    ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio.

    Meshtastic also uses your location for:

    • Showing your position on the mesh map
    • Calculating distances to other nodes
    • Sharing your GPS coordinates with other mesh members (if enabled)

    Grant “While using the app” or “Always” depending on your preference:

    • While using the app — position updates only when the app is open
    • Always — enables background position updates for always-on mesh presence

    Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind.

    Notifications Permission

    Notifications alert you to:

    • Incoming messages from channels and direct messages
    • New nodes joining the mesh
    • Low battery on a remote node

    💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

    Critical Alerts Permission

    On supported devices, the app may request permission for critical alerts:

    • These are high-priority notifications that can break through Do Not Disturb mode
    • Useful for emergency mesh alerts or urgent messages
    • You can skip this step if you don’t need breakthrough notifications
    • Configure or revoke later in Android notification settings

    Reviewing permissions later

    Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time:

    State What tapping the row does
    Allowed Opens the system page, so you can review or revoke it
    Not asked yet Requests it
    Denied — tap to allow Explains what the permission is for, then asks again if you agree
    Blocked — tap to open system settings Android will no longer show its dialog, so this opens the page where you can turn it back on
    Not required on this version of Android Nothing — the permission does not exist on your device

    This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead.

    After Setup

    Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

    💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own.

    Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing.

    What’s Next?

    Once connected to a radio, explore:

    New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



    diff --git a/main/zh-rCN/user/connections.html b/main/zh-rCN/user/connections.html index 250bd44614..32a046723c 100644 --- a/main/zh-rCN/user/connections.html +++ b/main/zh-rCN/user/connections.html @@ -1 +1 @@ - 连接数 | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 中文 (简体)
    Meshtastic Docs ↗

    🌐 中文 (简体) — Community translation View in English

    连接数

    Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

    Bluetooth (BLE)

    Bluetooth Low Energy is the default and most common connection method on Android.

    Pairing a Device

    1. Ensure your Meshtastic radio is powered on and in pairing mode.
    2. Open the app and navigate to the Connect tab.
    3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
    4. Select your device from the list.
    5. Accept the Bluetooth pairing prompt if shown.

    Scanning for Bluetooth devices, with a discovered radio in the list

    Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

    Transport selector

    💡 Tip: If your device doesn’t appear, check that Bluetooth and Location permissions are granted, and that the radio is not already connected to another device.

    Connection Status

    图标 State 说明
    🟢 已连接 Active radio link established
    🟡 正在连接 Handshake in progress
    🔴 已断开连接 No active connection
    Not configured 未选择设备

    When connecting, a status indicator shows the current connection state:

    Connecting status

    If no devices are found, the app shows an empty state with instructions:

    No devices found

    Troubleshooting Bluetooth

    • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
    • Connection drops: Move closer to the radio; check for interference.
    • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

    USB Serial

    USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

    Setup

    1. Connect your radio via USB cable to your device.
    2. The app will prompt for USB permission — tap Allow.
    3. The connection is established automatically.

    ⚠️ Note: USB connections require OTG support on Android devices.

    TCP/IP (Network)

    Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

    Connecting over the Network

    1. Make sure the radio is on the same local network as your phone/desktop.
    2. On the Connect screen, select Network in the transport selector.
    3. Choose the radio one of two ways:
      • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
      • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
    4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

    💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

    When to Use TCP

    • Radio is on the same local network
    • Testing with a simulated radio
    • Environments where Bluetooth has interference issues

    Reconnection Behavior

    The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

    To disconnect, tap the disconnect button on the Connect screen:

    Disconnect from radio

    Desktop Connections

    On Desktop (Linux/macOS/Windows), the app supports:

    • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
    • USB Serial — primary wired connection method
    • TCP/IP — for network-connected radios

    See Desktop App for platform-specific details and keyboard shortcuts.



    + 连接数 | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 中文 (简体)
    Meshtastic Docs ↗

    🌐 中文 (简体) — Community translation View in English

    连接数

    Meshtastic supports multiple transport methods to communicate between your phone/desktop and a radio node.

    Bluetooth (BLE)

    Bluetooth Low Energy is the default and most common connection method on Android.

    Pairing a Device

    1. Ensure your Meshtastic radio is powered on and in pairing mode.
    2. Open the app and navigate to the Connect tab.
    3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
    4. Select your device from the list.
    5. Accept the Bluetooth pairing prompt if shown.

    Scanning for Bluetooth devices, with a discovered radio in the list

    Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

    Transport selector

    💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range.

    The screen names anything on the app’s side that is blocking a scan, with the fix attached:

    What you see What it means
    A card asking for Nearby devices The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings.
    Bluetooth is off The adapter is disabled — the card opens Bluetooth settings.
    Bluetooth scanning also needs location services Android 11 and older only: the permission is held but the system location toggle is off.
    No card, empty list Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere.

    Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered.

    Connection Status

    图标 State 说明
    🟢 已连接 Active radio link established
    🟡 正在连接 Handshake in progress
    🔴 已断开连接 No active connection
    Not configured 未选择设备

    When connecting, a status indicator shows the current connection state:

    Connecting status

    If no devices are found, the app shows an empty state with instructions:

    No devices found

    Troubleshooting Bluetooth

    • Device not found: Toggle Bluetooth off/on, ensure location is enabled.
    • Connection drops: Move closer to the radio; check for interference.
    • Pairing rejected: Forget the device in Android Bluetooth settings and retry.

    USB Serial

    USB connections provide a wired alternative, useful for desktop or when Bluetooth is unavailable.

    Setup

    1. Connect your radio via USB cable to your device.
    2. The app will prompt for USB permission — tap Allow.
    3. The connection is established automatically.

    ⚠️ Note: USB connections require OTG support on Android devices.

    TCP/IP (Network)

    Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

    Connecting over the Network

    1. Make sure the radio is on the same local network as your phone/desktop.
    2. On the Connect screen, select Network in the transport selector.
    3. Choose the radio one of two ways:
      • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
      • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
    4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

    💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

    When to Use TCP

    • Radio is on the same local network
    • Testing with a simulated radio
    • Environments where Bluetooth has interference issues

    Reconnection Behavior

    The app reconnects to the last selected device on startup. You can switch transports from the Connect screen at any time.

    To disconnect, tap the disconnect button on the Connect screen:

    Disconnect from radio

    Desktop Connections

    On Desktop (Linux/macOS/Windows), the app supports:

    • Bluetooth (BLE) — via the Kable library; works on macOS, Linux, and Windows
    • USB Serial — primary wired connection method
    • TCP/IP — for network-connected radios

    See Desktop App for platform-specific details and keyboard shortcuts.



    diff --git a/main/zh-rCN/user/onboarding.html b/main/zh-rCN/user/onboarding.html index 55fd355136..ede2370b5b 100644 --- a/main/zh-rCN/user/onboarding.html +++ b/main/zh-rCN/user/onboarding.html @@ -1 +1 @@ - Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 中文 (简体)
    Meshtastic Docs ↗

    🌐 中文 (简体) — Community translation View in English

    Getting Started

    Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

    First Launch

    When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings.

    Welcome Screen

    The welcome screen introduces Meshtastic and its core capabilities:

    • Off-grid mesh communication
    • No cellular or internet required
    • End-to-end encrypted messaging

    Tap Get Started to proceed through the setup flow.

    Welcome screen

    Permissions

    The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

    Bluetooth Permission

    Bluetooth is the primary connection method between your phone and Meshtastic radio:

    • Bluetooth scanning — discover nearby Meshtastic radios
    • Bluetooth connect — establish and maintain connections with paired radios

    Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

    Location Permission

    ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice.

    Meshtastic also uses your location for:

    • Showing your position on the mesh map
    • Calculating distances to other nodes
    • Sharing your GPS coordinates with other mesh members (if enabled)

    Grant “While using the app” or “Always” depending on your preference:

    • While using the app — position updates only when the app is open
    • Always — enables background position updates for always-on mesh presence

    If denied, Bluetooth scanning will not function and your node will not report a position.

    Notifications Permission

    Notifications alert you to:

    • Incoming messages from channels and direct messages
    • New nodes joining the mesh
    • Low battery on a remote node

    💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

    Critical Alerts Permission

    On supported devices, the app may request permission for critical alerts:

    • These are high-priority notifications that can break through Do Not Disturb mode
    • Useful for emergency mesh alerts or urgent messages
    • You can skip this step if you don’t need breakthrough notifications
    • Configure or revoke later in Android notification settings

    After Setup

    Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

    💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use.

    What’s Next?

    Once connected to a radio, explore:

    New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



    + Getting Started | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 中文 (简体)
    Meshtastic Docs ↗

    🌐 中文 (简体) — Community translation View in English

    Getting Started

    Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

    First Launch

    When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app.

    Welcome Screen

    The welcome screen introduces Meshtastic and its core capabilities:

    • Off-grid mesh communication
    • No cellular or internet required
    • End-to-end encrypted messaging

    Tap Get Started to proceed through the setup flow.

    Welcome screen

    Permissions

    The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

    Bluetooth Permission

    Bluetooth is the primary connection method between your phone and Meshtastic radio:

    • Bluetooth scanning — discover nearby Meshtastic radios
    • Bluetooth connect — establish and maintain connections with paired radios

    Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

    Location Permission

    ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio.

    Meshtastic also uses your location for:

    • Showing your position on the mesh map
    • Calculating distances to other nodes
    • Sharing your GPS coordinates with other mesh members (if enabled)

    Grant “While using the app” or “Always” depending on your preference:

    • While using the app — position updates only when the app is open
    • Always — enables background position updates for always-on mesh presence

    Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind.

    Notifications Permission

    Notifications alert you to:

    • Incoming messages from channels and direct messages
    • New nodes joining the mesh
    • Low battery on a remote node

    💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

    Critical Alerts Permission

    On supported devices, the app may request permission for critical alerts:

    • These are high-priority notifications that can break through Do Not Disturb mode
    • Useful for emergency mesh alerts or urgent messages
    • You can skip this step if you don’t need breakthrough notifications
    • Configure or revoke later in Android notification settings

    Reviewing permissions later

    Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time:

    State What tapping the row does
    Allowed Opens the system page, so you can review or revoke it
    Not asked yet Requests it
    Denied — tap to allow Explains what the permission is for, then asks again if you agree
    Blocked — tap to open system settings Android will no longer show its dialog, so this opens the page where you can turn it back on
    Not required on this version of Android Nothing — the permission does not exist on your device

    This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead.

    After Setup

    Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

    💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own.

    Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing.

    What’s Next?

    Once connected to a radio, explore:

    New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



    diff --git a/main/zh-rTW/user/connections.html b/main/zh-rTW/user/connections.html index 48ccd14035..d552480d9b 100644 --- a/main/zh-rTW/user/connections.html +++ b/main/zh-rTW/user/connections.html @@ -1 +1 @@ - 連線 | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 中文 (繁體)
    Meshtastic Docs ↗

    🌐 中文 (繁體) — Community translation View in English

    連線

    Meshtastic 支援多種傳輸方式,以便您的手機或電腦與無線電節點進行通訊。

    藍牙(BLE)

    藍牙低功耗是 Android 上預設且最常見的連線方式。

    配對裝置

    1. 請確認您的 Meshtastic 無線電裝置已開機,並進入配對模式。
    2. 開啟應用程式,並前往「連線」頁籤。
    3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
    4. 從清單中選取您的裝置。
    5. 若出現藍牙配對提示,請點選接受。

    Scanning for Bluetooth devices, with a discovered radio in the list

    Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

    Transport selector

    💡 提示:若裝置未顯示,請確認已授予藍牙與位置權限,且該無線電裝置尚未連接至其他裝置。

    連線狀態

    圖示 狀態 描述說明
    🟢 已連線 無線電連線已建立
    🟡 正在連線 交握進行中
    🔴 已中斷連線 無作用中連線
    尚未設定 未選擇裝置

    連線過程中,狀態指示器會顯示目前的連線狀態:

    Connecting status

    若未找到任何裝置,應用程式將顯示空白畫面並提供操作說明:

    No devices found

    藍牙疑難排解

    • 找不到裝置:請關閉再開啟藍牙,並確認已啟用位置服務。
    • 連線中斷:請靠近無線電裝置,並檢查是否有訊號干擾。
    • 配對遭拒:請至 Android 藍牙設定中移除該裝置後重新配對。

    USB 序列埠

    USB 連線提供有線替代方案,適用於桌上型電腦或藍牙無法使用的情況。

    設定

    1. 請使用 USB 傳輸線將無線電裝置連接至您的裝置。
    2. 應用程式將提示要求 USB 權限——請點選「允許」。
    3. 連線將自動建立。

    ⚠️ 注意:USB 連線需要 Android 裝置支援 OTG 功能。

    TCP/IP (Network)

    Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

    Connecting over the Network

    1. Make sure the radio is on the same local network as your phone/desktop.
    2. On the Connect screen, select Network in the transport selector.
    3. Choose the radio one of two ways:
      • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
      • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
    4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

    💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

    何時使用 TCP

    • 無線電裝置與裝置位於同一區域網路
    • 使用模擬無線電裝置進行測試
    • 藍牙訊號受干擾的環境

    重新連線行為

    應用程式啟動時將自動重新連接至上次選取的裝置。 您可隨時在連線畫面切換傳輸方式。

    若要中斷連線,請點選連線畫面上的中斷連線按鈕:

    Disconnect from radio

    桌面版連線

    在桌面版(Linux/macOS/Windows)上,應用程式支援:

    • 藍牙(BLE)—— 透過 Kable 函式庫;支援 macOS、Linux 及 Windows
    • USB 序列埠 — 主要的有線連線方式
    • TCP/IP — 適用於透過網路連線的無線電裝置

    請參閱〔桌面版應用程式〕(desktop) 以了解各平台的詳細說明與鍵盤快速鍵。

    相關主題

    • 〔快速入門〕(onboarding) — 首次啟動的設定與權限
    • 〔設定 — 無線電與使用者〕(settings-radio-user) — 藍牙與網路設定
    • 〔桌面版應用程式〕(desktop) — 桌面版連線詳細說明
    • 〔支援的裝置〕(https://meshtastic.org/docs/hardware/devices)— meshtastic.org 上的完整相容無線電裝置清單


    + 連線 | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 中文 (繁體)
    Meshtastic Docs ↗

    🌐 中文 (繁體) — Community translation View in English

    連線

    Meshtastic 支援多種傳輸方式,以便您的手機或電腦與無線電節點進行通訊。

    藍牙(BLE)

    藍牙低功耗是 Android 上預設且最常見的連線方式。

    配對裝置

    1. 請確認您的 Meshtastic 無線電裝置已開機,並進入配對模式。
    2. 開啟應用程式,並前往「連線」頁籤。
    3. Tap Scan for Bluetooth devices — nearby Meshtastic radios will appear.
    4. 從清單中選取您的裝置。
    5. 若出現藍牙配對提示,請點選接受。

    Scanning for Bluetooth devices, with a discovered radio in the list

    Use the transport selector — a segmented button row below the connection card — to switch between the Bluetooth, Network, and USB transports (one is active at a time):

    Transport selector

    💡 Tip: If your device doesn’t appear, check that the radio is not already connected to another device or out of range.

    The screen names anything on the app’s side that is blocking a scan, with the fix attached:

    What you see 代表意義
    A card asking for Nearby devices The permission has not been granted. Grant permission requests it; once Android stops prompting, the button becomes Open settings.
    Bluetooth is off The adapter is disabled — the card opens Bluetooth settings.
    Bluetooth scanning also needs location services Android 11 and older only: the permission is held but the system location toggle is off.
    No card, empty list Nothing on this side is blocking the scan — the radio is out of range, off, or already connected elsewhere.

    Tapping Scan after you have declined the permission once explains what it is for before asking again, and lets you decline again without being cornered.

    連線狀態

    圖示 狀態 描述說明
    🟢 已連線 無線電連線已建立
    🟡 正在連線 交握進行中
    🔴 已中斷連線 無作用中連線
    尚未設定 未選擇裝置

    連線過程中,狀態指示器會顯示目前的連線狀態:

    Connecting status

    若未找到任何裝置,應用程式將顯示空白畫面並提供操作說明:

    No devices found

    藍牙疑難排解

    • 找不到裝置:請關閉再開啟藍牙,並確認已啟用位置服務。
    • 連線中斷:請靠近無線電裝置,並檢查是否有訊號干擾。
    • 配對遭拒:請至 Android 藍牙設定中移除該裝置後重新配對。

    USB 序列埠

    USB 連線提供有線替代方案,適用於桌上型電腦或藍牙無法使用的情況。

    設定

    1. 請使用 USB 傳輸線將無線電裝置連接至您的裝置。
    2. 應用程式將提示要求 USB 權限——請點選「允許」。
    3. 連線將自動建立。

    ⚠️ 注意:USB 連線需要 Android 裝置支援 OTG 功能。

    TCP/IP (Network)

    Some Meshtastic radios support WiFi/Ethernet connectivity, allowing TCP-based connections over your local network. Get the radio onto your network first — using the radio’s own WiFi settings (via the firmware web interface or another connection) — then connect to it from the app.

    Connecting over the Network

    1. Make sure the radio is on the same local network as your phone/desktop.
    2. On the Connect screen, select Network in the transport selector.
    3. Choose the radio one of two ways:
      • Scan for network devices — toggle this on to auto-discover radios that advertise themselves on the local network (mDNS / _meshtastic._tcp). Discovered devices appear in the list; tap one to connect.
      • Add device manually… — enter the radio’s IP address (or hostname) and port (default: 4403).
    4. Previously-used network addresses are remembered under Recent Network Devices for quick reconnection (long-press to remove one).

    💡 Tip: Network discovery uses mDNS, which only works when both devices are on the same subnet. On Android 17+ the app needs the local-network permission for scanning; if discovery finds nothing, add the device manually by IP.

    何時使用 TCP

    • 無線電裝置與裝置位於同一區域網路
    • 使用模擬無線電裝置進行測試
    • 藍牙訊號受干擾的環境

    重新連線行為

    應用程式啟動時將自動重新連接至上次選取的裝置。 您可隨時在連線畫面切換傳輸方式。

    若要中斷連線,請點選連線畫面上的中斷連線按鈕:

    Disconnect from radio

    桌面版連線

    在桌面版(Linux/macOS/Windows)上,應用程式支援:

    • 藍牙(BLE)—— 透過 Kable 函式庫;支援 macOS、Linux 及 Windows
    • USB 序列埠 — 主要的有線連線方式
    • TCP/IP — 適用於透過網路連線的無線電裝置

    請參閱〔桌面版應用程式〕(desktop) 以了解各平台的詳細說明與鍵盤快速鍵。

    相關主題

    • 〔快速入門〕(onboarding) — 首次啟動的設定與權限
    • 〔設定 — 無線電與使用者〕(settings-radio-user) — 藍牙與網路設定
    • 〔桌面版應用程式〕(desktop) — 桌面版連線詳細說明
    • 〔支援的裝置〕(https://meshtastic.org/docs/hardware/devices)— meshtastic.org 上的完整相容無線電裝置清單


    diff --git a/main/zh-rTW/user/onboarding.html b/main/zh-rTW/user/onboarding.html index dbac027cd7..24fba615c4 100644 --- a/main/zh-rTW/user/onboarding.html +++ b/main/zh-rTW/user/onboarding.html @@ -1 +1 @@ - 新手入門 | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 中文 (繁體)
    Meshtastic Docs ↗

    🌐 中文 (繁體) — Community translation View in English

    # 入門指南

    Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

    First Launch

    When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or you can skip and configure permissions later in Android settings.

    Welcome Screen

    The welcome screen introduces Meshtastic and its core capabilities:

    • Off-grid mesh communication
    • No cellular or internet required
    • End-to-end encrypted messaging

    Tap Get Started to proceed through the setup flow.

    Welcome screen

    Permissions

    The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

    Bluetooth Permission

    Bluetooth is the primary connection method between your phone and Meshtastic radio:

    • Bluetooth scanning — discover nearby Meshtastic radios
    • Bluetooth connect — establish and maintain connections with paired radios

    Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

    Location Permission

    ⚠️ Why is location required for Bluetooth? Android requires location permission to discover nearby Bluetooth Low Energy devices. This is an Android system requirement, not a Meshtastic-specific choice.

    Meshtastic also uses your location for:

    • Showing your position on the mesh map
    • Calculating distances to other nodes
    • Sharing your GPS coordinates with other mesh members (if enabled)

    Grant “While using the app” or “Always” depending on your preference:

    • While using the app — position updates only when the app is open
    • Always — enables background position updates for always-on mesh presence

    If denied, Bluetooth scanning will not function and your node will not report a position.

    Notifications Permission

    Notifications alert you to:

    • Incoming messages from channels and direct messages
    • New nodes joining the mesh
    • Low battery on a remote node

    💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

    Critical Alerts Permission

    On supported devices, the app may request permission for critical alerts:

    • These are high-priority notifications that can break through Do Not Disturb mode
    • Useful for emergency mesh alerts or urgent messages
    • You can skip this step if you don’t need breakthrough notifications
    • Configure or revoke later in Android notification settings

    After Setup

    Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

    💡 Tip: If you skipped any permissions during setup, you can grant them later through Android Settings → Apps → Meshtastic → Permissions. The app will prompt you again if a missing permission blocks a feature you try to use.

    What’s Next?

    Once connected to a radio, explore:

    New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.



    + 新手入門 | Meshtastic Android Skip to main content Link Menu Expand (external link) Document Search Copy Copied
    🌐 中文 (繁體)
    Meshtastic Docs ↗

    🌐 中文 (繁體) — Community translation View in English

    # 入門指南

    Welcome to Meshtastic! This guide walks you through the initial setup of the Meshtastic Android app.

    First Launch

    When you open the app for the first time, you’ll be guided through an introductory flow that helps configure essential permissions and settings. Each step can be completed in order, or skipped — nothing here is a one-time offer. Every permission can be reviewed and granted later from Settings → Permissions inside the app.

    Welcome Screen

    The welcome screen introduces Meshtastic and its core capabilities:

    • Off-grid mesh communication
    • No cellular or internet required
    • End-to-end encrypted messaging

    Tap Get Started to proceed through the setup flow.

    Welcome screen

    Permissions

    The app requests several permissions during setup. Each one serves a specific purpose, and some are required for core functionality.

    Bluetooth Permission

    Bluetooth is the primary connection method between your phone and Meshtastic radio:

    • Bluetooth scanning — discover nearby Meshtastic radios
    • Bluetooth connect — establish and maintain connections with paired radios

    Grant both permissions when prompted. Without Bluetooth, you’ll need to use USB or TCP connections instead.

    Location Permission

    ⚠️ Is location required for Bluetooth? On Android 11 and older, yes — those releases treat a Bluetooth scan as a location capability, so the app asks for Location instead of “Nearby devices”, and system Location Services must also be switched on for a scan to return anything. There you will see one location step rather than two, on the Bluetooth screen, because it is a single system permission — and asking twice for it would push you toward the point where Android stops offering the dialog at all (a second denial on Android 11; the “Don’t ask again” checkbox on Android 10 and older). On Android 12 and newer the two are separate: “Nearby devices” is declared neverForLocation, and declining Location does not stop you finding or connecting to a radio.

    Meshtastic also uses your location for:

    • Showing your position on the mesh map
    • Calculating distances to other nodes
    • Sharing your GPS coordinates with other mesh members (if enabled)

    Grant “While using the app” or “Always” depending on your preference:

    • While using the app — position updates only when the app is open
    • Always — enables background position updates for always-on mesh presence

    Declining leaves the rest of the app working: on Android 12 and newer, Bluetooth is unaffected and only the map position and position sharing are disabled. On Android 11 and older, Bluetooth scanning also stops, because that is the permission Android gates it behind.

    Notifications Permission

    Notifications alert you to:

    • Incoming messages from channels and direct messages
    • New nodes joining the mesh
    • Low battery on a remote node

    💡 Tip: You can fine-tune notification preferences later in Android system settings — the app creates a separate notification channel per category (plus a few internal ones, like the background service), so you can enable or silence them individually.

    Critical Alerts Permission

    On supported devices, the app may request permission for critical alerts:

    • These are high-priority notifications that can break through Do Not Disturb mode
    • Useful for emergency mesh alerts or urgent messages
    • You can skip this step if you don’t need breakthrough notifications
    • Configure or revoke later in Android notification settings

    Reviewing permissions later

    Settings → Permissions summarizes where every runtime permission stands. It reads All allowed when nothing needs you, and names the count when something does — opening itself automatically in that case. Tap the row to see the full list at any time:

    狀態 What tapping the row does
    Allowed Opens the system page, so you can review or revoke it
    Not asked yet Requests it
    Denied — tap to allow Explains what the permission is for, then asks again if you agree
    Blocked — tap to open system settings Android will no longer show its dialog, so this opens the page where you can turn it back on
    Not required on this version of Android Nothing — the permission does not exist on your device

    This matters most for notifications. The app used to ask for them in exactly one place — the setup flow — so declining there meant no message, new-node, or low-battery alerts, with nothing in the app that could ask again. Android itself stops showing the dialog once you have declined firmly (a second denial on Android 11 and newer), at which point this row switches to Blocked and sends you to the system settings page instead.

    After Setup

    Once permissions are granted, the app transitions to the main interface. Your first action should be connecting to a Meshtastic radio — see Connections for detailed instructions.

    💡 Tip: If you skipped any permissions during setup, open Settings → Permissions in the app. Every runtime permission is listed there with its current state and a way back to it — including notifications, which the system will not prompt for a second time on its own.

    Features also ask in context. Tapping Scan on the Connections screen with Bluetooth permission missing explains what it is for and offers to request it; once Android stops prompting, the same control opens the system settings page instead of doing nothing.

    What’s Next?

    Once connected to a radio, explore:

    New to Meshtastic? The getting started guide on meshtastic.org covers hardware selection, initial radio configuration, and your first mesh setup.