commit e3642cbc4e8b68b179388bebcea97d7975c8a815 Author: Ryan Malloy Date: Sat Feb 21 18:39:46 2026 -0700 Initial commit: Heltec Wireless Tracker documentation site Astro/Starlight documentation covering hardware specs, pinout, schematics, GNSS protocol, LoRa frequencies, and getting started guides. Includes extracted datasheet images and Docker deployment. diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3808c35 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +# OS +.DS_Store +Thumbs.db + +# Environment overrides +.env.local +.env.*.local diff --git a/docs/datasheet/images/wireless-tracker-datasheet_page_10_img_1.png b/docs/datasheet/images/wireless-tracker-datasheet_page_10_img_1.png new file mode 100644 index 0000000..921f600 Binary files /dev/null and b/docs/datasheet/images/wireless-tracker-datasheet_page_10_img_1.png differ diff --git a/docs/datasheet/images/wireless-tracker-datasheet_page_11_img_1.png b/docs/datasheet/images/wireless-tracker-datasheet_page_11_img_1.png new file mode 100644 index 0000000..921f600 Binary files /dev/null and b/docs/datasheet/images/wireless-tracker-datasheet_page_11_img_1.png differ diff --git a/docs/datasheet/images/wireless-tracker-datasheet_page_12_img_1.png b/docs/datasheet/images/wireless-tracker-datasheet_page_12_img_1.png new file mode 100644 index 0000000..921f600 Binary files /dev/null and b/docs/datasheet/images/wireless-tracker-datasheet_page_12_img_1.png differ diff --git a/docs/datasheet/images/wireless-tracker-datasheet_page_13_img_1.png b/docs/datasheet/images/wireless-tracker-datasheet_page_13_img_1.png new file mode 100644 index 0000000..921f600 Binary files /dev/null and b/docs/datasheet/images/wireless-tracker-datasheet_page_13_img_1.png differ diff --git a/docs/datasheet/images/wireless-tracker-datasheet_page_14_img_1.png b/docs/datasheet/images/wireless-tracker-datasheet_page_14_img_1.png new file mode 100644 index 0000000..921f600 Binary files /dev/null and b/docs/datasheet/images/wireless-tracker-datasheet_page_14_img_1.png differ diff --git a/docs/datasheet/images/wireless-tracker-datasheet_page_15_img_1.png b/docs/datasheet/images/wireless-tracker-datasheet_page_15_img_1.png new file mode 100644 index 0000000..921f600 Binary files /dev/null and b/docs/datasheet/images/wireless-tracker-datasheet_page_15_img_1.png differ diff --git a/docs/datasheet/images/wireless-tracker-datasheet_page_16_img_1.png b/docs/datasheet/images/wireless-tracker-datasheet_page_16_img_1.png new file mode 100644 index 0000000..6b5e2d6 Binary files /dev/null and b/docs/datasheet/images/wireless-tracker-datasheet_page_16_img_1.png differ diff --git a/docs/datasheet/images/wireless-tracker-datasheet_page_16_img_2.png b/docs/datasheet/images/wireless-tracker-datasheet_page_16_img_2.png new file mode 100644 index 0000000..921f600 Binary files /dev/null and b/docs/datasheet/images/wireless-tracker-datasheet_page_16_img_2.png differ diff --git a/docs/datasheet/images/wireless-tracker-datasheet_page_17_img_1.png b/docs/datasheet/images/wireless-tracker-datasheet_page_17_img_1.png new file mode 100644 index 0000000..921f600 Binary files /dev/null and b/docs/datasheet/images/wireless-tracker-datasheet_page_17_img_1.png differ diff --git a/docs/datasheet/images/wireless-tracker-datasheet_page_1_img_1.png b/docs/datasheet/images/wireless-tracker-datasheet_page_1_img_1.png new file mode 100644 index 0000000..f531303 Binary files /dev/null and b/docs/datasheet/images/wireless-tracker-datasheet_page_1_img_1.png differ diff --git a/docs/datasheet/images/wireless-tracker-datasheet_page_1_img_2.png b/docs/datasheet/images/wireless-tracker-datasheet_page_1_img_2.png new file mode 100644 index 0000000..9ecfe79 Binary files /dev/null and b/docs/datasheet/images/wireless-tracker-datasheet_page_1_img_2.png differ diff --git a/docs/datasheet/images/wireless-tracker-datasheet_page_2_img_1.png b/docs/datasheet/images/wireless-tracker-datasheet_page_2_img_1.png new file mode 100644 index 0000000..921f600 Binary files /dev/null and b/docs/datasheet/images/wireless-tracker-datasheet_page_2_img_1.png differ diff --git a/docs/datasheet/images/wireless-tracker-datasheet_page_3_img_1.png b/docs/datasheet/images/wireless-tracker-datasheet_page_3_img_1.png new file mode 100644 index 0000000..921f600 Binary files /dev/null and b/docs/datasheet/images/wireless-tracker-datasheet_page_3_img_1.png differ diff --git a/docs/datasheet/images/wireless-tracker-datasheet_page_4_img_1.png b/docs/datasheet/images/wireless-tracker-datasheet_page_4_img_1.png new file mode 100644 index 0000000..921f600 Binary files /dev/null and b/docs/datasheet/images/wireless-tracker-datasheet_page_4_img_1.png differ diff --git a/docs/datasheet/images/wireless-tracker-datasheet_page_5_img_1.png b/docs/datasheet/images/wireless-tracker-datasheet_page_5_img_1.png new file mode 100644 index 0000000..921f600 Binary files /dev/null and b/docs/datasheet/images/wireless-tracker-datasheet_page_5_img_1.png differ diff --git a/docs/datasheet/images/wireless-tracker-datasheet_page_6_img_1.png b/docs/datasheet/images/wireless-tracker-datasheet_page_6_img_1.png new file mode 100644 index 0000000..1b100ae Binary files /dev/null and b/docs/datasheet/images/wireless-tracker-datasheet_page_6_img_1.png differ diff --git a/docs/datasheet/images/wireless-tracker-datasheet_page_6_img_2.png b/docs/datasheet/images/wireless-tracker-datasheet_page_6_img_2.png new file mode 100644 index 0000000..921f600 Binary files /dev/null and b/docs/datasheet/images/wireless-tracker-datasheet_page_6_img_2.png differ diff --git a/docs/datasheet/images/wireless-tracker-datasheet_page_7_img_1.png b/docs/datasheet/images/wireless-tracker-datasheet_page_7_img_1.png new file mode 100644 index 0000000..921f600 Binary files /dev/null and b/docs/datasheet/images/wireless-tracker-datasheet_page_7_img_1.png differ diff --git a/docs/datasheet/images/wireless-tracker-datasheet_page_8_img_1.png b/docs/datasheet/images/wireless-tracker-datasheet_page_8_img_1.png new file mode 100644 index 0000000..921f600 Binary files /dev/null and b/docs/datasheet/images/wireless-tracker-datasheet_page_8_img_1.png differ diff --git a/docs/datasheet/images/wireless-tracker-datasheet_page_9_img_1.png b/docs/datasheet/images/wireless-tracker-datasheet_page_9_img_1.png new file mode 100644 index 0000000..921f600 Binary files /dev/null and b/docs/datasheet/images/wireless-tracker-datasheet_page_9_img_1.png differ diff --git a/docs/datasheet/markdown/wireless-tracker-datasheet.md b/docs/datasheet/markdown/wireless-tracker-datasheet.md new file mode 100644 index 0000000..32e09a1 --- /dev/null +++ b/docs/datasheet/markdown/wireless-tracker-datasheet.md @@ -0,0 +1,384 @@ +# Document Metadata +**Format:** PDF 1.7 +**Author:** Aaron Lee +**Creator:** WPS 文字 +**Creation Date:** D:20241224151548+08'00' +**Mod Date:** D:20241224151548+08'00' + +--- + +## Page 1 + +https://heltec.org +Documents +Rev 1.1 +P 1/17 +May 2023 +Heltec Automation © Limited standard files +Wireless Tracker V1.1 +Wi-Fi/LoRa/BLE/GNSS(L5) +Development Kit + +![Image 1 from page 1](../images/wireless-tracker-datasheet_page_1_img_1.png) + +![Image 2 from page 1](../images/wireless-tracker-datasheet_page_1_img_2.png) + +## Page 2 + +https://heltec.org +Documents +Rev 1.1 +P 2/17 +May 2023 +Heltec Automation © Limited standard files +Document version +Version +Time +Description +Remark +V1.0 +2023-05-16 +Documents creating +Richard +V1.1 +2023-05-21 +Document structure update +Richard +V1.1.1 +2024-10-10 +Update the GNSS module parameter description +Richard +Copyright Notice +All contents in the files are protected by copyright law, and all copyrights are +reserved by Chengdu Heltec Automation Technology Co., Ltd. (hereinafter referred to +as Heltec). Without written permission, all commercial use of the files from Heltec +are forbidden, such as copy, distribute, reproduce the files, etc., but non-commercial +purpose, downloaded or printed by individual are welcome. +Disclaimer +Chengdu Heltec Automation Technology Co., Ltd. reserves the right to change, +modify or improve the document and product described herein. Its contents are +subject to change without notice. These instructions are intended for you use. + +## Page 3 + +https://heltec.org +Documents +Rev 1.1 +P 3/17 +May 2023 +Heltec Automation © Limited standard files +Content +Wireless Tracker...................................................................................................................................1 +Document version.................................................................................................................................2 +Copyright Notice................................................................................................................................... 2 +Disclaimer............................................................................................................................................. 2 +Content..................................................................................................................................................3 +1. Description........................................................................................................................................ 4 +1.1 Overview.................................................................................................................................... 4 +1.2 Product features.........................................................................................................................5 +2. Pin Definition.....................................................................................................................................6 +2.1 Pin assignment...........................................................................................................................6 +2.2 Pin description............................................................................................................................7 +3. Specifications.................................................................................................................................. 10 +3.1 General specifications..............................................................................................................10 +3.2 Power supply............................................................................................................................11 +3.3 Power output............................................................................................................................11 +3.4 Power characteristics...............................................................................................................12 +3.5 LoRa RF characteristics............................................................................................................ 12 +3.6 GNSS Characteristics................................................................................................................14 +4. Typical hardware connections........................................................................ 错误!未定义书签。 +4.1 Physical dimensions................................................................................................................. 16 +5. Resource..........................................................................................................................................16 +5.1 Relevant Resource....................................................................................................................16 +5.2 Contact Information.................................................................................................................16 + +## Page 4 + +https://heltec.org +Documents +Rev 1.1 +P 4/17 +May 2023 +Heltec Automation © Limited standard files +# 1. Description +## 1.1 Overview +Wireless Tracker is a development kit based on ESP32-S3FN8. It integrates both SX1262 and +UC6580 to provide fast GNSS solution for IoT. Collaborate with the sample programs and +development tools we provide, you can track any object and then upload that data wirelessly +by Wi-Fi, Bluetooth, LoRa. +Wireless Tracker supports L1 + L5 and supports GPS, GLONASS, BDS, Galileo, NAVIC, QZSS +multi-system joint positioning. It is perfectly compatible with Arduino, can be widely used in +development such as bicycle sharing services, tracking pets or livestock, locating vehicles, +tracking children, etc. +Wireless Tracker are available in two product variants: + +### Table 1.1: Product model list +| No. | Model | Description | +|-----|-------|-------------| +| 1 | Wireless Tracker-LF | 470~510MHz working LoRa frequency, used for China mainland (CN470) LPW band. | +| 2 | Wireless Tracker-HF | For EU868, IN865, US915, AU915, AS923, KR920 and other LPW networks with operating frequencies between 863~928MHz. | + +## Page 5 + +https://heltec.org +Documents +Rev 1.1 +P 5/17 +May 2023 +Heltec Automation © Limited standard files +## 1.2 Product features + +- ESP32-S3FN8+SX1262+UC6580 Chipset, supports Wi-Fi, LoRa, Bluetooth, GNSS. +- Low power design of dual-frequency multi-system based on 22nm technology. +- Supports L1 + L5, supports GPS, GLONASS, BDS, Galileo, NAVIC, QZSS multi-system joint positioning.¹ +- Type-C USB interface with a complete voltage regulator, ESD protection, short circuit protection, RF shielding, and other protection measures. +- Onboard SH1.25-2 battery interface, integrated lithium battery management system (charge and discharge management, overcharge protection, battery power detection, USB / battery power automatic switching). +- Onboard Wi-Fi, Bluetooth dedicated 2.4GHz metal spring antenna, reserved IPEX (U.FL) interface for LoRa and GNSS use. +- Onboard 0.96-inch 80(H) x 160(V) RGB TFT-LCD display, which can be used to display debugging information, battery power, and other information. +- Support the Arduino development environment. + +¹ See the GNSS module manual for details on supported projects: UFirebird_Standard Positioning Products Protocol Specification + +## Page 6 + +https://heltec.org +Documents +Rev 1.1 +P 6/17 +May 2023 +Heltec Automation © Limited standard files +# 2. Pin Definition +## 2.1 Pin assignment + +![Pin Assignment](../images/wireless-tracker-datasheet_page_6_img_1.png) + +## Page 7 + +https://heltec.org +Documents +Rev 1.1 +P 7/17 +May 2023 +Heltec Automation © Limited standard files +## 2.2 Pin description + +### Header J2 +Table 2-2-1: Pin description + +| No. | Name | Type | Function | +|-----|------|------|----------| +| 1 | 5V | P | 5V Power Supply | +| 2 | GND | P | Ground | +| 3 | 3V3 | P | Output 3.3V | +| 4 | GND | P | Ground | +| 5 | 3V3 | P | Output 3.3V | +| 6 | GND | P | Ground | +| 7 | Vext | P | Output 3.3V, power supply for built-in TFT and GNSS | +| 8 | GND | P | Ground | +| 1 | RST | P | RST_SW | +| 2 | 0 | I/O | GPIO0, USER_SW | +| 3 | 1 | I/O | GPIO1, Vbat_Read², Touch1, ADC1_CH0 | +| 4 | 2 | I/O | GPIO2, ADC Ctrl, Touch1, ADC1_CH0 | +| 5 | 3 | I/O | GPIO3, Vext Ctrl, Touch1, ADC1_CH0 | +| 6 | 19 | I/O | GPIO19, USB_D-, CLK_OUT2, ADC2_CH8, U1RTS | +| 7 | 20 | I | GPIO20, USB_D+, CLK_OUT1, ADC2_CH9, U1CTS | +| 8 | 21 | I/O | GPIO21, TFT_LED_K | +| 9 | 26 | I/O | GPIO26, SPICS1 | +| 10 | 48 | I/O | GPIO48, D_SEL | +| 11 | 47 | I/O | GPIO47, Boot_Mode | +| 12 | 33 | I/O | GPIO33, SPIIO4, FSPIHD, SUBSPIHD, GNSS_TX | +| 13 | 34 | I/O | GPIO34, SPI05, FSPICS0, SUBSPICS0, GNSS_RX | +| 14 | 35 | I/O | GPIO35, SPI06, FSPID, SUBSPID, GNSS_RST | +| 15 | 36 | I/O | GPIO36, SPI07, FSPICLK, SUBSPICLK, GNSS_PPS | +| 16 | 37 | I/O | GPIO37, SPIDQS, FSPIQ, SUBSPIQ | + +² VBAT=Vbat_Read*4.9 + +### Header J3 +Table 2-2-2: Pin description + +| No. | Name | Type | Function | +|-----|------|------|----------| +| 1 | 18 | I/O | GPIO18, U1RXD, ADC2_CH7, CLK_OUT3, LED Write Ctrl | +| 2 | 17 | I/O | GPIO17, U1TXD, ADC2_CH6 | +| 3 | 16 | I/O | GPIO16, U0CTS, ADC2_CH5, XTAL_32K_N | +| 4 | 15 | I/O | GPIO15, U0RTS, ADC2_CH4, XTAL_32K_P | +| 5 | 7 | I/O | GPIO7, ADC1_CH6, TOUCH7 | +| 6 | 6 | I/O | GPIO6, ADC1_CH5, TOUCH6 | +| 7 | 5 | I/O | GPIO5, ADC1_CH4, TOUCH5 | +| 8 | 4 | I/O | GPIO4, ADC1_CH3, TOUCH4 | +| 1 | 46 | I/O | GPIO46 | +| 2 | 45 | I/O | GPIO45 | +| 4 | 44 | I/O | GPIO44, U0RXD | +| 5 | 43 | I/O | GPIO43, U0TXD | +| 6 | 14 | I/O | GPIO14, ADC2_CH3, TOUCH14, FSPIDQS, SUBSPIWP, FSPIWP, LoRa_DIO1 | +| 7 | 13 | I/O | GPIO13, ADC2_CH2, TOUCH13, FSPIIO7, SUBSPIQ, FSPIQ, LoRa_Busy | +| 8 | 12 | I/O | GPIO12, ADC2_CH1, TOUCH12, FSPIIO6, SUBSPICLK, FSPICLK, LoRa_RST | +| 9 | 11 | I/O | GPIO11, ADC2_CH0, TOUCH11, FSPIIO5, SUBSPID, FSPID, LoRa_MISO | +| 10 | 10 | I/O | GPIO10, ADC1_CH9, TOUCH10, FSPIIO4, SUBSPICS0, FSPICS0, LoRa_MOSI | +| 11 | 9 | I/O | GPIO9, ADC1_CH8, TOUCH9, SUBSPIHD, FSPIHD, LoRa_SCK | +| 12 | 8 | I/O | GPIO8, ADC1_CH7, TOUCH8, SUBSPICS1, LoRa_NSS | +| 13 | 42 | I/O | GPIO42, MTMS, TFT_SDIN | +| 14 | 41 | I/O | GPIO41, MTDI, TFT_SCLK | +| 15 | 40 | I/O | GPIO40, MTMS, TFT_RS | +| 16 | 39 | I/O | GPIO39, MTMS, TFT_RES | +| 18 | 38 | I/O | GPIO38, FSPIWP, SUBSPIWP, TFT_CS | + +## Page 10 + +https://heltec.org +Documents +Rev 1.1 +P 10/17 +May 2023 +Heltec Automation © Limited standard files +# 3. Specifications +## 3.1 General specifications + +### Table 3-1: General specifications +| Parameters | Description | +|------------|-------------| +| Master Chip | ESP32-S3FN8 (Xtensa®32-bit lx7 dual core processor) | +| LoRa Chipset | SX1262 | +| GNSS Chipset | UC6580 | +| Frequency | 470~510MHz, 863~928MHz | +| Max TX Power | 21 ± 1dBm | +| Receiving sensitivity | -135dBm | +| Wi-Fi | 802.11 b/g/n | +| Bluetooth | Bluetooth LE: Bluetooth 5, Bluetooth mesh | +| Interface | Type-C USB; 2*1.25 lithium battery interface; LoRa ANT(IPEX); GNSS ANT(IPEX) | +| Battery | 3.7V lithium battery power supply and charging | +| Operating temperature | -20 ~ 70℃ | +| Dimensions | 65.48mm* 28.06mm* 13.52mm | + +## Page 11 + +## 3.2 Power supply +Except when USB or 5V Pin is connected separately, lithium battery can be connected to charge it. +In other cases, only a single power supply can be connected. + +### Table 3-2: Power supply +| Power supply mode | Minimum | Typical | Maximum | Unit | +|-------------------|---------|---------|---------|------| +| Type-C USB(≥500mA) | 4.7 | 5 | 6 | V | +| Lithium battery(≥250mA) | 3.3 | 3.7 | 4.2 | V | +| 5V pin(≥500mA) | 4.7 | 5 | 6 | V | +| 3V3 pin(≥150mA) | 2.7 | 3.3 | 3.5 | V | + +## 3.3 Power output + +### Table 3-3: Power output +| Output Pin | electric current | Unit | +|------------|------------------|------| +| 3.3V Pin | 500 | mA | +| 5V Pin (USB Powered only) | 500 | mA | +| Vext Pin | 350 | mA | + +## Page 12 + +## 3.4 Power characteristics + +### Table 3-4: Power characteristics +| Mode | USB power | VBAT/battery powered | Unit | +|------|-----------|---------------------|------| +| Wi-Fi Scan | 100 | 74 | mA | +| Wi-Fi AP | 150 | 111 | mA | +| BT | 102 | 75 | mA | +| GNSS | 120 | 89 | mA | +| TX 14dbm | 200 | 148 | mA | +| TX 17dbm | 220 | 163 | mA | +| TX 22dbm | 240 | 178 | mA | +| RX (TX disabled; RX enabled) | 80 | 59 | mA | +| sleep | 2mA | 15μA | | + +## 3.5 LoRa RF characteristics + +### 3.5.1 Transmit power +Table3-5-1: Transmit power +| Operating frequency band | Maximum power value/[dBm] | +|--------------------------|---------------------------| +| 470~510 | 21 ± 1 | +| 867~870 | 21 ± 1 | +| 902~928 | 21 ± 1 | + +### 3.5.2 Receiving sensitivity +The following table gives typically sensitivity level of the Wireless Tracker-(L/H). + +Table3-5-2: Receiving sensitivity +| Signal Bandwidth/[KHz] | Spreading Factor | Sensitivity/[dBm] | +|------------------------|------------------|-------------------| +| 125 | SF12 | -135 | +| 125 | SF10 | -130 | +| 125 | SF7 | -124 | + +### 3.5.3 Operation Frequencies +Wireless Tracker supports LoRaWAN frequency channels and models corresponding table. + +Table3-5-3: Operation Frequencies +| Region | Frequency (MHz) | Model | +|--------|-----------------|-------| +| EU433 | 433.175~434.665 | Wireless Tracker-LF | +| CN470 | 470~510 | Wireless Tracker-LF | +| IN868 | 865~867 | Wireless Tracker-HF | +| EU868 | 863~870 | Wireless Tracker-HF | +| US915 | 902~928 | Wireless Tracker-HF | +| AU915 | 915~928 | Wireless Tracker-HF | +| KR920 | 920~923 | Wireless Tracker-HF | +| AS923 | 920~925 | Wireless Tracker-HF | + +## Page 14 + +## 3.6 GNSS Characteristics + +### 3.6.1 Basic information +Table3-6-1: Basic information +| Parameter | Value | +|-----------|-------| +| Channel | 96 | +| Update frequency | Max 10 Hz | +| Data format | NMEA-0183, Unicore, RTCM 3.x | +| Frequency point | BDS: B2a, GPS: L1+L5, GLONASS: G1, Galileo: E1+E5a, QZSS: L1+L5, SBAS: L1, NAVIC: L5*(Specific firmware) | + +### 3.6.2 Accuracy and TTFF +Table3-6-2: Accuracy and TTFF +| Parameter | Value | +|-----------|-------| +| Horizontal position accuracy(RMS) | 1.5m | +| Vertical position accuracy(RMS) | 2.5m | +| Time accuracy(RMS) | 5ns | +| Speed accuracy | 0.02m/s³ | +| Cold boot | <26s | +| Warm boot | <2s | +| Recapture | 1s | + +³ -33 mps linear uniform motion scene under the simulator + +### 3.6.3 Sensitivity (Unit: dBm) +Table3-6-3: Sensitivity + +| Sensitivity | GNSS | BDS | GPS | GAL | GLONASS | +|-------------|------|-----|-----|-----|---------| +| Cold boot | -148 | -146 | -148 | -144 | -144 | +| Warm boot | -156 | -155 | -155 | -154 | -148 | +| Trace | -165 | -163 | -165 | -163 | -158 | +| Recapture | -156 | -154 | -156 | -154 | -152 | + +## Page 16 + +# 4. Physical dimensions + +![Physical Dimensions](../images/wireless-tracker-datasheet_page_16_img_1.png) + +# 5. Resource + +## 5.1 Relevant Resource +- Heltec ESP (ESP32 & ESP8266) framework (Already included Heltec ESP32 LoRaWAN library) +- Heltec LoRaWAN test server based on SnapEmu +- User Manual Document + +## 5.2 Contact Information +Heltec Automation Technology Co., Ltd +Chengdu, Sichuan, China +Email: support@heltec.cn +Phone: +86-028-62374838 +https://heltec.org diff --git a/docs/examples/heart-rate-monitor.md b/docs/examples/heart-rate-monitor.md new file mode 100644 index 0000000..47e0e4e --- /dev/null +++ b/docs/examples/heart-rate-monitor.md @@ -0,0 +1,294 @@ +# Monitor Heart Rate on SnapEmu with Wireless Tracker + +## Overview + +This project enables real-time heart rate monitoring using a wireless tracker connected to a heart rate sensor. Data transmits via LoRaWAN protocol to the SnapEmu platform for visualization and analysis. + +## Hardware Components Required + +| Component | Purpose | +|-----------|---------| +| Heltec Wireless Tracker | Main controller + LoRa TX | +| HT-M7603 Indoor LoRa Gateway | LoRaWAN network gateway | +| MAX30102 Heart Rate Sensor | Pulse oximetry sensor | +| DuPont Wires | Connections | + +## Hardware Configuration + +### Pin Connections + +The MAX30102 sensor connects to the Heltec Wireless Tracker using I2C: + +| MAX30102 Pin | Wireless Tracker Pin | Description | +|--------------|---------------------|-------------| +| VCC | 3V3 | Power (3.3V) | +| GND | GND | Ground | +| SDA | GPIO45 | I2C Data | +| SCL | GPIO46 | I2C Clock | + +> **Note:** GPIO45 and GPIO46 are recommended as they don't have conflicting built-in functions. + +## Software Setup + +### Step 1: Configure HT-M7603 Gateway + +Configure your LoRa gateway connection to SnapEmu platform: +- Follow [official Heltec documentation](https://docs.heltec.cn/en/gateway/ht-m7603/connect_to_snapemu.html) + +### Step 2: Register Tracker Node + +Register your wireless tracker device on SnapEmu: +- Follow [node device connection guidelines](https://snapemudoc.readthedocs.io/en/latest/Node%20Devices%20Connection/register_on_snapemu.html) + +### Step 3: Install Libraries + +Required Arduino libraries: +- `Wire.h` (built-in) +- `MAX30102_PulseOximeter.h` +- `LoRaWan_APP.h` (Heltec library) + +### Step 4: Sensor Test Code + +First, test the sensor standalone: + +```cpp +#include +#include "MAX30102_PulseOximeter.h" + +#define REPORTING_PERIOD_MS 1000 +PulseOximeter pox; +uint32_t tsLastReport = 0; + +void onBeatDetected() { + Serial.println("Beat detected!"); +} + +void setup() { + Serial.begin(115200); + Wire.begin(45, 46); // SDA=GPIO45, SCL=GPIO46 + Serial.print("Initializing MAX30102.."); + delay(3000); + + if (!pox.begin()) { + Serial.println("FAILED"); + for(;;); + } else { + Serial.println("SUCCESS"); + } + + pox.setIRLedCurrent(MAX30102_LED_CURR_7_6MA); + pox.setOnBeatDetectedCallback(onBeatDetected); +} + +void loop() { + pox.update(); + + if (millis() - tsLastReport > REPORTING_PERIOD_MS) { + float heartRate = pox.getHeartRate(); + float spo2 = pox.getSpO2(); + + if (heartRate > 0) { + Serial.print("Heart rate: "); + Serial.print(heartRate); + Serial.print(" bpm / "); + } else { + Serial.print("Heart rate: N/A / "); + } + + if (spo2 > 0) { + Serial.print("SpO2: "); + Serial.print(spo2); + Serial.println(" %"); + } else { + Serial.println("SpO2: N/A"); + } + + tsLastReport = millis(); + } +} +``` + +### Step 5: Full LoRaWAN Code + +Complete code with LoRaWAN transmission: + +```cpp +#include +#include "MAX30102_PulseOximeter.h" +#include "LoRaWan_APP.h" + +#define REPORTING_PERIOD_MS 1000 + +// OTAA Parameters - Replace with your values from SnapEmu +uint8_t devEui[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA8 }; +uint8_t appEui[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; +uint8_t appKey[] = { 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 }; + +// LoRaWAN Configuration +uint16_t userChannelsMask[6] = { 0x00FF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }; +LoRaMacRegion_t loraWanRegion = ACTIVE_REGION; +DeviceClass_t loraWanClass = CLASS_A; +uint32_t appTxDutyCycle = 15000; // 15 second transmit interval +bool overTheAirActivation = true; +bool loraWanAdr = true; +bool isTxConfirmed = true; +uint8_t appPort = 2; +uint8_t confirmedNbTrials = 4; + +PulseOximeter pox; +uint32_t tsLastReport = 0; + +static void prepareTxFrame(uint8_t port) { + pox.update(); + float heartRate = pox.getHeartRate(); + float spo2 = pox.getSpO2(); + unsigned char *puc; + + appDataSize = 0; + + // Packet header + appData[appDataSize++] = 0x04; + appData[appDataSize++] = 0x00; + appData[appDataSize++] = 0x0A; + appData[appDataSize++] = 0x02; + + // Heart rate (4 bytes float) + puc = (unsigned char *)(&heartRate); + appData[appDataSize++] = puc[0]; + appData[appDataSize++] = puc[1]; + appData[appDataSize++] = puc[2]; + appData[appDataSize++] = puc[3]; + + // Separator + appData[appDataSize++] = 0x12; + + // SpO2 (4 bytes float) + puc = (unsigned char *)(&spo2); + appData[appDataSize++] = puc[0]; + appData[appDataSize++] = puc[1]; + appData[appDataSize++] = puc[2]; + appData[appDataSize++] = puc[3]; + + Serial.print("TX: HR="); + Serial.print(heartRate); + Serial.print(" SpO2="); + Serial.println(spo2); +} + +void onBeatDetected() { + Serial.println("♥ Beat!"); +} + +void setup() { + Serial.begin(115200); + Wire.begin(45, 46); + Mcu.begin(HELTEC_BOARD, SLOW_CLK_TPYE); + + Serial.print("Initializing MAX30102.."); + delay(3000); + + if (!pox.begin()) { + Serial.println("FAILED"); + for(;;); + } + Serial.println("SUCCESS"); + + pox.setIRLedCurrent(MAX30102_LED_CURR_27_1MA); + pox.setOnBeatDetectedCallback(onBeatDetected); + + LoRaWAN.init(loraWanClass, loraWanRegion); + LoRaWAN.setDefaultDR(3); +} + +void loop() { + pox.update(); + + // Local display + if (millis() - tsLastReport > REPORTING_PERIOD_MS) { + float heartRate = pox.getHeartRate(); + float spo2 = pox.getSpO2(); + + Serial.print("HR: "); + Serial.print(heartRate > 0 ? String(heartRate) : "N/A"); + Serial.print(" bpm | SpO2: "); + Serial.print(spo2 > 0 ? String(spo2) : "N/A"); + Serial.println("%"); + + tsLastReport = millis(); + } + + // LoRaWAN state machine + switch (deviceState) { + case DEVICE_STATE_INIT: + case DEVICE_STATE_JOIN: + LoRaWAN.join(); + break; + case DEVICE_STATE_SEND: + prepareTxFrame(appPort); + LoRaWAN.send(); + deviceState = DEVICE_STATE_CYCLE; + break; + case DEVICE_STATE_CYCLE: + txDutyCycleTime = appTxDutyCycle + randr(-APP_TX_DUTYCYCLE_RND, APP_TX_DUTYCYCLE_RND); + LoRaWAN.cycle(txDutyCycleTime); + deviceState = DEVICE_STATE_SLEEP; + break; + case DEVICE_STATE_SLEEP: + LoRaWAN.sleep(loraWanClass); + break; + default: + deviceState = DEVICE_STATE_INIT; + break; + } +} +``` + +## Data Decoding on SnapEmu + +Custom decoder function for the payload format: + +```javascript +function Decoder(bytes, port) { + var decoded = {}; + + if (bytes.length >= 13) { + // Extract heart rate (bytes 4-7) + var hrBytes = new Uint8Array([bytes[4], bytes[5], bytes[6], bytes[7]]); + var hrView = new DataView(hrBytes.buffer); + decoded.heartRate = hrView.getFloat32(0, true); + + // Extract SpO2 (bytes 9-12) + var spo2Bytes = new Uint8Array([bytes[9], bytes[10], bytes[11], bytes[12]]); + var spo2View = new DataView(spo2Bytes.buffer); + decoded.spo2 = spo2View.getFloat32(0, true); + } + + return decoded; +} +``` + +## Platform Visualization + +SnapEmu displays: +- Real-time heart rate graph +- SpO2 level monitoring +- Historical data (up to 1 month) +- Mobile app + web interface + +## Troubleshooting + +| Issue | Solution | +|-------|----------| +| No heartbeat detected | Ensure finger is properly placed, adjust LED current | +| Erratic readings | Clean sensor, reduce movement, check power supply | +| LoRa join failed | Verify gateway connection, check credentials | +| Data not showing on platform | Check decoder function, verify port number | + +## References + +- [SnapEmu Documentation](https://snapemudoc.readthedocs.io/) +- [Heltec Sensor Decoding](https://docs.heltec.cn/general/define_sensor_decoding_function_on_snapemu.html) +- Original project by ashley15 on Hackster.io + +**License:** GPL3+ diff --git a/docs/examples/meshtastic-low-power.md b/docs/examples/meshtastic-low-power.md new file mode 100644 index 0000000..01eda35 --- /dev/null +++ b/docs/examples/meshtastic-low-power.md @@ -0,0 +1,107 @@ +# Heltec Tracker Meshtastic Low Power Setting Tutorial + +## Overview + +This project demonstrates how to configure a Heltec Wireless Tracker with Meshtastic to achieve extended battery life through low-power mode settings. The device integrates ESP32-S3FN8, SX1262 LoRa module, and UC6580 GNSS for IoT tracking applications. + +## Hardware Requirements + +- Heltec Wireless Tracker development kit +- 1000mAh lithium battery (fully charged) +- LoRa adapter antenna +- Latest Meshtastic firmware version + +## Configuration Steps + +### Device Role Setup + +Set the device operating mode: +- **Role**: TRACKER + +### Position Configuration + +Adjust location broadcasting parameters: + +| Parameter | Value | Description | +|-----------|-------|-------------| +| Position broadcast interval | 900 seconds | How often to broadcast location | +| Smart broadcast min distance | 10 meters | Minimum movement to trigger broadcast | +| Smart broadcast min interval | 900 seconds | Minimum time between broadcasts | +| GPS update interval | 30 seconds | How often to poll GPS | +| GPS_RX_PIN | 33 | GNSS receive pin | +| GPS_TX_PIN | 34 | GNSS transmit pin | +| PIN_GPS_EN | 3 | GNSS power enable (V1.1) | + +### Power Management Configuration + +Enable sleep modes for power conservation: + +| Parameter | Value | Description | +|-----------|-------|-------------| +| Wait for Bluetooth | 0 | Don't wait for BT connection | +| Super deep sleep duration | 1800 seconds | Deep sleep period | +| Light sleep duration | 900 seconds | Light sleep period | +| Minimum wake time | 30 seconds | Minimum active time | + +## Meshtastic App Configuration + +Using the Meshtastic mobile app: + +1. Connect to device via Bluetooth +2. Navigate to **Settings** → **Device Config** +3. Set Role to **TRACKER** +4. Navigate to **Position Config** +5. Apply the position parameters above +6. Navigate to **Power Config** +7. Apply the power parameters above +8. Save and reboot device + +## Results + +Successfully configured devices achieve dramatically reduced power consumption: + +| Metric | Value | +|--------|-------| +| **Idle current draw** | 13 microamps | +| **Active operation** | ~1% battery per hour | +| **Expected runtime (1000mAh)** | ~100 hours active | + +## Power Consumption Breakdown + +| Mode | Current Draw | +|------|--------------| +| Deep Sleep | 13 µA | +| Light Sleep | ~1 mA | +| GPS Active | ~89 mA | +| LoRa TX | ~178 mA | +| LoRa RX | ~59 mA | + +## Tips for Maximum Battery Life + +1. **Use larger battery**: 2000-3000mAh recommended for multi-day operation +2. **Optimize broadcast interval**: Increase if tracking precision isn't critical +3. **Use external antenna**: Better signal = faster TX, less power +4. **Disable WiFi**: If not needed for configuration +5. **Reduce GPS polling**: 60-120 second intervals for stationary tracking + +## Troubleshooting + +### Device won't enter deep sleep +- Ensure Bluetooth timeout is set to 0 +- Check that no active mesh traffic is preventing sleep +- Verify firmware version supports deep sleep + +### GPS not getting fix +- Ensure GPIO3 is HIGH (V1.1 hardware) +- Check antenna connection +- Allow 30-60 seconds for cold start fix + +### Battery draining fast +- Check if device is stuck in active mode +- Verify sleep settings were saved +- Monitor serial output for wake events + +## Source + +Original project by ashley15 on Hackster.io +License: Open source diff --git a/docs/gnss-protocol/images/gnss-protocol_page_1_img_1.png b/docs/gnss-protocol/images/gnss-protocol_page_1_img_1.png new file mode 100644 index 0000000..ef1da79 Binary files /dev/null and b/docs/gnss-protocol/images/gnss-protocol_page_1_img_1.png differ diff --git a/docs/gnss-protocol/images/gnss-protocol_page_1_img_2.png b/docs/gnss-protocol/images/gnss-protocol_page_1_img_2.png new file mode 100644 index 0000000..6c6bd2e Binary files /dev/null and b/docs/gnss-protocol/images/gnss-protocol_page_1_img_2.png differ diff --git a/docs/gnss-protocol/markdown/gnss-protocol.md b/docs/gnss-protocol/markdown/gnss-protocol.md new file mode 100644 index 0000000..85ee8a2 --- /dev/null +++ b/docs/gnss-protocol/markdown/gnss-protocol.md @@ -0,0 +1,3190 @@ +# Document Metadata +**Format:** PDF 1.5 +**Title:** UFirebird_Standard Positioning Products Protocol Specification_EN +**Author:** joyfulmaggie +**Creator:** Microsoft® Word 2016 +**Producer:** Microsoft® Word 2016 +**Creation Date:** D:20220328135555+08'00' +**Mod Date:** D:20220328135722+08'00' + +--- + +## Page 1 + +STANDARD POSITIONING +PROTOCOL +WWW.UNICORECOMM.COM +Copyright© 2009-2022, Unicore Communications, Inc. +Data subject to change without notice. +Standard Positioning +Products + +![Image 1 from page 1](../images/gnss-protocol_page_1_img_1.png) + +![Image 2 from page 1](../images/gnss-protocol_page_1_img_2.png) + +## Page 2 + +i +Revision History +Version +Revision History +Date +Ver. 1.0.0 +Primary +Initial release revision +Jul, 2017 +Ver.2.0.0 +Alpha release +Perfect the NMEA protocol +Aug, 2017 +Ver.3.2.1 Beta +release +Mass production release +Dec, 2017 +Ver.3.3.0 Beta +release + +Add BD3 satellite with the number of 15-37 + +Update QZSS ID to 193/194/195/199 + +Limited to output GGA/GSA/GSV/RMC messages by +default + +Add AIDTIME/AIDPOS/AIDINFO command +Apr, 2019 +Ver.3.4.0 Beta +release + +Add SBAS + +Add echo with \#... +Jun, 2019 +R3.5 + +Revise table 1.4.2.2 + +Revise CFGPRT echo + +Revise CFGDYN echo + +Revise GGA Altref + +Revise RMC spd + +Add CFGGEOID and discrepancy instructions for +multi-version firmware +2020-03-30 +R4 + +Add protocols supported by R3.2.10.0 +2020-09-12 +R4.1 + +Add protocols supported by R3.2.10.100 +2020-12-04 +R4.2 + +Update parameters of NMEA message +2020-12-31 +R4.3 + +Add CFGBLK command + +Add FCTATEST command and update talker ID of +GLL/VTG/GST + +Remove CFGDYN command + +Change the bit2 of CFGSAVE mask field to reserve + +Update checksum description in section 1.2 + +Update default configuration of NOTICE +2021-04-08 + +![Image 1 from page 2](../images/gnss-protocol_page_2_img_1.png) + +## Page 3 + +Standard Positioning Products Protocol Specification +ii +R4.4 + +Add CFGDYN, and revise the parameter description of +CFGMOD + +Update the field description of ANTSTAT1/ +CFGLOWPOWER + +Update NAVTIME +2021-06-24 +R4.5 + +Add ABNORMAL message + +Add the baud rate of R3.4.0.19 version +2021-10-15 +R4.6 + +Add EPHABNORMAL command; + +Add information about the firmware R3.2.20.100; + +Revise the message syntax, examples, and +descriptions according to the test results +2022-03-28 +Disclaimer +This manual provides information about the products of Unicore Communications, Inc. +This document does not transfer the patent, trademark, copyright of the company or any +third party, or any right or permission under it by implication, estoppel or otherwise. +Except as stated in the sales terms and conditions of the products, the company shall +not assume any other responsibilities. Furthermore, Unicore Communications, Inc. +makes no warranty, express or implied, for the sale and/or use of its products, including +the suitability of a particular purpose and marketability of products, or liability for +infringement of any patent, copyright or other intellectual property rights. If the +connection or operation is not in accordance with the manual, the company is not liable. +Unicore Communications, Inc. may make changes to product specifications and product +descriptions at any time without prior notice. +The company's products may contain certain design defects or errors, which will be +included in the corrigendum once found, and may therefore result in differences +between the products’ actual specifications and the published ones. Updated +corrigendum is available upon request. +Before placing an order, please contact our company or local distributors for the latest +specifications. +* Unicore Communications, UNICORECOMM, UFirebird and its logo have been applied +for trademark registration by Unicore Communications, Inc. +Other names and brands are the property of their respective owners. +© Copyright 2009-2022 Unicore Communications, Inc. All rights reserved. + +## Page 4 + +I +Contents +1 +General Protocol ..................................................................................... 1 +1.1 +Messages ......................................................................................................... 1 +1.2 +Checksum ......................................................................................................... 1 +1.3 +Formats ............................................................................................................ 2 +1.4 +Coordinates ...................................................................................................... 3 +1.5 +Message Definition ........................................................................................... 3 +1.5.1 +Common Message ................................................................................................... 3 +1.5.2 +Config Message ....................................................................................................... 7 +1.5.3 +NMEA Message ...................................................................................................... 22 +1.5.4 +Navigation Result Message .................................................................................. 47 +1.5.5 +Misc Message ........................................................................................................ 51 +1.6 +Default Configuration ...................................................................................... 58 +1.6.1 +Serial Port Configuration (CFGPRT) ..................................................................... 58 +1.6.2 +Message Configuration (CFGMSG)....................................................................... 59 +1.6.3 +NMEA Configuration (CFGNMEA) ......................................................................... 60 +1.6.4 +Satellite System Configuration (CFGSYS) ............................................................ 60 +1.6.5 +Interference Detection Configuration (CFGCWOUT) ........................................... 61 +1.6.6 +Dynamic Configuration (CFGDYN) ........................................................................ 61 +1.6.7 +Elevation Configuration (CFGGEOID) .................................................................... 61 +1.6.8 +Static Mode (CFGMOD) ......................................................................................... 61 + +![Image 1 from page 4](../images/gnss-protocol_page_4_img_1.png) + +## Page 5 + +Standard Positioning Products Protocol Specification +1 +1 General Protocol +1.1 +Messages +In the Unicore protocol, input and output statements are collectively called messages. +Each message is a string of full ASCII characters. +The basic format of the message is: +$MSGNAME,data1,data2,data3,…[\*CC]\r\n +All messages contain three data blocks: +The first data block is the message header, which starts with ‘$’ (0x24). +The second data block is the data field consisting of a number of parameters or data. The +message header and data field are separated by ‘,’ (0x2C). +The last data block is an optional checksum, which is separated from the previous data +with ‘\*'(0x2A). +The input message ends with ‘\r' (0x0D) or ‘\n' (0x0A) or any combination of the two. +The output message ends with ‘\r\n'. The total length of each message does not exceed +128 bytes. +Message header and parameters, as well as letters in checksums are not case-sensitive. +Certain parameters of certain input commands can be omitted (marked as optional in the +command description). These parameters can be empty, that is, there is no character +between the two commas. +Then, if there is no special instruction, this parameter will be ignored and the options it +controls will remain unchanged. +Most of the message headers can be used for both input commands and output +messages. The same message header is used as input to set parameters or to query the +current configuration, and as output to output receiver information or configuration. +1.2 +Checksum +The two characters after ‘\*'(0x2A) in the message are the checksum, which is calculated +as the xor of all characters (excluding ‘$' and ‘\*') from ‘$' to ‘\*', in hexadecimal (calculate + +## Page 6 + +2 +the checksum according to the uppercase letters corresponding to the input +information). +The checksum in the input command is optional. If the input statement contains ‘\*' +followed by the two characters, the checksum is examined. If the examination result is +wrong, the command is not executed, and the receiver outputs the $fail message, in +which a checksum error is indicated. If the statement does not contain a checksum, the +command is executed directly. +If the parameters of the input message are empty and a checksum needs to be added, it +should be followed by ‘,'. It's not allowed to add an extra ‘,' when the parameter is not +null. +Example: $PDTINFO,\*62 +The output message always contains a checksum. The description of the checksum in +the Unicore protocol will be omitted in the following message definition. +1.3 +Formats +In the Unicore protocol, the data in the message contains the following types: +String (STR) +The string consists of up to 32 ASCII characters except ‘\ r' and ‘\ n', such as GPSL1. +Unsigned Integer(UINT) +Unsigned integers range from 0 to 4294967295, and are defined in both decimal and +hexadecimal. A decimal unsigned integer consists of ASCII characters from 0 to 9. Such +as 123, 4291075193. A hexadecimal unsigned integer starts with the character h or H, +followed by a string of 0 to 9 and a-f (or A-F), with a maximum of 8 characters +(excluding the starting h or H). Such as hE10, hE41BA7C0. +Unsigned Long Integer (UINT64) +Unsigned long integers range from 0~18446744073709551615, and are defined in both +decimal and hexadecimal. A decimal unsigned long integer consists of ASCII characters +from 0 to 9. Such as 123 and 4291075193. A hexadecimal unsigned long integer starts +with h, or H, or 0x, or 0X, followed by a string of characters from 0 to 9 and a-f (or A-F), +with a maximum of 16 characters (excluding the starting h, H, 0x, or 0X). Such as hE10 +and hE41BA7C0, or 0xFFFFFF and 0XFFFFF. + +![Image 1 from page 6](../images/gnss-protocol_page_6_img_1.png) + +## Page 7 + +Standard Positioning Products Protocol Specification +3 +Signed Integer (INT) +Signed integers are composed of ASCII characters from 0 to 9 and a negative sign, with +a range of-2147483648 to 2147483647. Such as 123217754, -245278. +DOUBLE +Double-precision floating-point data consists of ASCII characters from 0 to 9, with a +negative sign and a decimal point, ranging from -2^1023 to 2^1023. Such as 3.1415926, +-9024.12367225 +1.4 +Coordinates +The position value observed by the product is based on the WGS84 coordinate system. +If the position value of the output message is based on other coordinate system, it will +be noted in the message explanation of this documentation. If the user expects to use a +different reference coordinate, the position is very likely to be off by tens or even +hundreds of meters. +1.5 +Message Definition +1.5.1 Common Message +1.5.1.1 +PDTINFO +Read Product Information +Syntax +$PDTINFO +Example +$PDTINFO +Description +Read product information, the receiver outputs PDTINFO message after +receiving this command +Input/Output +Input +No parameters +Output the Product Information +Syntax +$PDTINFO,pdtName,config,hwVer,fwVer,PN,SN +Example +$PDTINFO,UM220,G1B1,V4.1,R3.0Build13260,080101000001,000101114 +303845 + +## Page 8 + +4 +Description +The receiver outputs the message of the product information +Input/Output +Output +Parameter Definition +Parameter +Format +Description +pdtName +STR +Product name +Config +STR +Product configuration +hwVer +STR +Hardware version +fwVer +STR +Firmware version +PN +STR +Product number +SN +STR +Product serial number +1.5.1.2 +RESET +Syntax +$RESET,type,clrMask +Example +$RESET,0,h01 (Warm start) +Description +Receiver reset +Input/Output +Input +Parameter Definition +Parameter +Format +Description +type +UINT +(optional) +Reset type +0 - Software reset +1 - Chip-level reset (watchdog reset) +2 - Board-level reset +3 - Receiver stopped +clrMask +UINT +(optional) +Reset to clear the receiver's saved information. Setting the +bit to 1 clears the signal upon reset. + +![Image 1 from page 8](../images/gnss-protocol_page_8_img_1.png) + +## Page 9 + +Standard Positioning Products Protocol Specification +5 +bit0 – Clear ephemeris +bit1 – Reserve0 +bit2 – Clear receiver position and time +bit3 – Reserve1 +bit4 – Clear ionospheric correction and UTC parameters +bit5 – Reserve2 +bit6 – Reserve3 +bit7 – Clear almanac +Several commonly used startup methods, the parameters +are listed as follow: +h00 – Hot start +h01 – Warm start +h85 – Cold start +The parameter of the cold start reset command is h85, and the mismatch of the reset +parameters will cause the receiver to start in an incorrect state +When a leap second occurs, the receiver may take up to 25 minutes to sync to UTC time +after a cold start reset. +1.5.1.3 +Command Echo(1) +Syntax +\#User command +Example +\#CFGPRT,1,h0,115200,3,35 +Description +Display the current Unicore command input by users +Input/Output +Output +No parameters +(1): This command is only supported by the firmware of R3.2.10.0, R3.2.20.0, R3.4.0.0 and +above. + +![Image 1 from page 9](../images/gnss-protocol_page_9_img_1.png) + +## Page 10 + +6 +1.5.1.4 +OK +Syntax +$OK +Example +$OK +Description +A response that the receiver executes command correctly +The message is only output on the port where the command is received +Input/Output +Output +No parameters +1.5.1.5 +FAIL +Syntax +$FAIL,errorCode +Example +$FAIL,0 +Description +A response that the input command is incorrect +The message is only output on the port where the command is received +Input/Output +Output +Parameter Definition +Parameter +Format +Description +errorCode +UINT +Error code +0 –Illegal instruction or incorrect parameter +1 –Checksum error + +![Image 1 from page 10](../images/gnss-protocol_page_10_img_1.png) + +## Page 11 + +Standard Positioning Products Protocol Specification +7 +1.5.2 Config Message +1.5.2.1 +CFGPRT +Read Port Configuration +Syntax +$CFGPRT,portID +Example +$CFGPRT,1 +Description +Read the receiver port configuration. The receiver outputs a CFGPRT +message after receiving this command. +Input/Output +Input +Parameter Definition +Parameter +Format +Description +portID +UINT +(optional) +Port number,1~2 +If empty, output the current port configuration +Set/Output the Port Configuration +Syntax +$CFGPRT,portID,addr,baud,inProto,outProto +Example +$CFGPRT,1,h0,115200,1,3 +Description +Set or output the port configuration +Input/Output +Input/output +Parameter Definition +Parameter +Format +Description +portID +UINT +(optional) +Port number: +1 – UART1 +2 – UART2 +If empty, configure the current UART +addr +UINT +H0 +baud +UINT +Optional baud rate for UART: + +## Page 12 + +8 +(optional) +9600/115200/230400/460800(1) +Meaningless if the output port is not UART. +inProto +UINT +(optional) +Input protocol of the port, enabled by setting the +corresponding bit to 1 +bit0 – UNICORE(2) +bit5 - Reserve +bit7 - RTCM3.2 +bit9 - Reserve +bit10 - Reserve +outProto +UINT +(optional) +Output protocol of the port, enabled by setting the +corresponding bit to 1 +bit0 - UNICORE +bit1 - NMEA +bit2 - RTCM3.2 (Set the baud rate to 115200 and above.) +bit5 - Command echo(3) +(1) The baud rate of 460800 is only supported by firmware R3.4.0.19. +(2) COM1 cannot disable the Unicore input protocol. +(3) Only supported by firmware R3.2.10.0, R3.2.20.0, and R3.4.0.0. +The format of A-GNSS assisted positioning data complies with RTCM3.2. +Concurrent output of RTCM 3.2 protocol at two serial ports is not supported. +When continuously sending CFGPRT command, the time interval should be larger than 1s. +1.5.2.2 +CFGMSG +Read Message Output Configuration +Syntax +$CFGMSG,msgClass,msgID +Example +$CFGMSG,0,1 + +![Image 1 from page 12](../images/gnss-protocol_page_12_img_1.png) + +![Image 2 from page 12](../images/gnss-protocol_page_12_img_2.png) + +## Page 13 + +Standard Positioning Products Protocol Specification +9 +Description +Read the message configuration. The receiver outputs CFGMSG +configuration information after receiving this command. +Input/Output +input +Parameter Definition +Parameter +Format +Description +msgClass +UINT +Message class +msgID +UINT +Message ID +Set/Output Message Output Configuration +Syntax +$CFGMSG,msgClass,msgID,rate +Example +$CFGMSG,0,1,1 +Description +Set or output the message output configuration +Input/Output +Input/output +Parameter Definition +Parameter +Format +Description +msgClass +UINT +Message class +msgID +UINT +(optional) +Message ID +switch +UINT +Message control +Message +Class +ID +Message Control +GGA +0 +0 +0: disable +1: enable +GLL +0 +1 +0: disable +1: enable +GSA +0 +2 +0: disable +1: enable + +## Page 14 + +10 +GSV +0 +3 +0: disable +1: enable +RMC +0 +4 +0: disable +1: enable +VTG +0 +5 +0: disable +1: enable +ZDA +0 +6 +0: disable +1: enable +GST +0 +7 +0: disable +1: enable +NAVPOS +1 +0 +0: disable +1: enable +NAVVEL +1 +1 +0: disable +1: enable +NAVTIME +1 +2 +0: disable +1: enable +NAVACC +1 +3 +0: disable +1: enable +LSF +3 +0 +0: disable +1: enable +ANTSTAT +3 +1 +0: disable +1: enable +Reserved +Reserved +Reserved +Reserved +ANTSTAT1 +3 +3 +0: disable +1: enable +NOTICE(1) +6 +0 +0: disable +1: enable +ABNORMAL(2) +6 +4 +0: disable +5: enable + +![Image 1 from page 14](../images/gnss-protocol_page_14_img_1.png) + +## Page 15 + +Standard Positioning Products Protocol Specification +11 +EPHABNORMAL(3) +6 +2 +0: disable +10: enable +(1): Only supported by the firmware R3.2.10.0, R3.2.10.100 and R3.2.20.100. +(2): Only supported by the firmware R3.4.0.19. +(3): Only supported by the firmware R3.2.20.0. +1.5.2.3 +CFGTP +Read Timing Pulse Configuration +Syntax +$CFGTP +Example +$CFGTP +Description +Read the current timing pulse configuration. The receiver outputs a CFGTP +message after receiving this command. +Input/Output +Input +No parameters +Set Timing Pulse Configuration +Syntax +$CFGTP,interval,length,flag,antDelay,rfDelay,usrDelay +Example +$CFGTP,1000000,500000,1,0,800,0 +Description +Set or output timing pulse configuration +Input/Output +Input/output +Parameter Definition +Parameter +Format +Description +interval +UINT +(optional) +Timing pulse frequency, unit: μs; set to 1000000 by default +length +UINT +(optional) +Timing pulse width, unit: μs, and the maximum value is no +more than interval – 1 μs. (High-level width when the rising +edge is aligned with the integral timing pulse frequency , +and low-level width when the falling edge is aligned with + +## Page 16 + +12 +the integral timing pulse frequency ) +flag +UINT +(optional) +Configuration of the timing pulse: +bit0 +0 – Disable the time pulse output +1 – Enable the time pulse output +bit1 +0 – Rising edge aligned to an integral number of seconds +1 – Falling edge aligned to an integral number of seconds +bit2 +0 – Output when the timing is reliable +1 – Always output timing pulses +bit3 +0 –Disable TIMTP +1 – Enable TIMTP +antDelay +INT +(optional) +Antenna delay, unit: ns; (-32768 ~ 32767) +rfDelay +INT +(optional) +RF unit delay, unit: ns; (-32768~32767) +usrDelay +INT +(optional) +User-set delay, unit: ns, range: -32768~32767 +Set the latency to a negative value leads the delay of timing +pulse edge. Modify the delay may decrease the precision of +the pulse in the completely tuning period. + +![Image 1 from page 16](../images/gnss-protocol_page_16_img_1.png) + +## Page 17 + +Standard Positioning Products Protocol Specification +13 +1.5.2.4 +CFGNMEA +Read NMEA Configuration +Syntax +$CFGNMEA +Example +$CFGNMEA +Description +Read the NMEA configuration. The receiver outputs a CFGNMEA message +after receiving this command. +Input/Output +Input +No parameters +Set/Output NMEA Configuration +Syntax +$CFGNMEA,nmeaVer +Example +$CFGNMEA,h30 +Description +Set or output the NMEA configuration +Input/Output +Input/output +Parameter Definition +Parameter +Format +Description +nmeaVer +UINT +Output NMEA protocol version +h30 – Extend Beidou related statements based on NMEA +standard version 3.0 (NMEA 3.0) +h51 –Extend Beidou related statements based on standard +NMEA 4.1 (NMEA 4.1) +1.5.2.5 +CFGSYS +Read Satellite System Configuration +Syntax +$CFGSYS +Example +$CFGSYS +Description +Read the current satellite system configuration. The receiver outputs a +CFGSYS message after receiving this command. + +## Page 18 + +14 +Input/Output +Input +No parameters +Set/Output Satellite System Configuration +Syntax +$CFGSYS,sysMask +Example +$CFGSYS,H11 +Description +Set or output satellite system configuration. +The receiver automatically reset while receiving the command, the +configuration of enabling the satellite system works after the reset. +Input/Output +Input/output +Parameter Definition +Parameter +Format +Description +sysMask +UINT +H01(1) –GPS L1+SBAS+QZSS joint positioning +H10 – BDS B1 +H101(2)– GPS+GLONASS+GALILEO+SBAS+QZSS joint +positioning +H11(3)– GPS+BDS+GALILEO+SBAS+QZSS joint positioning +(1): Firmware below R3.4.0.0 only supports GPS L1++QZSS joint positioning, R3.4.0.0 and +above support GPS L1 + SBAS + QZSS joint positioning +(2): Only supported by the firmware with the version of R3.4.0.0 and above +(3): Firmware below R3.4.0.0 only supports GPS L1+BDS B1+QZSS, R3.4.0 and above +support GPS+BDS+GALILEO+SBAS+QZSS joint positioning. +1.5.2.6 +CFGDYN +Read Dynamic Configuration +Syntax +$CFGDYN +Example +$CFGDYN + +![Image 1 from page 18](../images/gnss-protocol_page_18_img_1.png) + +## Page 19 + +Standard Positioning Products Protocol Specification +15 +Description +Read the current dynamic configuration. The receiver outputs a +CFGDYN message after receiving this command. +Input/Output +Input +No parameters +Set/Output Dynamic Configuration +Syntax +$CFGDYN,mask,dynModel,staticHoldThresh +Example +$CFGDYN,h01,0,1000 +Description +Set/output dynamic configuration +Input/Output +Input/output +Parameter Definition +Parameter +Format +Description +Mask +UINT +(optional) +Domain to be configured, enabled by +setting the corresponding bit to 1 +bit0 – dynModel +bit1 - staticHoldThresh +dynModel +UINT +Dynamic model +0 – Portable +1 – Static +The current default configuration is 0 +staticHoldThresh +UINT +Speed threshold in cm/s in static hold +mode +If this value is 0, static hold mode is off + +## Page 20 + +16 +1.5.2.7 +CFGGEOID +Read Elevation Configuration +Syntax +$CFGGEOID +Example +$CFGGEOID +Description +Read the current elevation configuration. The receiver outputs a CFGGEOID +message after receiving this command. +Input/Output +Input +No parameters +Set/Output Elevation Configuration +Syntax +$CFGGEOID,Model +Example +$CFGGEOID,0 +Description +Set/Output elevation Configuration +Input/Output +Input/output +Parameter Definition +Parameter +Format +Description +Model +UINT +(optional) +0 - Elevation output is ellipsoid +1 - Elevation output is altitude +1.5.2.8 +CFGSAVE +Syntax +$CFGSAVE +Example +$CFGSAVE +Description +Save the current receiver configuration, which is stored in NOR Flash +Input/Output +Input +No parameters + +![Image 1 from page 20](../images/gnss-protocol_page_20_img_1.png) + +## Page 21 + +Standard Positioning Products Protocol Specification +17 +Do NOT cut off the power within one second after inputting $cfgsave. Power off will +damage the configuration of the receiver, and the receiver will be restored to factory +settings. +1.5.2.9 +CFGCLR +Syntax +$CFGCLR +Example +$CFGCLR +Description +Clear the current receiver configuration, the current configuration and +that saved in Flash are restored to factory settings concurrently, which +takes effect after the receiver is reboot or powered on again. +Input/Output +Input +No parameters +The configuration modified by this command takes effect after resetting the receiver. +For R3.4.0.0 version, the configuration will not be cleared after sending this command. +1.5.2.10 CFGCWOUT +Query Interference Detection Command Configuration +Syntax +$CFGCWOUT +Example +$CFGCWOUT +Description +Query the output configuration of the interference detection command +CWOUT. +Input/Output +Input +No parameters +Set Interference Detection Command Configuration +Syntax +$CFGCWOUT,CWOutCtrl +Example +$CFGCWOUT,1 +Description +Control the output of interference detection command + +![Image 1 from page 21](../images/gnss-protocol_page_21_img_1.png) + +## Page 22 + +18 +Input/Output +Input/output +Parameter Definition +Parameter +Format +Description +CWOutCtrl +UINT +1: Enable CWOUT output +0: Disable CWOUT output +1.5.2.11 AIDTIME +Syntax +$AIDTIME,year,month,day,hour,minute,second,millisecond +Example +$AIDTIME,2018,4,9,17,41,36,200 +Description +Input time assistance information, UTC time +Input/Output +Input +Parameter Definition +Parameter +Format +Description +year +UINT +Year, > 1980 +month +UINT +Month, 1~12 +day +UINT +Day, 1~31 +hour +UINT +Hour, 0~23 +minute +UINT +Minute, 0~59 +second +UINT +Second, 0~59 +millisecond +UINT +Millisecond, 0~999 +The input information should be in accordance with the current time. Wrong input will +cause the function to fail. + +![Image 1 from page 22](../images/gnss-protocol_page_22_img_1.png) + +![Image 2 from page 22](../images/gnss-protocol_page_22_img_2.png) + +## Page 23 + +Standard Positioning Products Protocol Specification +19 +1.5.2.12 AIDPOS +Syntax +$AIDPOS,Latitude,N,Longitude,E,altitude +Example +$AIDPOS,4002.229934,N,11618.096855,E,37.254 +Description +Input position assistance information +Input/Output +Input +Parameter Definition +Parameter +Format +Description +Latitude +DOUBLE +Latitude in the format of ddmm.mmmmmm +dd - Degree +mm.mmmmmm - Minute +N +STRING +North or South latitude indication +N - North latitude +S - South latitude +Longitude +DOUBLE +Longitude in the format of dddmm.mmmmmm +ddd - Degree +mm.mmmmmm - Minute +E +STRING +East longitude or west longitude indication +E - East longitude +W - West longitude +altitude +DOUBLE +Ellipsoid height in the unit of meter +1.5.2.13 AIDINFO +Query the Status of Auxiliary Data +Syntax +$AIDINFO +Example +$AIDINFO + +## Page 24 + +20 +Description +Query the status of auxiliary data, the receiver outputs $AIDINFO +message after receiving this command +Input/Output +Input +No parameters +Output the Status and Types of Auxiliary Data +Syntax +$AIDINFO,GPSRS,GPSUS,BDSRS,BDSUS,GALRS,GALUS,GLORS,GLOUS,AType +Example +$AIDINFO,0x0FF7FFFBFF,0x0FF7FFFBFF,,,,,,,0x0311\*27 +Description +Output status and types of auxiliary data +Input/Output +Output +Parameter Definition +Parameter +Format +Description +GPSRS +UINT64 +Receiving state of GPS ephemeris, as long as the received data +is verified, the corresponding bit is set to 1. +If the GPS system is not enabled, this field is empty +GPSUS +UINT64 +GPS ephemeris is valid and can be used for positioning, the +corresponding bit is set to 1, if the GPS system is not enabled, +this field is empty +BDSRS +UINT64 +Receiving state of BDS ephemeris, as long as the received data +is verified, the corresponding bit is set to 1. +If the BDS system is not enabled, this field is empty +BDSUS +UINT64 +BDS ephemeris is valid and can be used for positioning, the +corresponding bit is set to 1, if the BDS system is not enabled, +this field is empty +GALRS +UINT64 +Receiving state of GAL ephemeris, as long as the received data +is verified, the corresponding bit is set to 1. +If the GAL system is not enabled, this field is empty +GALUS +UINT64 +GAL ephemeris is valid and can be used for positioning, the +corresponding bit is set to 1, if the GAL system is not enabled, + +![Image 1 from page 24](../images/gnss-protocol_page_24_img_1.png) + +## Page 25 + +Standard Positioning Products Protocol Specification +21 +this field is empty +GLORS +UINT64 +Receiving state of GLO ephemeris, as long as the received data +is verified, the corresponding bit is set to 1. +If the GLO system is not enabled, this field is empty +GLOUS +UINT64 +GLO ephemeris is valid and can be used for positioning, the +corresponding bit is set to 1, if the GLO system is not enabled, +this field is empty +Atype +UINT +Auxiliary Type: +bit0-3: with GPS/BDS/GAL/GLO ephemeris assistance +bit4: auxiliary position is valid +Bit5: use auxiliary position +Bit6-7: reserve +Bit8: auxiliary time is valid +Bit9: use auxiliary time +Bit10-15: reserve +1.5.2.14 CFGMOD +Set to Static Application Mode +Syntax +$CFGMOD, Model +Example +$CFGMOD,0 +Description +Set or output positioning configuration +Input/Output +Input +Parameter Definition +Parameter +Format +Description +Model +UINT +0 – Disable static application mode +1 – Enable static application mode +Only supported by the firmware with the version of R3.2.10.100 and R3.2.20.100 + +![Image 1 from page 25](../images/gnss-protocol_page_25_img_1.png) + +## Page 26 + +22 +This mode cannot be used in conjunction with dynamic speed threshold mode (CFGDYN) +1.5.3 NMEA Message +The message format described in this section is for the versions shown as below: + +The version of Beidou related messages extended on the basis of NMEA 3.0 +(nmeaVer in CFGNMEA command is h30) + +The version of Beidou related messages extended on the basis of standard NMEA +4.1 ($GBGSA, nmeaVer in CFGNMEA command is h51) +BD3 satellites are involved in NMEA4.1 to support BDS satellites with number of 1~37. +With the increasing of satellites, only output GGA, GSV, GSA and RMC messages by +default to prevent data loss at the rate of 9600. When the amount of data at 9600 baud +rate is allowed, the maximum number of satellites will be output, but it is limited to the +amount of output data at 9600 baud rate. Under the strong sky signal, there will be a +phenomenon of incomplete output of the number of satellites. If the user inputs other +commands, priority is given to ensuring the complete output of the message added by +the user. The number of satellites and satellite information in the GSV message will be +reduced accordingly. +The baud rate of 115200 is supported, which is able to output all satellite information, +and the default output messages include GGA, GSV, GSA and RMC after switching. If +other messages are required, send the command separately. +1.5.3.1 +NmeaVer h51 +GGA +Syntax +$--GGA,time,Lat,N,Lon,E,FS,NoSV,HDOP,msl,M,Altref,M,DiffAge,DiffStation\*cs +Example +$GPGGA,060845.00,4004.74005,N,11614.19613,E,1,10,0.85,53.5,M,,M,,\*7B +Description +GNSS positioning data +Input/Output +Output +Parameter Definition + +![Image 1 from page 26](../images/gnss-protocol_page_26_img_1.png) + +![Image 2 from page 26](../images/gnss-protocol_page_26_img_2.png) + +## Page 27 + +Standard Positioning Products Protocol Specification +23 +Parameter +Format +Description +-- +STR +Positioning system flag +GP - GPS+SBAS(1)+QZSS joint positioning +GB - BDS system standalone positioning +GA - Galileo system standalone positioning +GL - GLONASS system standalone positioning +GN - Multiple system joint positioning +time +STR +UTC time, in the format of hhmmss.ss +hh – Hour +mm – Minutes +ss.ss – Seconds +Lat +STR +Latitude, in the format of ddmm.mmmmm +dd - Degrees +mm.mmmmm - Minutes +N +STR +North or south latitude indicator +N - North latitude +S - South latitude +Lon +STR +Longitude, in the format of dddmm.mmmmm +ddd - Degrees +mm.mmmmm - Minutes +E +STR +East longitude or west longitude indicator +E - East longitude +W - West longitude +FS +UINT +Positioning status indicator +0-Invalid +1-Point positioning + +## Page 28 + +24 +2-Differential positioning +6-Recursive positioning(2) +NoSV +UINT +Number of satellites participating in positioning +HDOP +DOUBLE +Horizontal dilution of precision, 0.00 ~ 99.99, the value is 99.99 +when not positioning +msl +DOUBLE +Ellipsoid height, fixed output one decimal place or altitude +(CFGGEOID is set to 1) +M +STR +Unit of ellipsoid height or altitude, specified to constant M. The field +is empty when not positioning. +Altref +DOUBLE +Sea level separation, only valid when CFGGEOID is set to 1, +otherwise it is fixed to empty. +M +STR +Unit of Sea level separation, specified to constant M. The field is +empty when not positioning. +DiffAge +DOUBLE +Differential correction latency in seconds +Null for non-differential positioning +DiffStation +DOUBLE +Reference station ID +Null for non-differential positioning +cs +STR +Checksum +A hexadecimal number obtained by calculating an XOR of all +characters from '$' to '\*' in this statement +(1): SBAS is only supported by firmware with the version of R3.4.0.0 or above. +(2): Only supported by R3.2.10.0. +GLL +Syntax +$--GLL,Lat,N,Lon,E,time,Valid,Mode\*cs +Example +$GPGLL,4004.74005,N,11614.19613,E,060845.00,A,A\*6F +Description +Geographic longitude/latitude + +![Image 1 from page 28](../images/gnss-protocol_page_28_img_1.png) + +## Page 29 + +Standard Positioning Products Protocol Specification +25 +Input/Output +Output +Parameter Definition +Parameter +Format +Description +-- +STR +Positioning system flag +GP - GPS+SBAS(1)+QZSS joint positioning +GB - BDS system standalone positioning +GA - Galileo system standalone positioning +GL - GLONASS system standalone positioning +GN - Multiple system joint positioning +Lat +STR +Latitude, in the format of ddmm.mmmmm +dd - Degrees +mm.mmmmm - Minutes +N +STR +North or south latitude indicator +N – North latitude +S – South latitude +Lon +STR +Longitude, in the format of dddmm.mmmmm +ddd - Degrees +mm.mmmmm - Minutes +E +STR +East longitude or west longitude indicator +E – East longitude +W – West longitude +time +STR +UTC time, in the format of hhmmss.ss +hh - Hours +mm - Minutes +ss.ss - Seconds +Valid +STR +Position valid indicator + +## Page 30 + +26 +V – Invalid +A – Valid +Mode +STR +Positioning system mode indicator +N – Not positioning +A – Point positioning +D – Differential positioning +cs +STR +Checksum +A hexadecimal number obtained by calculating an XOR of all +characters from '$' to '\*' in this statement +(1): SBAS is only supported by firmware with the version of R3.4.0.0 or above. +GSA +Syntax +$-- +GSA,Smode,FS,sv1,sv2,sv3,sv4,sv5,sv6,sv7,sv8,sv9,sv10,sv11,sv12,PDOP,H +DOP,VDOP,systemID\*cs +Example +$GPGSA,A,3,02,03,06,09,12,17,19,23,28,25,,,1.34,0.85,1.04,1\*1E +Description +GNSS dilution of precision and effective satellite information +Input/Output +Output +Parameter Definition +Parameter +Format +Description +-- +STR +Positioning system flag +GP - GPS+SBAS(1)+QZSS joint positioning +GB - BDS system standalone positioning +GA - Galileo system standalone positioning +GL - GLONASS system standalone positioning +GN - Multiple system joint positioning + +![Image 1 from page 30](../images/gnss-protocol_page_30_img_1.png) + +## Page 31 + +Standard Positioning Products Protocol Specification +27 +Smode +STR +Positioning mode specified states +M– Manually specify 2D or 3D positioning +A– Automatically switch to 2D or 3D positioning +FS +UINT +Positioning mode +1– Not positioning +2– 2D positioning +3– 3D positioning +sv1 ~ sv12 +UINT +Participating satellite ID +When there are less than 12 satellites participating in the +positioning, the insufficient area is filled in empty and it only +outputs the first 12 satellites if there are more than 12 satellites +GPS satellite ID is 01 ~ 32 +BDS satellite ID is 01 ~ 37 +GLO satellite ID is 65 ~ 92(2) +GAL satellite ID is 01 ~ 36(3) +SBAS satellite ID is 33~51(4) +QZSS satellite ID: 193, 194, 195, 199 +PDOP +DOUBLE +Position dilution of precision, 0.00~99.99, the value is 99.99 +when not positioning +HDOP +DOUBLE +Horizontal dilution of precision, 0.00 ~ 99.99, the value is 99.99 +when not positioning +VDOP +DOUBLE +Vertical dilution of precision, 0.00 ~ 99.99, the value is 99.99 +when not positioning +systemID +UINT +GNSS system ID as defined by the NMEA protocol +1 - GPS system ID +2 - GLO system ID(5) +3 - GAL System ID (6) +4 - BDS System ID + +## Page 32 + +28 +cs +STR +Checksum +A hexadecimal number obtained by calculating an XOR of all +characters from '$' to '\*' in this statement +(1): SBAS is only supported by firmware with the version of R3.4.0.0 or above. +(2) (3) (4) (5) (6): Only supported by firmware with the version of R3.4.0.0 or above. +GSV +Syntax +$-- +GSV,NoMsg,MsgNo,NoSv,sv1,elv1,az1,cn01,sv2,elv2,az2,cn02,sv3,elv3,az3, +cn03,sv4,elv4,az4,cn04, signalID\*cs +Example +$GPGSV,3,01,11,02,34,277,41,03,16,043,35,05,04,215,35,06,69,333,48,0\*57 +$GPGSV,3,02,11,09,25,110,41,12,31,305,43,17,55,116,46,19,76,088,46,0\*56 +$GPGSV,3,03,11,23,23,077,40,25,04,328,32,28,05,171,36,0\*67 +$GBGSV,3,01,12,01,37,145,42,02,34,225,39,03,44,188,42,04,25,123,37,0\*4C +$GBGSV,3,02,12,05,17,249,36,06,30,169,38,07,03,188,31,08,69,027,43,0\*4E +$GBGSV,3,03,12,09,09,186,34,10,15,211,36,12,26,306,40,13,60,316,44,0\*48 +Description +Visible GNSS satellites +Each GSV message contains information for only 4 satellites. When the +number of satellites exceeds 4, the receiver sends multiple GSV messages +continuously +Input/Output +Output +Parameter Definition +Parameter +Format +Description +-- +STR +System identification +GP-GPS satellite information +GB-BDS satellite information +GL-GLO satellite Information(1) + +![Image 1 from page 32](../images/gnss-protocol_page_32_img_1.png) + +## Page 33 + +Standard Positioning Products Protocol Specification +29 +GA-GAL satellite Information(2) +NoMsg +UINT +Total number of GSV messages, the minimum value is 1 +NoMsg is the total number of GSV messages in this system, for +example: +NoMsg in GPGSV is the total number of GPGSV messages, +excluding the number of GBGSV messages +MsgNo +UINT +Number of this GSV message. The minimum value is 1. +MsgNo is the number of the GSV message in this system +NoSv +UINT +Total number of visible satellites in this system +sv1 ~ sv4 +UINT +Satellite number of the first to fourth satellite +GPS satellite number is 01 ~ 32 +BDS satellite number is 01 ~ 37 +GLO satellite number is 65 ~ 92 (3) +GAL satellite number is 01 ~ 36 (4) +QZSS satellites are 193, 194, 195, 199 +SBAS(5) satellite number is 33~51 +elv1 ~ elv4 +UINT +Elevation angle of the first to fourth satellite (0 ~ 90 degrees), +fixed output of 2 digits, add zero up front if less than 2 digits +az1 ~ az4 +UINT +Azimuth of the first to fourth satellite (0 ~ 359 degrees), fixed +output of 3 digits, add zero up front if less than 3 digits +cn01~cn04 +UINT +CNR of the first to fourth satellite (0 ~ 90dBHz), fixed output of 2 +digits, add zero up front if less than 2 digits +fill null for untracked satellites +signalID +UINT +Signal ID defined by NMEA protocol (fixedly output 0) +cs +STR +Checksum +A hexadecimal number obtained by calculating an XOR of all +characters from '$' to '\*' in this statement +(1) (2) (3) (4) (5): Only supported by firmware with the version of R3.4.0.0 or above. + +## Page 34 + +30 +Due to the excessive number of satellites in GN mode, at 9600 baud rate, GSV will have +the problem of incomplete printing of satellite information. For complete satellite +information, please switch the baud rate to 115200 +RMC +Syntax +$--RMC,time,status,Lat,N,Lon,E,spd,cog,date,mv,mvE,mode,navStates\*cs +Example +$GPRMC,060845.00,A,4004.74005,N,11614.19613,E,,,180817,,,A,V\*0B +Description +The recommended minimum data +Input/Output +Output +Parameter Definition +Parameter +Format +Description +-- +STR +Positioning system flag +GP - GPS+ SBAS (1)+QZSS joint positioning +GB - BDS system standalone positioning +GA - Galileo system standalone positioning +GL - GLONASS system standalone positioning +GN - Multiple system joint positioning +time +STR +UTC time, in the format of hhmmss.ss +hh - Hours +mm - Minutes +ss.ss - Seconds +status +STR +Position valid indicator +V – Invalid +A – Valid +Lat +STR +Latitude, in the format of ddmm.mmmmm +dd - Degrees + +![Image 1 from page 34](../images/gnss-protocol_page_34_img_1.png) + +![Image 2 from page 34](../images/gnss-protocol_page_34_img_2.png) + +## Page 35 + +Standard Positioning Products Protocol Specification +31 +mm.mmmmm - Minutes +N +STR +North or south latitude indicator +N - North latitude +S – South latitude +Lon +STR +Longitude, in the format of dddmm.mmmmm +ddd - Degrees +mm.mmmmm - Minutes +E +STR +East longitude or west longitude indicator +E – East longitude +W – West longitude +spd +DOUBLE +Speed over ground, unit: knot +cog +DOUBLE +Course over ground, unit: degree +Calculated clockwise from north. If the speed measurement fails +or the static scene speed is extremely small, the output is empty. +date +STR +UTC date, in the format of ddmmyy +dd - Day +mm - Month +yy - Year +mv +DOUBLE +Magnetic declination, specified to null +mvE +STR +Magnetic declination direction, specified to null +mode +STR +Positioning mode +N – Not positioning +A – Point positioning +D – Differential positioning +navStates +STR +Navigation states flag, fixedly output ‘V’ +V-Device does not provide navigation state information + +## Page 36 + +32 +cs +STR +Checksum +A hexadecimal number obtained by calculating an XOR of all +characters from '$' to '\*' in this statement +(1): SBAS is only supported by firmware with the version of R3.4.0.0 or above. +VTG +Syntax +$--VTG,cogt,T,cogm,M,sog,N,kph,K,mode\*cs +Example +$GPVTG,,T,,M,0.000,N,0.000,K,A\*23 +Description +Course over ground and ground speed +Input/Output +Output +Parameter Definition +Parameter +Format +Description +-- +STR +Positioning system flag +GP - GPS+SBAS (1)+QZSS joint positioning +GB - BDS system standalone positioning +GA - Galileo system standalone positioning +GL - GLONASS system standalone positioning +GN - Multiple system joint positioning +cogt +DOUBLE +Course over ground with reference to true north (0.00 ~ 359.99 +degrees). If the speed measurement fails or the static scene +speed is extremely small, the output is empty. +T +STR +Course flag, specified to constant T +cogm +DOUBLE +Course over ground with reference to MN (0.000 ~ 359.999 +degrees). The field is empty by default. +M +STR +Course flag, specified to constant M +sog +DOUBLE +Speed over ground, unit: knot +N +STR +Unit of speed, specified to constant N + +![Image 1 from page 36](../images/gnss-protocol_page_36_img_1.png) + +## Page 37 + +Standard Positioning Products Protocol Specification +33 +kph +DOUBLE +Speed over ground, unit: km/h +K +STR +Unit of speed, specified to constant K +mode +STR +Positioning mode +N – Not positioning +A – Point positioning +D – Differential positioning +cs +STR +Checksum +A hexadecimal number obtained by calculating an XOR of all +characters from '$' to '\*' in this statement +(1): SBAS is only supported by firmware with the version of R3.4.0.0 or above. +ZDA +Syntax +$--ZDA,time,day,mon,year,ltzh,ltzn\*cs +Example +$GPZDA,060845.00,18,08,2017,00,00\*6C +Description +Date and time +Input/Output +Output +Parameter Definition +Parameter +Format +Description +-- +STR +Positioning system flag +GP - GPS+SBAS (1)+QZSS joint positioning +GB - BDS system standalone positioning +GA - Galileo system standalone positioning +GL - GLONASS system standalone positioning +GN - Multiple system joint positioning +time +STR +UTC time, in the format of hhmmss.ss +hh - Hours + +## Page 38 + +34 +mm - Minutes +ss.ss - Seconds +day +UINT +UTC day with two digits, 01 ~ 31 +mon +UINT +UTC month with two digits, 01 ~ 12 +year +UINT +UTC year with four digits +ltzh +UINT +Hours in local time zone (fixed output 00) +ltzn +UINT +Minutes in local time zone (fixed output 00) +cs +STR +Checksum +A hexadecimal number obtained by calculating an XOR of all +characters from '$' to '\*' in this statement +(1): SBAS is only supported by firmware with the version of R3.4.0.0 or above. +GST +Syntax +$--GST,time,rngRMS,stdMajor,stdMinor,hdg,stdLat,stdLon,stdAlt\*cs +Example +$GPGST,060845.00,0.6,,,,0.07,0.09,0.09\*47 +Description +GNSS pseudorange error statistics +Input/Output +Output +Parameter Definition +Parameter +Format +Description +-- +STR +Positioning system flag +GP - GPS+SBAS (1)+QZSS joint positioning +GB - BDS system standalone positioning +GA - Galileo system standalone positioning +GL - GLONASS system standalone positioning +GN - Multiple system joint positioning +time +STR +UTC time, in the format of hhmmss.ss + +![Image 1 from page 38](../images/gnss-protocol_page_38_img_1.png) + +## Page 39 + +Standard Positioning Products Protocol Specification +35 +hh - Hours +mm - Minutes +ss.ss - Seconds +rngRMS +DOUBLE +Standard deviation of pseudorange error in meters, with a +maximum of 3750000 +stdMajor +DOUBLE +Semi-major axis of the error ellipse, in meters. +Specified to null +stdMinor +DOUBLE +Semi-minor axis of the error ellipse, in meters. +Specified to null +hdg +DOUBLE +Semi-major axis direction of the error ellipse in degrees, +clockwise from north. Specified to null +stdLat +DOUBLE +Standard deviation of latitude error, in meters +stdLon +DOUBLE +Standard deviation of longitude error, in meters +stdAlt +DOUBLE +Standard deviation of altitude error, in meters +cs +STR +Checksum +A hexadecimal number obtained by calculating an XOR of all +characters from '$' to '\*' in this statement +(1): SBAS is only supported by firmware with the version of R3.4.0.0 or above. +1.5.3.2 +NmeaVer h30 +GGA +Syntax +$-- +GGA,time,Lat,N,Lon,E,FS,NoSV,HDOP,msl,M,Altref,M,DiffAge,DiffStation\*cs +Example +$GPGGA,063952.000,4002.229934,N,11618.096855,E,1,4,2.788,37.254,M,0 +,M,,\*71 +Description +GNSS positioning data +Input/Output +Output + +## Page 40 + +36 +Parameter Definition +Parameter +Format +Description +-- +STR +Positioning system flag +GP - GPS+SBAS(1)+QZSS joint positioning +BD - BDS system standalone positioning +GA - Galileo system standalone positioning +GL - GLONASS system standalone positioning +GN - Multiple system joint positioning +time +STR +UTC time, in the format of hhmmss.sss +hh - Hours +mm - Minutes +ss.sss - Seconds +Lat +STR +Latitude, in the format of ddmm.mmmmmm +dd - Degrees +mm.mmmmmm - Minutes +N +STR +North or south latitude indicator +N – North latitude +S – South latitude +Lon +STR +Longitude, in the format of dddmm.mmmmmm +ddd - Degrees +mm.mmmmmm - Minutes +E +STR +East longitude or west longitude indicator +E – East longitude +W – West longitude +FS +UINT +Positioning status indicator + +![Image 1 from page 40](../images/gnss-protocol_page_40_img_1.png) + +## Page 41 + +Standard Positioning Products Protocol Specification +37 +0-Invalid +1-Point positioning +2-Differential positioning +6-Recursive positioning(2) +NoSV +UINT +Number of satellites participating in positioning +HDOP +DOUBLE +Horizontal dilution of precision, 0.0~127.000 +Msl +DOUBLE +Ellipsoid height, fixed output one decimal place or altitude +(CFGGEOID is set to 1) +M +STR +Unit of ellipsoid height or altitude, specified to constant M. The +field is empty when not positioning. +Altref +DOUBLE +Sea level separation, only valid when CFGGEOID is set to 1, +otherwise it is fixed to empty. +M +STR +Unit of Sea level separation, specified to constant M. The field +is empty when not positioning. +DiffAge +DOUBLE +Differential correction latency in seconds +Null for non-differential positioning +DiffStation +DOUBLE +Reference station ID +Null for non-differential positioning +cs +STR +Checksum +A hexadecimal number obtained by calculating an XOR of all +characters from '$' to '\*' in this statement +(1): SBAS is only supported by firmware with the version of R3.4.0.0 or above. +(2): Only supported by R3.2.10.0. +GLL +Syntax +$--GLL,Lat,N,Lon,E,time,Valid,Mode\*cs +Example +$GPGLL,4002.217867,N,11618.105743,E,123400.000,A,A\*5B + +## Page 42 + +38 +Description +Geographic longitude/latitude +Input/Output +Output +Parameter Definition +Parameter +Format +Description +-- +STR +Positioning system flag +GP - GPS+SBAS(1)+QZSS joint positioning +BD - BDS system standalone positioning +GA - Galileo system standalone positioning +GL - GLONASS system standalone positioning +GN - Multiple system joint positioning +Lat +STR +Latitude, in the format of ddmm.mmmmmm +dd - Degrees +mm.mmmmmm - Minutes +N +STR +North or south latitude indicator +N – North latitude +S – South latitude +Lon +STR +Longitude, in the format of dddmm.mmmmmm +ddd - Degrees +mm.mmmmmm - Minutes +E +STR +East longitude or west longitude indicator +E – East longitude +W – West longitude +time +STR +UTC time, in the format of hhmmss.sss +hh - Hours +mm - Minutes + +![Image 1 from page 42](../images/gnss-protocol_page_42_img_1.png) + +## Page 43 + +Standard Positioning Products Protocol Specification +39 +ss.sss - Seconds +Valid +STR +Position valid indicator +V – Invalid +A – Valid +Mode +STR +Positioning mode +N – Not positioning +A – Point positioning +D – Differential positioning +cs +STR +Checksum +A hexadecimal number obtained by calculating an XOR of all +characters from '$' to '\*' in this statement +(1): SBAS is only supported by firmware with the version of R3.4.0.0 or above. +GSA +Syntax +$-- +GSA,Smode,FS,sv1,sv2,sv3,sv4,sv5,sv6,sv7,sv8,sv9,sv10,sv11,sv12,PDOP,H +DOP,VDOP\*cs +Example +$GPGSA,A,3,14,22,18,31,,,,,,,,,5.572,2.788,4.824\*36 +Description +GNSS dilution of precision and effective satellite information +Input/Output +Output +Parameter Definition +Parameter +Format +Description +-- +STR +Positioning system flag +GP - GPS+SBAS(1)+QZSS joint positioning +BD - BDS system standalone positioning +GA - Galileo system standalone positioning +GL - GLONASS system standalone positioning + +## Page 44 + +40 +GN - Multiple system joint positioning +Smode +STR +Positioning mode specified states +M – Manually specify 2D or 3D positioning +A – Automatically switch to 2D or 3D positioning +FS +UINT +Positioning mode +1– Not positioning +2– 2D positioning +3– 3D positioning +sv1 ~ sv12 +UINT +Participating satellite ID +When there are less than 12 satellites participating in the +positioning, the insufficient area is filled in empty and it only +output the first 12 satellites if there are more than 12 satellites +GPS satellite ID is 1 ~ 32 +BDS satellite ID is 161 ~ 197(160 +BDS PRN) +GLONASS satellite ID is 65 ~ 92(2) +Galileo satellite ID is 101~136(3) +QZSS satellite ID is 193, 194 , 195, 199 +SBAS satellite ID is 33~51(4) +PDOP +DOUBLE +Position dilution of precision, 0.0~127.000 +HDOP +DOUBLE +Horizontal dilution of precision, 0.0~127.000 +VDOP +DOUBLE +Vertical dilution of precision, 0.0~127.000 +cs +STR +Checksum +A hexadecimal number obtained by calculating an XOR of all +characters from '$' to '\*' in this statement +(1): SBAS is only supported by firmware with the version of R3.4.0.0 or above. +(2) (3) (4): Only supported by firmware with the version of R3.4.0.0 or above. + +![Image 1 from page 44](../images/gnss-protocol_page_44_img_1.png) + +## Page 45 + +Standard Positioning Products Protocol Specification +41 +GSV +Syntax +$-- +GSV,NoMsg,MsgNo,NoSv,sv1,elv1,az1,cn01,sv2,elv2,az2,cn02,sv3,elv3,az3, +cn03,sv4,elv4,az4,cn04\*cs +Example +$GPGSV,3,1,11,3,82,133,50,6,70,73,50,7,21,311,45,13,46,275,50\*75 +$GPGSV,3,2,11,16,52,51,49,19,52,194,49,21,12,49,37,23,40,222,49\*7C +$GPGSV,3,3,11,30,31,69,46,31,8,127,19,1,5,,44\*77 +$BDGSV,2,1,5,161,35,140,47,163,33,224,47,164,24,124,43,167,47,73,48\*54 +$BDGSV,2,2,5,168,5,,50\*52 +Description +Visible GNSS satellites +Each GSV message contains information for only 4 satellites. When the +number of satellites exceeds 4, the receiver sends multiple GSV messages +continuously +Input/Output +Output +Parameter Definition +Parameter +Format +Description +-- +STR +Positioning system flag +GP - GPS+SBAS(1)+QZSS satellite information +BD - BDS satellite information +GA - Galileo satellite information +GL - GLONASS satellite information +NoMsg +UINT +Total number of GSV messages, the minimum value is 1 +NoMsg is the total number of GSV messages in this system, +for example: +NoMsg in GPGSV is the total number of GPGSV messages, +excluding the number of BDGSV messages +MsgNo +UINT +Number of this GSV message. The minimum value is 1. +MsgNo is the number of this GSV message in this system. + +## Page 46 + +42 +Continuous output GPGSV and BDGSV are numbered +separately +NoSv +UINT +Total number of visible satellites in this system +sv1 ~ sv4 +UINT +Satellite number of the first to fourth satellite +GPS satellite number is 1 ~ 32 +BDS satellite number is 161 ~ 197 (160 + BDS PRN) +GLONASS satellite number is 65 ~ 92(2) +Galileo satellite number is 101~136(3) +QZSS satellite number is 193, 194 , 195 , 199 +SBAS(4) satellite number is 33~51 +elv1 ~ elv4 +UINT +Elevation of the first to fourth satellite (0 ~ 90 degrees) +az1 ~ az4 +UINT +Azimuth of the first to fourth satellite (0 ~ 359 degrees) +cn01~cn04 +UINT +CNR of the 1st to 4th satellites (0 ~ 90dBHz), fill null for +untracked satellites +cs +STR +Checksum +A hexadecimal number obtained by calculating an XOR of all +characters from '$' to '\*' in this statement +(1): SBAS is only supported by firmware with the version of R3.4.0.0 or above. +(2) (3) (4): Only supported by firmware with the version of R3.4.0.0 or above. +Due to the excessive number of satellites in GN mode, GSV at 9600 baud rate will have +the problem of incomplete printing of satellite information. For complete satellite +information, please switch the baud rate to 115200 +RMC +Syntax +$--RMC,time,status,Lat,N,Lon,E,spd,cog,date,mv,mvE,mode\*cs +Example +$GPRMC,123400.000,A,4002.217821,N,11618.105743,E,0.026,181.631,180 +411,,E,A\*2C + +![Image 1 from page 46](../images/gnss-protocol_page_46_img_1.png) + +![Image 2 from page 46](../images/gnss-protocol_page_46_img_2.png) + +## Page 47 + +Standard Positioning Products Protocol Specification +43 +Description +The minimum recommended data +Input/Output +Output +Parameter Definition +Parameter +Format +Description +-- +STR +Positioning system flag +GP - GPS+SBAS(1)+QZSS joint positioning +BD - BDS system standalone positioning +GA - Galileo system standalone positioning +GL - GLONASS system standalone positioning +GN - Multiple system joint positioning +time +STR +UTC time, in the format of hhmmss.sss +hh - Hours +mm - Minutes +ss.sss - Seconds +status +STR +Position valid indicator +V – Invalid +A – Valid +Lat +STR +Latitude, in the format of ddmm.mmmmmm +dd - Degrees +mm.mmmmmm - Minutes +N +STR +North or south latitude indicator +N – North latitude +S – South latitude +Lon +STR +Longitude, in the format of dddmm.mmmmmm +ddd - Degrees +mm.mmmmmm - Minutes + +## Page 48 + +44 +E +STR +East longitude or west longitude indicator +E – East longitude +W – West longitude +spd +DOUBLE +Speed over ground, unit: knot +cog +DOUBLE +Course over ground, unit: degree +Calculated clockwise from north. If the speed measurement fails +or the static scene speed is extremely small, the output is empty. +date +STR +UTC date, in the format of ddmmyy +dd - Day +mm - Month +yy - Year +If the exact year, month, and day are not parsed, the date part +appears blank +mv +DOUBLE +Magnetic declination, specified to null +mvE +STR +Magnetic declination direction, specified to constant E +mode +STR +Positioning mode +N – Not positioning +A – Point positioning +D – Differential positioning +cs +STR +Checksum +A hexadecimal number obtained by calculating an XOR of all +characters from '$' to '\*' in this statement +(1): SBAS is only supported by firmware with the version of R3.4.0.0 or above. + +![Image 1 from page 48](../images/gnss-protocol_page_48_img_1.png) + +## Page 49 + +Standard Positioning Products Protocol Specification +45 +VTG +Syntax +$--VTG,cogt,T,cogm,M,sog,N,kph,K,mode\*cs +Example +$GNVTG,0.000,T,,M,0.000,N,0.000,K,A\*13 +Description +Course over groundand ground speed +Input/Output +Output +Parameter Definition +Parameter +Format +Description +-- +STR +Positioning system flag +GP - GPS+SBAS(1)+QZSS joint positioning +BD - BDS system standalone positioning +GA - Galileo system standalone positioning +GL - GLONASS system standalone positioning +GN - Multiple system joint positioning +cogt +DOUBLE +Course over ground with reference to true north (0.000 ~ +359.999 degrees). If the speed measurement fails or the +static scene speed is extremely small, the output is empty. +T +STR +Course flag, specified to constant T +cogm +DOUBLE +Course over ground with reference to MN (0.000 ~ 359.999 +degrees). The field is empty by default. +M +STR +Course flag, specified to constant M +sog +DOUBLE +Speed over ground, unit: knot +N +STR +Unit of speed, specified to constant N +kph +DOUBLE +Speed over ground, unit: km/h +K +STR +Unit of speed, specified to constant K +mode +STR +Positioning mode +N – Not positioning +A – Point positioning + +## Page 50 + +46 +cs +STR +Checksum +A hexadecimal number obtained by calculating an XOR of all +characters from '$' to '\*' in this statement +(1): SBAS is only supported by firmware with the version of R3.4.0.0 or above. +ZDA +Syntax +$--ZDA,time,day,mon,year,ltzh,ltzn\*cs +Example +$GNZDA,083927.000,21,11,2013,00,00\*4C +Description +Date and time +Input/Output +Output +Parameter Definition +Parameter +Format +Description +-- +STR +Positioning system flag +GP - GPS+SBAS(1)+QZSS joint positioning +BD - BDS system standalone positioning +GA - Galileo system standalone positioning +GL - GLONASS system standalone positioning +GN - Multiple system joint positioning +time +STR +UTC time, in the format of hhmmss.sss +hh - Hours +mm - Minutes +ss.sss - Seconds +day +UINT +UTC day with two digits, 01 ~ 31 +mon +UINT +UTC month with two digits, 01 ~ 12 +year +UINT +UTC year with four digits +ltzh +UINT +Hours in local time zone (fixedly output 00) + +![Image 1 from page 50](../images/gnss-protocol_page_50_img_1.png) + +## Page 51 + +Standard Positioning Products Protocol Specification +47 +ltzn +UINT +Minutes in local time zone (fixedly output 00) +cs +STR +Checksum +A hexadecimal number obtained by calculating an XOR of all +characters from '$' to '\*' in this statement +(1): SBAS is only supported by firmware with the version of R3.4.0.0 or above. +1.5.4 Navigation Result Message +1.5.4.1 +NAVPOS +Syntax +$NAVPOS,time,system,quality,X,Y,Z,lat,lon,height\*cs +Example +$NAVPOS,282201000,5,3,- +2160481.168,4383619.182,4084735.203,40.078998,116.236534,52.84384 +7\*1C +Description +Output the receiver position information +Input/Output +Output +Parameter Definition +Parameter +Format +Description +time +UINT +Time corresponding to the positioning solution +The time definition depends on the current positioning +system, the priority is GPS>BDS>GAL>GLO +system +UINT +Current positioning system +bit0-GPS +bit2-BDS +bit5-GAL +bit4-GLO +quality +UINT +Current positioning quality +0 - Invalid +1 - External configuration + +## Page 52 + +48 +2 - Coarse +3 - Precise +X +DOUBLE +X of ECEF, in meters +Y +DOUBLE +Y of ECEF, in meters +Z +DOUBLE +Z of ECEF, in meters +lat +DOUBLE +The latitude of the receiver, which is positive in north latitude +and negative in south latitude, in degrees +lon +DOUBLE +The longitude of the receiver, which is positive in east +longitude and negative in west longitude, in degrees +height +DOUBLE +The ellipsoidal height of the receiver, in meters +cs +STR +Checksum +A hexadecimal number obtained by calculating an XOR of all +characters from '$' to '\*' in this statement +1.5.4.2 +NAVVEL +Syntax +$NAVVEL,time,system,quality,Vx,Vy,Vz,clockDrift\*cs +Example +$NAVVEL,282201000,5,3,0.000,0.000,0.000,31.785\*2F +Description +Output the receiver velocity information +Input/Output +Output +Parameter Definition +Parameter +Format +Description +time +UINT +Same as time definition in NAVPOS +system +UINT +Same as system definition in NAVPOS +quality +UINT +Same as quality definition in NAVPOS +Vx +DOUBLE +Vx of ECEF coordinate system, in m/s +Vy +DOUBLE +Vy of ECEF coordinate system, in m/s + +![Image 1 from page 52](../images/gnss-protocol_page_52_img_1.png) + +## Page 53 + +Standard Positioning Products Protocol Specification +49 +Vz +DOUBLE +Vz of ECEF coordinate system, in m/s +clockDrift +DOUBLE +Equivalent speed of crystal drift, in m/s +cs +STR +Checksum +A hexadecimal number obtained by calculating an XOR of all +characters from '$' to '\*' in this statement +1.5.4.3 +NAVTIME +Syntax +$NAVTIME,GPSW,GPST,GPSQ,GLOY,GLOD,GLOT,GLOQ,BDW,BDT,BDQ,BDG +PSDiff,GLOGPSDiff\*cs +Example +$NAVTIME,1848,282201.000291049,3,0,0,0.000000000,0,492,282187.00 +0291134,3,0.000000085,0.000000000\*63 +Description +Output the receiver time information +Input/Output +Output +Parameter Definition +Parameter +Format +Description +GPSW +UINT +GPS week +GPST +DOUBLE +GPS seconds of week +GPSQ +UINT +GPS time quality +0 - Invalid +1 - External configuration +2 - Coarse +3 - Precise +GLOY +UINT +GLONASS year +GLOD +UINT +GLONASS day +GLOT +DOUBLE +GLONASS seconds of day +GLOQ +UINT +GLONASS time quality, the definition is same as that of +GPSQ + +## Page 54 + +50 +BDW +UINT +BDS week +BDT +DOUBLE +BDS seconds of week +BDQ +UINT +BDS time quality, the definition is same as that of GPSQ +BDGPSDiff +DOUBLE +Time difference between BDS time and GPS time, in +seconds +GLOGPSDiff +DOUBLE +Time difference between GLONASS time and GPS time, in +seconds +cs +STR +Checksum +A hexadecimal number obtained by calculating an XOR of +all characters from '$' to '\*' in this statement +1.5.4.4 +NAVACC +Syntax +$NAVACC,time,status,pAcc,vAcc,cAcc\*cs +Example +$NAVACC,085206.00,A,2480, 70,1250\*7D +Description +Output accuracy information of receiver positioning speed measurement +Input/Output +Output +Parameter Definition +Parameter +Format +Description +time +STR +UTC time, in the format of hhmmss.sss +hh - Hours +mm - Minutes +ss.sss - Seconds +status +UINT +Data validity identification +V - Invalid +A - Valid + +![Image 1 from page 54](../images/gnss-protocol_page_54_img_1.png) + +## Page 55 + +Standard Positioning Products Protocol Specification +51 +pAcc +UINT +Horizontal positioning accuracy, standard deviation of two- +dimensional horizontal positioning error, in 0.001m +vAcc +UINT +Accuracy of horizontal velocity measurement, standard +deviation of two-dimensional horizontal velocity error, unit: +0.001 m/s +cAcc +UINT +Ground course accuracy, in 0.001 degrees +cs +STR +Checksum +A hexadecimal number obtained by calculating an XOR of all +characters from '$' to '\*' in this statement +1.5.5 Misc Message +1.5.5.1 +ANTSTAT +Query Antenna Detection Information +Syntax +$ANTSTAT,antType +Example +$ANTSTAT,1 +Description +Query antenna detection information +Type +antType: +Null: External +0: External +1: Internal +No parameters +Output Antenna Detection Information +Syntax +$ANTSTAT,status1,status2 +Example +$ANTSTAT,0,0 +Description +Output antenna detection information and antenna type +Input/Output +Output + +## Page 56 + +52 +Parameter Definition +Parameter +Format +Description +status1,Status2 +INT +Antenna detection status, as defined below: +$ANTSTAT,0,0 Normal, active antenna +$ANTSTAT,0,1 Short-circuit +$ANTSTAT,1,0 Open-circuit or passive antenna +$ANTSTAT,1,1 Hardware abnormality +When the external antenna detection circuit does not exist, the information of the antenna +detection output (type: external) is invalid. +For the antenna detection circuit, please refer to the hardware reference design. +PIO\_14 (ANT\_OPEN) +PIO\_15 (ANT\_SHORT) +GPIO Status +Input- Level triggered +Input- Level triggered +No active antenna connected +1 +0 +Active antenna connected +0 +0 +Active Antenna shorted out +0 +1 +1.5.5.2 +LSF +Query Leap Seconds Forecast Information +Syntax +$LSF,system +Example +$LSF,0 +Description +Query leap seconds forecast information of the specified satellite system, +the receiver outputs LSF message after receiving the command +Input/Output +Input +Parameter Definition +Parameter +Format +Description + +![Image 1 from page 56](../images/gnss-protocol_page_56_img_1.png) + +![Image 2 from page 56](../images/gnss-protocol_page_56_img_2.png) + +## Page 57 + +Standard Positioning Products Protocol Specification +53 +system +UINT +Query the system corresponding to the leap seconds forecast +information +0: GPS +1: BDS +2: GLO +3: GAL +Output Leap Seconds Forecast Information +Syntax +$LSF,system,flag,utcTLS,utcTLSF,utcTOT,utcWN,utcDN,utcWNLSF, +utcA0,utcA1 +Example +$LSF,0,1,15,16,462836,82,6,86,7811626,14 +Description +Input/output leap seconds forecast information +Input/Output +Input/output +Parameter Definition +Parameter +Format +Description +System +UINT +The system corresponding to the output of leap second +forecast information, which is the same as the query +instruction parameter +Flag +UINT +Valid flag of leap second forecast information +0: Invalid +1: Valid +utcTLS +UINT +Time difference between UTC and system before a leap second +event, in seconds; +GLO system does not have this parameter +utcTLSF +UINT +Time difference between UTC and system after a leap second +event, in seconds; +GLO system does not have this parameter; + +## Page 58 + +54 +utcTOT +UINT +UTC reference seconds of week, in seconds(BDS system +parameter is 0) +GLO system: the parameter corresponds to GLO UTC A0; +utcWN +UINT +Number of UTC reference week, in weeks (BDS system +parameter is 0) +GLO system: the parameter corresponds to GLO UTC A1; +utcDN +UINT +Days of week when leap second event occurs, in days. +GLO system: the parameter corresponds to GLO UTC DN; +utcWNLSF +UINT +Number of UTC week when leap second event occurs, in weeks +GLO system: the parameter corresponds to GLO UTC KP; +utcA0 +INT +Constant coefficient A0 of UTC polynomial (scale factor 2-30) , +in s +GLO system: the parameter corresponds to GLO UTC tc; +utcA1 +INT +First-order coefficient A1 of UTC polynomial (scale factor 2- +50) , in s/s +GLO system: the parameter corresponds to GLO UTC tg; +GPS Week (GPS Week) is the time system adopted in the GPS system. Time Zero is +defined as: 0 a.m. on January 6, 1980. Every 1024 weeks (7168 days) is a cycle. The first +GPS cycle point is 0000:00 and 000:00 on August 22, 1999. That is, from this moment +on, the number of weeks starts again from zero. The rule for counting the number of +weeks is: Sunday is 1, and in turn is 1-7. +The Beidou satellite navigation time system starts at 000:00 and 000:00 UTC ON 1 +January 2006. Use Week and seconds into the week count. The rule for counting the +number of weeks is: Sunday is 0, and in turn is 0-6 +utcWNLSF: A decimal number converted from the lower eight bits of the binary week +when a leap second occurs. For example: A leap second occurs in the 900th week +(binary: 1110000100) and it is broadcast in 132 (Binary: 10000100). +Conversion method of GPS leap second occurrence week: +STEP1: Convert GPSW in Navtime to binary, set the lower eight bits to zero, and then + +![Image 1 from page 58](../images/gnss-protocol_page_58_img_1.png) + +![Image 2 from page 58](../images/gnss-protocol_page_58_img_2.png) + +## Page 59 + +Standard Positioning Products Protocol Specification +55 +convert to decimal. +STEP2: Add the number in STEP1 to utcWNLSF to get the week when a leap second +occurs. +Conversion method of BDS leap second occurrence week: +STEP1: Convert the BDW in Navtime to binary, set the lower eight bits to zero, and then +convert to decimal. +STEP2: Add utcWNLSF to the number in STEP1 to get the week when a leap second +occurs. +UTCDN: Days of the week in which a leap seconds occurs: GPS: 1-7 from Sunday to +Saturday; BDS: 0-6 from Sunday to Saturday +Leap seconds occur at 23:59:59 +1.5.5.3 +CWOUT +Output Interference Detection Information +Syntax +$CWOUT,CWFlagOut,CWRatioOut +Example +$CWOUT,1,0 +Description +Output interference detection information +Input/Output +Output +Parameter Definition +Parameter +Format +Description +CWFlagOut +UINT +Interference +1: No interference +2: Interference detected +3: Strong interference, has affected the receiver positioning +CWRatioOut +UINT +Interference intensity, 0~255, 0 means no interference, 255 +means strong interference + +![Image 1 from page 59](../images/gnss-protocol_page_59_img_1.png) + +## Page 60 + +56 +1.5.5.4 +FCTATEST +Production Test Mode +Syntax +$fctatest,Model +Example +$fctatest,1 +Description +Enable test mode of CW wave +Input/Output +Input +Parameter Definition +Parameter +Format +Description +Model +UINT +0: disable +1: enable +This test mode only supports carrier-to-noise ratio detection of signals modulated with +carrier and pseudo code, and the command can only be used for production line test. In +actual positioning application, abnormal positioning may occur when sending the +command, and power off the receiver or disable the command to recover +1.5.5.5 +ABNORMAL +Query the Output Configuration of the Injected Ephemeris +Syntax +$CFGMSG,msgClass,msgID +Example +$CFGMSG,6,4 +Description +Read the output configuration of $ABNORMAL message +Input/Output +Input +No parameters +Output the Status of the Injected Ephemeris +Syntax +$ABNORMAL,DataLen,AbnLevel +Example +$ABNORMAL,0,3\*13 + +![Image 1 from page 60](../images/gnss-protocol_page_60_img_1.png) + +![Image 2 from page 60](../images/gnss-protocol_page_60_img_2.png) + +## Page 61 + +Standard Positioning Products Protocol Specification +57 +Description +Output the status of the injected ephemeris +Input/Output +Output +Parameter Definition +Parameter +Format +Description +DataLen +INT +Input data length from the serial port after starting up. +AbnLevel +INT +The absence level of the number of predicted ephemerides +that have been injected, of which the value could be 0, 1, 2, 3. +The larger the value is, the more absent satellites there are. +Note: This statement is output every 5s. If the satellite absence level is 0, it will not be +output. Only supported by R3.4.0.19 version. +1.5.5.6 +EPHABNORMAL +Query the Status of the Injected Ephemeris +Syntax +$CFGMSG,msgClass,msgID +Example +$CFGMSG,6,2 +Description +Read the output configuration of $EPHABNORMAL message +Input/Output +Input +No parameters +Output the Status of the Injected Ephemeris +Syntax +$EPHABNORMAL,status +Example +$EPHABNORMAL,1\*50 +Description +Output the status of the injected ephemeris +Input/Output +Output +Parameter Definition +Parameter +Format +Description +status +INT +Value 1 means incomplete ephemeris. + +![Image 1 from page 61](../images/gnss-protocol_page_61_img_1.png) + +## Page 62 + +58 +Note: The value is fixed at 1. The output of the message indicates the incompleteness of +the ephemeris injection, and the default output frequency is once every 10s. +This command is only applicable to version R3.2.20.100, and only when the ephemeris +injection is incomplete will this message be output. +1.6 +Default Configuration +1.6.1 Serial Port Configuration (CFGPRT) +Parameter +Default +Configuration +Description +UART1 +baud +115200/9600 +‒ +115200: Default baud rate for the firmware with the +version of R3.2.0.12, R3.2.0.0, R3.4.0.0, R3.2.10.100, +R3.2.10.0 and R3.2.20.100 +‒ 9600: Default baud rate for the firmware with the +version of R3.1.10.0 +‒ 460800: Default baud rate for the firmware with the +version of R3.4.0.19 +inProto +161/129 +‒ 161: Default configuration for the firmware with the +version of R3.2.0.12, R3.2.0.0, R3.4.0.0, R3.1.10.0 and +R3.4.0.19, input UNICORE +RTCM3.2 + RTCM2.3 +protocol +‒ 129: Default configuration for the firmware with the +version of R3.2.10.0, R3.2.10.100 and R3.2.20.100, +input UNICORE +RTCM3.2 protocol +outProto +35/3 +‒ 35: Default configuration for the firmware with the +version of R3.4.0.0, R3.2.10.0, R3.2.10.100, +R3.2.20.100 and R3.4.0.19, output +UNICORE+NMEA+command echo +‒ 3: Default configuration for the firmware with the +version of R3.1.10.0, R3.2.0.12and R3.2.0.0, output +UNICORE+NMEA protocol + +![Image 1 from page 62](../images/gnss-protocol_page_62_img_1.png) + +![Image 2 from page 62](../images/gnss-protocol_page_62_img_2.png) + +## Page 63 + +Standard Positioning Products Protocol Specification +59 +UART2 +baud +115200/9600 +‒ 115200: Default baud rate for the firmware with the +version of R3.2.0.12, R3.2.0.0, R3.4.0.0, and R3.2.10.0 +‒ 9600: Default baud rate for the firmware with the +version of R3.1.10.0 +inProto +1 +Input UNICORE protocol +outProto +35/3 +‒ 35: Default configuration for the firmware with the +version of R3.4.0.0 and R3.2.10.0, output UNICORE ++NMEA +command echo protocol +‒ 3: Default configuration for the firmware with the +version of R3.1.10.0, R3.2.0.12 and R3.2.0.0, output +UNICORE+NMEA protocol +1.6.2 Message Configuration (CFGMSG) +Message Output Frequency +Parameter +Default +Configuration +Description +NMEA Message +GGA +1 +Output at 1Hz +GLL +0/1 +‒ 0: Firmware with the version of R3.2.0.0, R3.2.10.0, +R3.1.10.0, R3.4.0.0, R3.2.10.100, R3.2.20.100 and +R3.4.0.19 defaults to 0, disabled +‒ 1: Firmware with the version of R3.2.0.12 defaults to +1, Output at 1Hz +GSA +1 +Output at 1Hz +GSV +1 +Output at 1Hz +RMC +1 +Output at 1Hz +VTG +0/1 +‒ 0: Firmware with the version of R3.1.10.0, R3.2.10.0, +R3.2.0.0, R3.4.0.0, R3.2.10.100, R3.2.20.100 and +R3.4.0.19 defaults to 0, disabled +‒ 1: Firmware with the version of R3.2.0.12 defaults to + +## Page 64 + +60 +1, Output at 1Hz +ZDA +0 +Disabled +GST +0 +Disabled +Navigation Result Message +POS +0 +Disabled +VEL +0 +Disabled +TIME +0 +Disabled +ACC +0 +Disabled +Maintenance and Detection Message +NOTICE +0 +Output at 1Hz +EPHABNORMAL +10 +Output once every 10s by default, and only when the +ephemeris injection is incomplete will this message be +output. +1.6.3 NMEA Configuration (CFGNMEA) +Parameter +Default +Configuration +Description +nmeaVer +H51 +Extended BEIDOU messages Based on NMEA standard +version 4.1 +1.6.4 Satellite System Configuration (CFGSYS) +Parameter +Default +Configuration +Description +sysMask +H11 +‒ Firmware with the version of R3.4.0.0 and R3.4.0.19 +defaults to support GPS+BDS+Galileo+SBAS+QZSS +‒ Firmware with the version of ‒ R3.1.10.0, R3.2.0.12, +R3.2.0.0, R3.2.10.0, R3.2.10.100 and R3.2.20.100 +defaults to support GPS+BDS+QZSS + +![Image 1 from page 64](../images/gnss-protocol_page_64_img_1.png) + +## Page 65 + +Standard Positioning Products Protocol Specification +61 +1.6.5 Interference Detection Configuration (CFGCWOUT) +Parameter +Default Configuration +Description +CWOutCtrl +0 +Disable the interference detection +1.6.6 Dynamic Configuration (CFGDYN) +Parameter +Default Configuration +Description +mask +h00 +Domain to be configured, disabled by +setting the corresponding bit to 0 +dynModel +0 +Set the dynamic mode to portable +staticHoldThresh +0 +Disable the static hold mode +1.6.7 Elevation Configuration (CFGGEOID) +Parameter +Default Configuration +Description +Model +0 +Elevation is ellipsoidal height +1.6.8 Static Mode (CFGMOD) +Parameter +Default Configuration +Description +Model +0 +Disable the static mode + +## Page 66 + +62 +和芯星通科技(北京)有限公司 +Unicore Communications, Inc. +北京市海淀区丰贤东路7 号北斗星通大厦三层 +F3, No.7, Fengxian East Road, Haidian, Beijing, P.R.China, +100094 +www.unicorecomm.com +Phone: 86-10-69939800 +Fax: 86-10-69939888 +info@unicorecomm.com + +![Image 1 from page 66](../images/gnss-protocol_page_66_img_1.png) + +![Image 2 from page 66](../images/gnss-protocol_page_66_img_2.png) + + diff --git a/docs/images/2.png b/docs/images/2.png new file mode 100644 index 0000000..7fc39e3 Binary files /dev/null and b/docs/images/2.png differ diff --git a/docs/images/Tracker-121.webp b/docs/images/Tracker-121.webp new file mode 100644 index 0000000..970b5f9 Binary files /dev/null and b/docs/images/Tracker-121.webp differ diff --git a/docs/images/pinout-diagram.png b/docs/images/pinout-diagram.png new file mode 100644 index 0000000..2f3650b Binary files /dev/null and b/docs/images/pinout-diagram.png differ diff --git a/docs/images/structure-chart.png b/docs/images/structure-chart.png new file mode 100644 index 0000000..ec9d5e6 Binary files /dev/null and b/docs/images/structure-chart.png differ diff --git a/docs/images/tracker-1.png b/docs/images/tracker-1.png new file mode 100644 index 0000000..40db4ae Binary files /dev/null and b/docs/images/tracker-1.png differ diff --git a/docs/images/tracker-3.png b/docs/images/tracker-3.png new file mode 100644 index 0000000..406fc61 Binary files /dev/null and b/docs/images/tracker-3.png differ diff --git a/docs/images/wireless-tracker-pin-map.png b/docs/images/wireless-tracker-pin-map.png new file mode 100644 index 0000000..9c8bfce Binary files /dev/null and b/docs/images/wireless-tracker-pin-map.png differ diff --git a/docs/pdfs/gnss-protocol.pdf b/docs/pdfs/gnss-protocol.pdf new file mode 100644 index 0000000..58dba78 Binary files /dev/null and b/docs/pdfs/gnss-protocol.pdf differ diff --git a/docs/pdfs/schematic.pdf b/docs/pdfs/schematic.pdf new file mode 100644 index 0000000..f8b7523 Binary files /dev/null and b/docs/pdfs/schematic.pdf differ diff --git a/docs/pdfs/wireless-tracker-datasheet.pdf b/docs/pdfs/wireless-tracker-datasheet.pdf new file mode 100644 index 0000000..604561e Binary files /dev/null and b/docs/pdfs/wireless-tracker-datasheet.pdf differ diff --git a/docs/schematic/images/schematic_page_1_img_1.png b/docs/schematic/images/schematic_page_1_img_1.png new file mode 100644 index 0000000..568ad70 Binary files /dev/null and b/docs/schematic/images/schematic_page_1_img_1.png differ diff --git a/docs/schematic/markdown/schematic.md b/docs/schematic/markdown/schematic.md new file mode 100644 index 0000000..9c61376 --- /dev/null +++ b/docs/schematic/markdown/schematic.md @@ -0,0 +1,166 @@ +# HTIT-Tracker V0.5 Schematic + +## Document Metadata +- **Format:** PDF 1.4 +- **Title:** New Output +- **Keywords:** Altium +- **Creator:** Altium Designer +- **Producer:** llPDFLib 3.x +- **Creation Date:** 2023-07-31 + +--- + +## Schematic Components + +This is the full schematic for the Heltec Wireless Tracker V0.5, designed in Altium Designer. + +### Power Management + +| Component | Value/Part | Function | +|-----------|-----------|----------| +| F1 | 6V 500mA | Fuse | +| D1 | RSB6.8S | TVS Diode | +| D2 | 1N5819 | Schottky Diode | +| Q1 | AO3401 | P-channel MOSFET | +| U2 | TP4054 | LiPo Charger IC | +| U4 | CE6260B33M | 3.3V LDO | +| U6 | CE6260B33M | 3.3V LDO (Vext) | +| R16 | 2K/5% | Charge current set | + +### ESP32-S3FN8 Main MCU (U7) + +**Crystal:** +| Component | Value | +|-----------|-------| +| U5 | 40MHz Crystal | +| C19, C20 | 22pF/10V | +| X1 | 32.768KHz (RTC) | +| C8, C22 | 4.7pF/10V | + +**Key GPIO Connections:** +- GPIO0: USER_Key +- GPIO1: Vbat_Read (via ADC) +- GPIO2: ADC_Ctrl +- GPIO3: Vext_Ctrl +- GPIO8: LoRa_NSS +- GPIO9: LoRa_SCK +- GPIO10: LoRa_MOSI +- GPIO11: LoRa_MISO +- GPIO12: LoRa_RST +- GPIO13: LoRa_BUSY +- GPIO14: DIO1 +- GPIO18: LED Write Ctrl +- GPIO19/20: USB_D-/USB_D+ +- GPIO21: LED_K (TFT backlight) +- GPIO33: GNSS_TX +- GPIO34: GNSS_RX +- GPIO35: GNSS_RST +- GPIO36: GNSS_PPS +- GPIO38-42: TFT Display (CS, RES, RS, SCLK, SDIN) +- GPIO47: BOOT_MODE +- GPIO48: D_SEL + +### SX1262 LoRa Module (U12) + +| Component | Value | Function | +|-----------|-------|----------| +| L1 | 2.7nH | RF matching | +| L2 | 24nH | RF filter | +| L3 | 2.0nH | RF matching | +| C12, C15, C18, C25 | 0.1uF | Decoupling | +| C13, C14 | 1.8pF | RF matching | +| U11 | UPG2179 | RF Switch | +| X4 | 32MHz | TCXO | +| E4 | IPEX | LoRa Antenna | + +### UC6580 GNSS Module (U9) + +| Component | Value | Function | +|-----------|-------|----------| +| X2 | 26MHz | TCXO | +| X3 | 32.768KHz | RTC Crystal | +| C34, C41 | 4.7pF | Crystal load | +| R27 | 10K/5% | Reset pullup | +| U8 | HDDL1L5RSS-B8 | L1/L5 LNA | +| U10 | SW7125DE | RF Amplifier | +| E3 | IPEX | GNSS Antenna | + +**RF Frontend:** +| Component | Value | +|-----------|-------| +| L4 | 68nH | +| L5 | 1nH | +| L6 | 2.2nH | +| L7 | 18nH | +| L8 | 0R/5% | +| L9 | 6.8nH | +| L10 | 7nH | +| L11 | 4.5nH | +| EL2 | 1uH (inductor) | + +### TFT Display (U1 - 0.96" OLED) + +| Pin | Signal | +|-----|--------| +| SDIN | GPIO42 | +| SCLK | GPIO41 | +| RS | GPIO40 | +| RES | GPIO39 | +| CS | GPIO38 | +| LED_K | GPIO21 (via Q4) | + +### USB Type-C (U3) + +| Pin | Signal | +|-----|--------| +| VBUS | VDD_5V | +| DN1/DN2 | USB_N | +| DP1/DP2 | USB_P | +| CC1 | R3 (5.1K to GND) | +| CC2 | R6 (5.1K to GND) | + +### Battery Management + +| Component | Value | Function | +|-----------|-------|----------| +| JP3 | 1.25X2P-LiPo | Battery connector | +| C1 | 10uF/10V | Input cap | +| C2 | 220nF/10V | Charge cap | +| R13 | 390K/1% | Voltage divider | +| R14 | 100K/1% | Voltage divider | +| Q2 | AO3401 | Power switch | +| Q3 | S9013 | ADC control | + +### LEDs + +| LED | Color | Resistor | Function | +|-----|-------|----------|----------| +| LED1 | Orange | R7 (330R) | Charging indicator | +| LED2 | White | R10 (330R) | User LED | + +### Buttons + +| Button | Function | +|--------|----------| +| S1 | RESET_SW | +| S2 | USER_SW (GPIO0) | + +--- + +## Pin Headers + +### Header P2 (8-pin) +Power and ground pins + +### Header P3 (8-pin) +Additional GPIO + +### Header P4 (16-pin) +Main GPIO header J2 + +### Header P5 (16-pin) +Main GPIO header J3 + +--- + +![Schematic Detail](../images/schematic_page_1_img_1.png) diff --git a/docs/wiki/development-platforms.md b/docs/wiki/development-platforms.md new file mode 100644 index 0000000..c9e1ca1 --- /dev/null +++ b/docs/wiki/development-platforms.md @@ -0,0 +1,101 @@ +# ESP32 Development Platforms Overview + +## Summary + +Three primary development approaches for ESP32 microcontrollers, each suited to different development goals: + +--- + +## ESP-IDF + +**Best for:** Production-ready applications, low-level control + +The official and most comprehensive framework for low-level control and production-ready applications. This platform provides extensive control capabilities for developers building robust, production-level systems. + +### Pros: +- Full access to ESP32 features +- Official Espressif support +- Best performance optimization +- Production-ready tooling + +### Cons: +- Steeper learning curve +- More verbose code +- Longer development time + +--- + +## MicroPython + +**Best for:** Rapid prototyping, interactive development + +Enables rapid prototyping through an interactive scripting runtime. This approach favors quick iteration and experimentation over embedded systems projects. + +### Pros: +- Fast prototyping +- Interactive REPL +- Easy to learn +- Great for education + +### Cons: +- Slower execution +- Higher memory usage +- Limited hardware access + +--- + +## Arduino via PlatformIO + +**Best for:** Library ecosystem, familiar workflow + +Offers a simplified development model with access to a rich ecosystem of libraries and tools. This combines the familiar Arduino framework with PlatformIO's professional development environment. + +### Pros: +- Huge library ecosystem +- Familiar Arduino syntax +- Good documentation +- Active community + +### Cons: +- Abstraction overhead +- May hide hardware details + +--- + +## Heltec Wireless Tracker Recommendations + +For the Wireless Tracker specifically: + +| Use Case | Recommended Platform | +|----------|---------------------| +| Meshtastic | Pre-built firmware | +| LoRaWAN Projects | Arduino/PlatformIO | +| GNSS Development | ESP-IDF or Arduino | +| Quick Prototyping | MicroPython | +| Production Devices | ESP-IDF | + +### Heltec Library Support + +Heltec provides official libraries for: +- **Arduino**: `Heltec ESP32 Dev-Boards` library +- **PlatformIO**: `heltec-automation/Heltec ESP32 Dev-Boards` +- **ESP-IDF**: Examples in Heltec GitHub repository + +--- + +## Quick Start Commands + +### PlatformIO +```ini +[env:heltec_wireless_tracker] +platform = espressif32 +board = heltec_wireless_tracker +framework = arduino +lib_deps = + heltec-automation/Heltec ESP32 Dev-Boards +``` + +### Arduino IDE +1. Add board URL: `https://resource.heltec.cn/download/package_heltec_esp32_index.json` +2. Install "Heltec ESP32 Series Dev-boards" +3. Select "Wireless Tracker" from board menu diff --git a/docs/wiki/faq.md b/docs/wiki/faq.md new file mode 100644 index 0000000..0d6942a --- /dev/null +++ b/docs/wiki/faq.md @@ -0,0 +1,47 @@ +# Wireless Tracker Frequently Asked Questions + +## Q: How do I access boot mode manually if I'm unable to upload code? + +**A:** The Wireless Tracker uses ESP32S3's internal USB, which may fail to enter bootloader in low-power mode or when certain pins are occupied. To manually enter boot mode: + +- **Device not connected:** Press the `USER` button before plugging into a USB port +- **Device already connected:** Hold `USER` button → Press `RESET` → Release `RESET` → Release `USER` button + +Timing requirement: TRST ≥ 10 ms + +--- + +## Q: Why isn't Meshtastic firmware working properly on V1.1 hardware? + +**A:** The V1.1 hardware changed the GNSS chip power supply control pin to GPIO3, causing compatibility issues with official Meshtastic firmware. + +**Solution:** Download the temporary firmware package from Heltec's resources and flash using the CLI command: `device-install.bat -f firmware.factory.bin` + +*Note: This was resolved in Meshtastic 2.2.17 Beta, which auto-detects device version.* + +--- + +## Q: Why is my screen not displaying? + +**A:** Two common causes: + +1. When running LoRa/LoRaWAN sample code: Check the serial port and press RST. Verify device activation via the licensing documentation. + +2. When running Meshtastic: Confirm you've downloaded the correct firmware version for your device. + +--- + +## Q: What are the key GPIO differences between V1.0 and V1.1? + +**A:** The main change in V1.1: +- **GPIO3** now controls GNSS power (set HIGH to enable) +- Added dedicated LDO for UC6580 GNSS module +- Improved power isolation between LoRa and GNSS subsystems + +--- + +## Q: How do I check which hardware version I have? + +**A:** Look for the version marking on the PCB near the USB connector, or check: +- V1.0: GNSS power tied to main rail +- V1.1: GNSS has independent power control via GPIO3 diff --git a/docs/wiki/hardware-update-log.md b/docs/wiki/hardware-update-log.md new file mode 100644 index 0000000..000b3e9 --- /dev/null +++ b/docs/wiki/hardware-update-log.md @@ -0,0 +1,50 @@ +# Wireless Tracker Hardware Update Log + +## V1.0 +**Release Date:** June 30, 2023 + +- First release +- Initial public sale +- [Schematic diagram](https://resource.heltec.cn/download/Wireless_Tracker/Wireless_Tacker1.0/HTIT-Tracker_V0.3.pdf) +- [Datasheet](https://resource.heltec.cn/download/Wireless_Tracker/Wireless%20tracke.pdf) + +--- + +## V1.1 +**Release Date:** Late 2023 + +### Changes: +- **Fixed:** Power loss issue affecting the GNSS module during LoRa operation +- **Enhanced:** Low-power functionality +- **Added:** Additional LDO to supply power to the UC6580 GNSS module independently +- **Changed:** GNSS control pin removed; GPIO 3 set to `HIGH` enables GNSS power + +### Key Differences from V1.0: + +| Feature | V1.0 | V1.1 | +|---------|------|------| +| GNSS Power | Shared rail | Dedicated LDO | +| GNSS Control | N/A | GPIO3 | +| Power Isolation | Limited | Improved | +| Low Power Mode | Basic | Enhanced | + +### Documentation: +- [Schematic diagram](https://resource.heltec.cn/download/Wireless_Tracker/Wireless_Tacker1.1) +- [Datasheet](https://resource.heltec.cn/download/Wireless_Tracker/Wireless%20Tracker%201.1.pdf) + +--- + +## Hardware Version Detection + +To determine your hardware version programmatically: + +```cpp +// V1.1 requires GPIO3 HIGH to enable GNSS +#define GNSS_CTRL_PIN 3 + +void setup() { + // For V1.1 hardware - enable GNSS power + pinMode(GNSS_CTRL_PIN, OUTPUT); + digitalWrite(GNSS_CTRL_PIN, HIGH); +} +``` diff --git a/docs/wiki/product-info.md b/docs/wiki/product-info.md new file mode 100644 index 0000000..0e5047b --- /dev/null +++ b/docs/wiki/product-info.md @@ -0,0 +1,31 @@ +# Wireless Tracker Product Summary + +## Overview +The Wireless Tracker is an IoT development kit combining ESP32-S3FN8 with dual wireless and positioning capabilities. It integrates LoRa, GPS, and multi-system GNSS functionality for tracking applications. + +## Key Components +- **Main Processor:** ESP32-S3FN8 (dual-core Xtensa 32-bit) +- **LoRa Module:** SX1262 +- **GNSS Chip:** UC6580 (supports GPS, GLONASS, BDS, Galileo, NAVIC, QZSS) +- **Display:** 0.96-inch 160×80 TFT LCD +- **Connectivity:** Wi-Fi 802.11 b/g/n, Bluetooth 5 & Mesh, LoRa + +## Core Features +- Low power design of dual-frequency multi-system based on 22nm technology +- USB Type-C interface with voltage regulation and protection circuits +- Integrated lithium battery management with automatic power switching +- 2.4GHz metal spring antenna for Wi-Fi/Bluetooth; IPEX connector for LoRa/GNSS +- Arduino IDE compatible +- Meshtastic and LoRaWAN support + +## Technical Specifications +| Parameter | Value | +|-----------|-------| +| **TX Power** | 21±1 dBm | +| **RX Sensitivity** | -134 dBm | +| **Operating Temp** | -20°C to 70°C | +| **Dimensions** | 65.48 × 28.06 × 13.52 mm | +| **Battery** | 3.7V lithium supply/charging | + +## Applications +Object tracking, vehicle location, pet/livestock monitoring, bicycle sharing, children tracking, field sensing networks. diff --git a/docs/wiki/wireless-tracker-overview.md b/docs/wiki/wireless-tracker-overview.md new file mode 100644 index 0000000..a66c586 --- /dev/null +++ b/docs/wiki/wireless-tracker-overview.md @@ -0,0 +1,37 @@ +# Wireless Tracker Documentation + +## Overview + +The Wireless Tracker is an ESP32-S3FN8-based development kit combining SX1262 and UC6580 chipsets for "fast GNSS solution for IoT" with multi-connectivity options and precision positioning capabilities. + +## Key Features + +- **Chipset**: ESP32-S3FN8 + SX1262 + UC6580 +- **Connectivity**: Wi-Fi, LoRa, Bluetooth 5, GNSS +- **Positioning**: Multi-system support (GPS, GLONASS, BDS, Galileo, NAVIC, QZSS) with L1/L5/L2 bands +- **Display**: 0.96" 160×80 LCD +- **Power**: 3.7V lithium battery with charging capability +- **Dimensions**: 65.48 × 28.06 × 13.52mm +- **Max TX Power**: 21±1dBm + +## Technical Specifications + +| Component | Spec | +|-----------|------| +| Main Processor | ESP32-S3FN8 | +| LoRa Transceiver | SX1262 | +| GNSS Module | UC6580 | +| Bluetooth | Version 5 | +| Antenna | Wi-Fi/BT 2.4GHz onboard; IPEX slots for LoRa/GNSS | + +## Getting Started Resources + +The documentation references guides for: +- Development environment setup +- LoRaWAN integration +- Meshtastic application +- License usage + +## Available Documentation + +Complete technical materials including datasheets, schematics, pin maps, and hardware update logs are available through the Heltec resource portal. diff --git a/site/.dockerignore b/site/.dockerignore new file mode 100644 index 0000000..599f04c --- /dev/null +++ b/site/.dockerignore @@ -0,0 +1,30 @@ +# Dependencies +node_modules/ + +# Build output +dist/ + +# Git +.git/ +.gitignore + +# IDE +.vscode/ +.idea/ + +# Logs +*.log +npm-debug.log* + +# OS +.DS_Store +Thumbs.db + +# Environment files (use docker-compose env) +.env.local +.env.*.local + +# Dev files +*.md +!README.md +Makefile diff --git a/site/.gitignore b/site/.gitignore new file mode 100644 index 0000000..430a04e --- /dev/null +++ b/site/.gitignore @@ -0,0 +1,21 @@ +# build output +dist/ +# generated types +.astro/ + +# dependencies +node_modules/ + +# logs +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + + +# environment overrides (keep .env tracked for defaults) +.env.local +.env.*.local + +# macOS-specific files +.DS_Store diff --git a/site/Dockerfile b/site/Dockerfile new file mode 100644 index 0000000..2437a05 --- /dev/null +++ b/site/Dockerfile @@ -0,0 +1,57 @@ +# Multi-stage build for Heltec Wireless Tracker Documentation +# Stage 1: Build the static site +FROM node:22-slim AS builder + +# Disable telemetry +ENV ASTRO_TELEMETRY_DISABLED=1 +ENV CI=true + +WORKDIR /app + +# Copy package files +COPY package.json package-lock.json ./ + +# Install dependencies +RUN npm ci + +# Copy source files +COPY . . + +# Build the static site +RUN npm run build + +# Stage 2: Production server with nginx +FROM nginx:alpine-slim AS production + +# Copy nginx config +COPY nginx.conf /etc/nginx/conf.d/default.conf + +# Copy built static files +COPY --from=builder /app/dist /usr/share/nginx/html + +# Add healthcheck +HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ + CMD wget -q --spider http://127.0.0.1:80/ || exit 1 + +EXPOSE 80 + +# Stage 3: Development server +FROM node:22-slim AS development + +# Disable telemetry +ENV ASTRO_TELEMETRY_DISABLED=1 + +WORKDIR /app + +# Copy package files +COPY package.json package-lock.json ./ + +# Install dependencies +RUN npm ci + +# Copy source files (will be overridden by volume mount in dev) +COPY . . + +EXPOSE 4321 + +CMD ["npm", "run", "dev", "--", "--host", "0.0.0.0"] diff --git a/site/Makefile b/site/Makefile new file mode 100644 index 0000000..4275a50 --- /dev/null +++ b/site/Makefile @@ -0,0 +1,62 @@ +.PHONY: dev prod build logs stop clean restart shell + +# Default target +.DEFAULT_GOAL := dev + +# Development mode with hot reloading +dev: + @echo "Starting development server..." + docker compose --profile dev up -d heltec-docs-dev + @echo "Site available at https://$(shell grep DOMAIN .env | cut -d= -f2)" + docker compose logs -f heltec-docs-dev + +# Production mode with static build +prod: + @echo "Building and starting production server..." + docker compose --profile prod up -d --build heltec-docs-prod + @echo "Site available at https://$(shell grep DOMAIN .env | cut -d= -f2)" + docker compose logs -f heltec-docs-prod + +# Build the Docker image +build: + docker compose build + +# Build production image specifically +build-prod: + docker compose --profile prod build heltec-docs-prod + +# Show logs +logs: + docker compose logs -f + +# Stop all containers +stop: + docker compose --profile dev --profile prod down + +# Stop and remove volumes +clean: + docker compose --profile dev --profile prod down -v --remove-orphans + docker image prune -f + +# Restart containers +restart: stop dev + +# Shell into development container +shell: + docker compose --profile dev exec heltec-docs-dev /bin/sh + +# Check container status +status: + docker compose ps + +# Local development without Docker (requires Node.js) +local: + npm run dev + +# Build locally without Docker +local-build: + npm run build + +# Preview local build +local-preview: + npm run preview diff --git a/site/README.md b/site/README.md new file mode 100644 index 0000000..1b7f5c3 --- /dev/null +++ b/site/README.md @@ -0,0 +1,49 @@ +# Starlight Starter Kit: Basics + +[![Built with Starlight](https://astro.badg.es/v2/built-with-starlight/tiny.svg)](https://starlight.astro.build) + +``` +npm create astro@latest -- --template starlight +``` + +> 🧑‍🚀 **Seasoned astronaut?** Delete this file. Have fun! + +## 🚀 Project Structure + +Inside of your Astro + Starlight project, you'll see the following folders and files: + +``` +. +├── public/ +├── src/ +│ ├── assets/ +│ ├── content/ +│ │ └── docs/ +│ └── content.config.ts +├── astro.config.mjs +├── package.json +└── tsconfig.json +``` + +Starlight looks for `.md` or `.mdx` files in the `src/content/docs/` directory. Each file is exposed as a route based on its file name. + +Images can be added to `src/assets/` and embedded in Markdown with a relative link. + +Static assets, like favicons, can be placed in the `public/` directory. + +## 🧞 Commands + +All commands are run from the root of the project, from a terminal: + +| Command | Action | +| :------------------------ | :----------------------------------------------- | +| `npm install` | Installs dependencies | +| `npm run dev` | Starts local dev server at `localhost:4321` | +| `npm run build` | Build your production site to `./dist/` | +| `npm run preview` | Preview your build locally, before deploying | +| `npm run astro ...` | Run CLI commands like `astro add`, `astro check` | +| `npm run astro -- --help` | Get help using the Astro CLI | + +## 👀 Want to learn more? + +Check out [Starlight’s docs](https://starlight.astro.build/), read [the Astro documentation](https://docs.astro.build), or jump into the [Astro Discord server](https://astro.build/chat). diff --git a/site/astro.config.mjs b/site/astro.config.mjs new file mode 100644 index 0000000..d9902dc --- /dev/null +++ b/site/astro.config.mjs @@ -0,0 +1,111 @@ +// @ts-check +import { defineConfig } from 'astro/config'; +import starlight from '@astrojs/starlight'; + +// https://astro.build/config +export default defineConfig({ + site: 'https://heltec-tracker-module.l.zmesh.systems', + + // Disable telemetry + telemetry: false, + + // Disable devToolbar + devToolbar: { enabled: false }, + + integrations: [ + starlight({ + title: 'Heltec Wireless Tracker', + description: 'Documentation for the Heltec Wireless Tracker ESP32-S3FN8 development kit with LoRa, GNSS, and WiFi', + + logo: { + src: './src/assets/tracker-icon.svg', + alt: 'Heltec Wireless Tracker', + }, + + social: [ + { icon: 'github', label: 'GitHub', href: 'https://github.com/Heltec-Aaron-Lee/WiFi_Kit_series' }, + { icon: 'external', label: 'Heltec Wiki', href: 'https://wiki.heltec.org' }, + ], + + head: [ + { + tag: 'meta', + attrs: { + name: 'keywords', + content: 'ESP32-S3, LoRa, GNSS, GPS, Meshtastic, LoRaWAN, Heltec, Wireless Tracker', + }, + }, + ], + + sidebar: [ + { + label: 'Getting Started', + items: [ + { label: 'Overview', slug: 'getting-started/overview' }, + { label: 'Hardware Versions', slug: 'getting-started/hardware-versions' }, + { label: 'Development Platforms', slug: 'getting-started/development-platforms' }, + ], + }, + { + label: 'Hardware', + items: [ + { label: 'Specifications', slug: 'hardware/specifications' }, + { label: 'Pinout', slug: 'hardware/pinout' }, + { label: 'Power', slug: 'hardware/power' }, + { label: 'Schematic', slug: 'hardware/schematic' }, + ], + }, + { + label: 'Guides', + items: [ + { label: 'Meshtastic Low Power', slug: 'guides/meshtastic-low-power' }, + { label: 'Heart Rate Monitor', slug: 'guides/heart-rate-monitor' }, + { label: 'LoRaWAN Setup', slug: 'guides/lorawan-setup' }, + ], + }, + { + label: 'Reference', + items: [ + { label: 'GNSS Protocol', slug: 'reference/gnss-protocol' }, + { label: 'LoRa Frequencies', slug: 'reference/lora-frequencies' }, + { label: 'FAQ', slug: 'reference/faq' }, + ], + }, + { + label: 'Resources', + items: [ + { label: 'Downloads', slug: 'resources/downloads' }, + ], + }, + ], + + // Customize search + pagefind: true, + + // Custom CSS + customCss: [ + './src/styles/custom.css', + ], + + // Components customization + components: { + // Override the page title to show hardware version warnings + }, + }), + ], + + vite: { + server: { + host: '0.0.0.0', + // Only configure HMR for reverse proxy when explicitly set + // Without this, Vite auto-detects localhost settings correctly + ...(process.env.VITE_HMR_HOST && { + hmr: { + host: process.env.VITE_HMR_HOST, + protocol: 'wss', + clientPort: 443, + }, + }), + }, + }, +}); diff --git a/site/docker-compose.yml b/site/docker-compose.yml new file mode 100644 index 0000000..edfc4e1 --- /dev/null +++ b/site/docker-compose.yml @@ -0,0 +1,58 @@ +services: + heltec-docs: + build: + context: . + target: ${MODE:-development} + container_name: heltec-tracker-docs + restart: unless-stopped + environment: + - ASTRO_TELEMETRY_DISABLED=1 + - VITE_HMR_HOST=${VITE_HMR_HOST:-} + networks: + - caddy + labels: + # Caddy reverse proxy configuration + caddy: ${DOMAIN:-heltec-tracker-module.l.zmesh.systems} + caddy.reverse_proxy: "{{upstreams ${PORT:-4321}}}" + # HMR WebSocket support for dev mode + caddy.reverse_proxy.flush_interval: "-1" + caddy.reverse_proxy.transport: "http" + caddy.reverse_proxy.transport.read_timeout: "0" + caddy.reverse_proxy.transport.write_timeout: "0" + caddy.reverse_proxy.transport.keepalive: "5m" + caddy.reverse_proxy.transport.keepalive_idle_conns: "10" + caddy.reverse_proxy.stream_timeout: "24h" + caddy.reverse_proxy.stream_close_delay: "5s" + + # Development mode override + heltec-docs-dev: + extends: + service: heltec-docs + profiles: + - dev + build: + target: development + volumes: + - ./src:/app/src:ro + - ./public:/app/public:ro + - ./astro.config.mjs:/app/astro.config.mjs:ro + environment: + - ASTRO_TELEMETRY_DISABLED=1 + - VITE_HMR_HOST=${VITE_HMR_HOST} + labels: + caddy.reverse_proxy: "{{upstreams 4321}}" + + # Production mode override + heltec-docs-prod: + extends: + service: heltec-docs + profiles: + - prod + build: + target: production + labels: + caddy.reverse_proxy: "{{upstreams 80}}" + +networks: + caddy: + external: true diff --git a/site/nginx.conf b/site/nginx.conf new file mode 100644 index 0000000..6ca413b --- /dev/null +++ b/site/nginx.conf @@ -0,0 +1,29 @@ +server { + listen 80; + server_name _; + root /usr/share/nginx/html; + index index.html; + + # Enable gzip compression + gzip on; + gzip_vary on; + gzip_min_length 1024; + gzip_proxied any; + gzip_types text/plain text/css text/xml text/javascript application/javascript application/json application/xml application/rss+xml image/svg+xml; + + # Cache static assets + location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ { + expires 1y; + add_header Cache-Control "public, immutable"; + } + + # Handle SPA routing - serve index.html for all routes + location / { + try_files $uri $uri/ $uri.html /index.html; + } + + # Security headers + add_header X-Frame-Options "SAMEORIGIN" always; + add_header X-Content-Type-Options "nosniff" always; + add_header X-XSS-Protection "1; mode=block" always; +} diff --git a/site/package-lock.json b/site/package-lock.json new file mode 100644 index 0000000..c915021 --- /dev/null +++ b/site/package-lock.json @@ -0,0 +1,6394 @@ +{ + "name": "site", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "site", + "version": "0.0.1", + "dependencies": { + "@astrojs/starlight": "^0.37.6", + "astro": "^5.6.1", + "sharp": "^0.34.2" + } + }, + "node_modules/@astrojs/compiler": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-2.13.1.tgz", + "integrity": "sha512-f3FN83d2G/v32ipNClRKgYv30onQlMZX1vCeZMjPsMMPl1mDpmbl0+N5BYo4S/ofzqJyS5hvwacEo0CCVDn/Qg==", + "license": "MIT" + }, + "node_modules/@astrojs/internal-helpers": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.7.5.tgz", + "integrity": "sha512-vreGnYSSKhAjFJCWAwe/CNhONvoc5lokxtRoZims+0wa3KbHBdPHSSthJsKxPd8d/aic6lWKpRTYGY/hsgK6EA==", + "license": "MIT" + }, + "node_modules/@astrojs/markdown-remark": { + "version": "6.3.10", + "resolved": "https://registry.npmjs.org/@astrojs/markdown-remark/-/markdown-remark-6.3.10.tgz", + "integrity": "sha512-kk4HeYR6AcnzC4QV8iSlOfh+N8TZ3MEStxPyenyCtemqn8IpEATBFMTJcfrNW32dgpt6MY3oCkMM/Tv3/I4G3A==", + "license": "MIT", + "dependencies": { + "@astrojs/internal-helpers": "0.7.5", + "@astrojs/prism": "3.3.0", + "github-slugger": "^2.0.0", + "hast-util-from-html": "^2.0.3", + "hast-util-to-text": "^4.0.2", + "import-meta-resolve": "^4.2.0", + "js-yaml": "^4.1.1", + "mdast-util-definitions": "^6.0.0", + "rehype-raw": "^7.0.0", + "rehype-stringify": "^10.0.1", + "remark-gfm": "^4.0.1", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.1.2", + "remark-smartypants": "^3.0.2", + "shiki": "^3.19.0", + "smol-toml": "^1.5.2", + "unified": "^11.0.5", + "unist-util-remove-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "unist-util-visit-parents": "^6.0.2", + "vfile": "^6.0.3" + } + }, + "node_modules/@astrojs/mdx": { + "version": "4.3.13", + "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-4.3.13.tgz", + "integrity": "sha512-IHDHVKz0JfKBy3//52JSiyWv089b7GVSChIXLrlUOoTLWowG3wr2/8hkaEgEyd/vysvNQvGk+QhysXpJW5ve6Q==", + "license": "MIT", + "dependencies": { + "@astrojs/markdown-remark": "6.3.10", + "@mdx-js/mdx": "^3.1.1", + "acorn": "^8.15.0", + "es-module-lexer": "^1.7.0", + "estree-util-visit": "^2.0.0", + "hast-util-to-html": "^9.0.5", + "piccolore": "^0.1.3", + "rehype-raw": "^7.0.0", + "remark-gfm": "^4.0.1", + "remark-smartypants": "^3.0.2", + "source-map": "^0.7.6", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.3" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0" + }, + "peerDependencies": { + "astro": "^5.0.0" + } + }, + "node_modules/@astrojs/prism": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-3.3.0.tgz", + "integrity": "sha512-q8VwfU/fDZNoDOf+r7jUnMC2//H2l0TuQ6FkGJL8vD8nw/q5KiL3DS1KKBI3QhI9UQhpJ5dc7AtqfbXWuOgLCQ==", + "license": "MIT", + "dependencies": { + "prismjs": "^1.30.0" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0" + } + }, + "node_modules/@astrojs/sitemap": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@astrojs/sitemap/-/sitemap-3.7.0.tgz", + "integrity": "sha512-+qxjUrz6Jcgh+D5VE1gKUJTA3pSthuPHe6Ao5JCxok794Lewx8hBFaWHtOnN0ntb2lfOf7gvOi9TefUswQ/ZVA==", + "license": "MIT", + "dependencies": { + "sitemap": "^8.0.2", + "stream-replace-string": "^2.0.0", + "zod": "^3.25.76" + } + }, + "node_modules/@astrojs/starlight": { + "version": "0.37.6", + "resolved": "https://registry.npmjs.org/@astrojs/starlight/-/starlight-0.37.6.tgz", + "integrity": "sha512-wQrKwH431q+8FsLBnNQeG+R36TMtEGxTQ2AuiVpcx9APcazvL3n7wVW8mMmYyxX0POjTnxlcWPkdMGR3Yj1L+w==", + "license": "MIT", + "dependencies": { + "@astrojs/markdown-remark": "^6.3.1", + "@astrojs/mdx": "^4.2.3", + "@astrojs/sitemap": "^3.3.0", + "@pagefind/default-ui": "^1.3.0", + "@types/hast": "^3.0.4", + "@types/js-yaml": "^4.0.9", + "@types/mdast": "^4.0.4", + "astro-expressive-code": "^0.41.1", + "bcp-47": "^2.1.0", + "hast-util-from-html": "^2.0.1", + "hast-util-select": "^6.0.2", + "hast-util-to-string": "^3.0.0", + "hastscript": "^9.0.0", + "i18next": "^23.11.5", + "js-yaml": "^4.1.0", + "klona": "^2.0.6", + "magic-string": "^0.30.17", + "mdast-util-directive": "^3.0.0", + "mdast-util-to-markdown": "^2.1.0", + "mdast-util-to-string": "^4.0.0", + "pagefind": "^1.3.0", + "rehype": "^13.0.1", + "rehype-format": "^5.0.0", + "remark-directive": "^3.0.0", + "ultrahtml": "^1.6.0", + "unified": "^11.0.5", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.2" + }, + "peerDependencies": { + "astro": "^5.5.0" + } + }, + "node_modules/@astrojs/telemetry": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@astrojs/telemetry/-/telemetry-3.3.0.tgz", + "integrity": "sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ==", + "license": "MIT", + "dependencies": { + "ci-info": "^4.2.0", + "debug": "^4.4.0", + "dlv": "^1.1.3", + "dset": "^3.1.4", + "is-docker": "^3.0.0", + "is-wsl": "^3.1.0", + "which-pm-runs": "^1.1.0" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", + "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@capsizecss/unpack": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@capsizecss/unpack/-/unpack-4.0.0.tgz", + "integrity": "sha512-VERIM64vtTP1C4mxQ5thVT9fK0apjPFobqybMtA1UdUujWka24ERHbRHFGmpbbhp73MhV+KSsHQH9C6uOTdEQA==", + "license": "MIT", + "dependencies": { + "fontkitten": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ctrl/tinycolor": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-4.2.0.tgz", + "integrity": "sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", + "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@expressive-code/core": { + "version": "0.41.6", + "resolved": "https://registry.npmjs.org/@expressive-code/core/-/core-0.41.6.tgz", + "integrity": "sha512-FvJQP+hG0jWi/FLBSmvHInDqWR7jNANp9PUDjdMqSshHb0y7sxx3vHuoOr6SgXjWw+MGLqorZyPQ0aAlHEok6g==", + "license": "MIT", + "dependencies": { + "@ctrl/tinycolor": "^4.0.4", + "hast-util-select": "^6.0.2", + "hast-util-to-html": "^9.0.1", + "hast-util-to-text": "^4.0.1", + "hastscript": "^9.0.0", + "postcss": "^8.4.38", + "postcss-nested": "^6.0.1", + "unist-util-visit": "^5.0.0", + "unist-util-visit-parents": "^6.0.1" + } + }, + "node_modules/@expressive-code/plugin-frames": { + "version": "0.41.6", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-frames/-/plugin-frames-0.41.6.tgz", + "integrity": "sha512-d+hkSYXIQot6fmYnOmWAM+7TNWRv/dhfjMsNq+mIZz8Tb4mPHOcgcfZeEM5dV9TDL0ioQNvtcqQNuzA1sRPjxg==", + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.41.6" + } + }, + "node_modules/@expressive-code/plugin-shiki": { + "version": "0.41.6", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-shiki/-/plugin-shiki-0.41.6.tgz", + "integrity": "sha512-Y6zmKBmsIUtWTzdefqlzm/h9Zz0Rc4gNdt2GTIH7fhHH2I9+lDYCa27BDwuBhjqcos6uK81Aca9dLUC4wzN+ng==", + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.41.6", + "shiki": "^3.2.2" + } + }, + "node_modules/@expressive-code/plugin-text-markers": { + "version": "0.41.6", + "resolved": "https://registry.npmjs.org/@expressive-code/plugin-text-markers/-/plugin-text-markers-0.41.6.tgz", + "integrity": "sha512-PBFa1wGyYzRExMDzBmAWC6/kdfG1oLn4pLpBeTfIRrALPjcGA/59HP3e7q9J0Smk4pC7U+lWkA2LHR8FYV8U7Q==", + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.41.6" + } + }, + "node_modules/@img/colour": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", + "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@mdx-js/mdx": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.1.tgz", + "integrity": "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdx": "^2.0.0", + "acorn": "^8.0.0", + "collapse-white-space": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-util-scope": "^1.0.0", + "estree-walker": "^3.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "markdown-extensions": "^2.0.0", + "recma-build-jsx": "^1.0.0", + "recma-jsx": "^1.0.0", + "recma-stringify": "^1.0.0", + "rehype-recma": "^1.0.0", + "remark-mdx": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "source-map": "^0.7.0", + "unified": "^11.0.0", + "unist-util-position-from-estree": "^2.0.0", + "unist-util-stringify-position": "^4.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@oslojs/encoding": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@oslojs/encoding/-/encoding-1.1.0.tgz", + "integrity": "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==", + "license": "MIT" + }, + "node_modules/@pagefind/darwin-arm64": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@pagefind/darwin-arm64/-/darwin-arm64-1.4.0.tgz", + "integrity": "sha512-2vMqkbv3lbx1Awea90gTaBsvpzgRs7MuSgKDxW0m9oV1GPZCZbZBJg/qL83GIUEN2BFlY46dtUZi54pwH+/pTQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@pagefind/darwin-x64": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@pagefind/darwin-x64/-/darwin-x64-1.4.0.tgz", + "integrity": "sha512-e7JPIS6L9/cJfow+/IAqknsGqEPjJnVXGjpGm25bnq+NPdoD3c/7fAwr1OXkG4Ocjx6ZGSCijXEV4ryMcH2E3A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@pagefind/default-ui": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@pagefind/default-ui/-/default-ui-1.4.0.tgz", + "integrity": "sha512-wie82VWn3cnGEdIjh4YwNESyS1G6vRHwL6cNjy9CFgNnWW/PGRjsLq300xjVH5sfPFK3iK36UxvIBymtQIEiSQ==", + "license": "MIT" + }, + "node_modules/@pagefind/freebsd-x64": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@pagefind/freebsd-x64/-/freebsd-x64-1.4.0.tgz", + "integrity": "sha512-WcJVypXSZ+9HpiqZjFXMUobfFfZZ6NzIYtkhQ9eOhZrQpeY5uQFqNWLCk7w9RkMUwBv1HAMDW3YJQl/8OqsV0Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@pagefind/linux-arm64": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@pagefind/linux-arm64/-/linux-arm64-1.4.0.tgz", + "integrity": "sha512-PIt8dkqt4W06KGmQjONw7EZbhDF+uXI7i0XtRLN1vjCUxM9vGPdtJc2mUyVPevjomrGz5M86M8bqTr6cgDp1Uw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@pagefind/linux-x64": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@pagefind/linux-x64/-/linux-x64-1.4.0.tgz", + "integrity": "sha512-z4oddcWwQ0UHrTHR8psLnVlz6USGJ/eOlDPTDYZ4cI8TK8PgwRUPQZp9D2iJPNIPcS6Qx/E4TebjuGJOyK8Mmg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@pagefind/windows-x64": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@pagefind/windows-x64/-/windows-x64-1.4.0.tgz", + "integrity": "sha512-NkT+YAdgS2FPCn8mIA9bQhiBs+xmniMGq1LFPDhcFn0+2yIUEiIG06t7bsZlhdjknEQRTSdT7YitP6fC5qwP0g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/pluginutils": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.1.tgz", + "integrity": "sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.1.tgz", + "integrity": "sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.1.tgz", + "integrity": "sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.1.tgz", + "integrity": "sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.1.tgz", + "integrity": "sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.1.tgz", + "integrity": "sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.1.tgz", + "integrity": "sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.1.tgz", + "integrity": "sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.1.tgz", + "integrity": "sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.1.tgz", + "integrity": "sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.1.tgz", + "integrity": "sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.1.tgz", + "integrity": "sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.1.tgz", + "integrity": "sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.1.tgz", + "integrity": "sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.1.tgz", + "integrity": "sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.1.tgz", + "integrity": "sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.1.tgz", + "integrity": "sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.1.tgz", + "integrity": "sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.1.tgz", + "integrity": "sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.1.tgz", + "integrity": "sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.1.tgz", + "integrity": "sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.1.tgz", + "integrity": "sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.1.tgz", + "integrity": "sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.1.tgz", + "integrity": "sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.1.tgz", + "integrity": "sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@shikijs/core": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.22.0.tgz", + "integrity": "sha512-iAlTtSDDbJiRpvgL5ugKEATDtHdUVkqgHDm/gbD2ZS9c88mx7G1zSYjjOxp5Qa0eaW0MAQosFRmJSk354PRoQA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.22.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.5" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-3.22.0.tgz", + "integrity": "sha512-jdKhfgW9CRtj3Tor0L7+yPwdG3CgP7W+ZEqSsojrMzCjD1e0IxIbwUMDDpYlVBlC08TACg4puwFGkZfLS+56Tw==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.22.0", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^4.3.4" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-3.22.0.tgz", + "integrity": "sha512-DyXsOG0vGtNtl7ygvabHd7Mt5EY8gCNqR9Y7Lpbbd/PbJvgWrqaKzH1JW6H6qFkuUa8aCxoiYVv8/YfFljiQxA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.22.0", + "@shikijs/vscode-textmate": "^10.0.2" + } + }, + "node_modules/@shikijs/langs": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-3.22.0.tgz", + "integrity": "sha512-x/42TfhWmp6H00T6uwVrdTJGKgNdFbrEdhaDwSR5fd5zhQ1Q46bHq9EO61SCEWJR0HY7z2HNDMaBZp8JRmKiIA==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.22.0" + } + }, + "node_modules/@shikijs/themes": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-3.22.0.tgz", + "integrity": "sha512-o+tlOKqsr6FE4+mYJG08tfCFDS+3CG20HbldXeVoyP+cYSUxDhrFf3GPjE60U55iOkkjbpY2uC3It/eeja35/g==", + "license": "MIT", + "dependencies": { + "@shikijs/types": "3.22.0" + } + }, + "node_modules/@shikijs/types": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.22.0.tgz", + "integrity": "sha512-491iAekgKDBFE67z70Ok5a8KBMsQ2IJwOWw3us/7ffQkIBCyOQfm/aNwVMBUriP02QshIfgHCBSIYAl3u2eWjg==", + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "license": "MIT" + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/js-yaml": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", + "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", + "license": "MIT" + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdx": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", + "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, + "node_modules/@types/nlcst": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/nlcst/-/nlcst-2.0.3.tgz", + "integrity": "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/node": { + "version": "25.2.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.2.1.tgz", + "integrity": "sha512-CPrnr8voK8vC6eEtyRzvMpgp3VyVRhgclonE7qYi6P9sXwYb59ucfrnmFBTaP0yUi8Gk4yZg/LlTJULGxvTNsg==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/sax": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", + "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "license": "ISC" + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "license": "ISC", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-align/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-iterate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-2.0.1.tgz", + "integrity": "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/astring": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", + "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", + "license": "MIT", + "bin": { + "astring": "bin/astring" + } + }, + "node_modules/astro": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/astro/-/astro-5.17.1.tgz", + "integrity": "sha512-oD3tlxTaVWGq/Wfbqk6gxzVRz98xa/rYlpe+gU2jXJMSD01k6sEDL01ZlT8mVSYB/rMgnvIOfiQQ3BbLdN237A==", + "license": "MIT", + "dependencies": { + "@astrojs/compiler": "^2.13.0", + "@astrojs/internal-helpers": "0.7.5", + "@astrojs/markdown-remark": "6.3.10", + "@astrojs/telemetry": "3.3.0", + "@capsizecss/unpack": "^4.0.0", + "@oslojs/encoding": "^1.1.0", + "@rollup/pluginutils": "^5.3.0", + "acorn": "^8.15.0", + "aria-query": "^5.3.2", + "axobject-query": "^4.1.0", + "boxen": "8.0.1", + "ci-info": "^4.3.1", + "clsx": "^2.1.1", + "common-ancestor-path": "^1.0.1", + "cookie": "^1.1.1", + "cssesc": "^3.0.0", + "debug": "^4.4.3", + "deterministic-object-hash": "^2.0.2", + "devalue": "^5.6.2", + "diff": "^8.0.3", + "dlv": "^1.1.3", + "dset": "^3.1.4", + "es-module-lexer": "^1.7.0", + "esbuild": "^0.25.0", + "estree-walker": "^3.0.3", + "flattie": "^1.1.1", + "fontace": "~0.4.0", + "github-slugger": "^2.0.0", + "html-escaper": "3.0.3", + "http-cache-semantics": "^4.2.0", + "import-meta-resolve": "^4.2.0", + "js-yaml": "^4.1.1", + "magic-string": "^0.30.21", + "magicast": "^0.5.1", + "mrmime": "^2.0.1", + "neotraverse": "^0.6.18", + "p-limit": "^6.2.0", + "p-queue": "^8.1.1", + "package-manager-detector": "^1.6.0", + "piccolore": "^0.1.3", + "picomatch": "^4.0.3", + "prompts": "^2.4.2", + "rehype": "^13.0.2", + "semver": "^7.7.3", + "shiki": "^3.21.0", + "smol-toml": "^1.6.0", + "svgo": "^4.0.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tsconfck": "^3.1.6", + "ultrahtml": "^1.6.0", + "unifont": "~0.7.3", + "unist-util-visit": "^5.0.0", + "unstorage": "^1.17.4", + "vfile": "^6.0.3", + "vite": "^6.4.1", + "vitefu": "^1.1.1", + "xxhash-wasm": "^1.1.0", + "yargs-parser": "^21.1.1", + "yocto-spinner": "^0.2.3", + "zod": "^3.25.76", + "zod-to-json-schema": "^3.25.1", + "zod-to-ts": "^1.2.0" + }, + "bin": { + "astro": "astro.js" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/astrodotbuild" + }, + "optionalDependencies": { + "sharp": "^0.34.0" + } + }, + "node_modules/astro-expressive-code": { + "version": "0.41.6", + "resolved": "https://registry.npmjs.org/astro-expressive-code/-/astro-expressive-code-0.41.6.tgz", + "integrity": "sha512-l47tb1uhmVIebHUkw+HEPtU/av0G4O8Q34g2cbkPvC7/e9ZhANcjUUciKt9Hp6gSVDdIuXBBLwJQn2LkeGMOAw==", + "license": "MIT", + "dependencies": { + "rehype-expressive-code": "^0.41.6" + }, + "peerDependencies": { + "astro": "^4.0.0-beta || ^5.0.0-beta || ^3.3.0 || ^6.0.0-beta" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/base-64": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base-64/-/base-64-1.0.0.tgz", + "integrity": "sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==", + "license": "MIT" + }, + "node_modules/bcp-47": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/bcp-47/-/bcp-47-2.1.0.tgz", + "integrity": "sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/bcp-47-match": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/bcp-47-match/-/bcp-47-match-2.0.3.tgz", + "integrity": "sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" + }, + "node_modules/boxen": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-8.0.1.tgz", + "integrity": "sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==", + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^8.0.0", + "chalk": "^5.3.0", + "cli-boxes": "^3.0.0", + "string-width": "^7.2.0", + "type-fest": "^4.21.0", + "widest-line": "^5.0.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-8.0.0.tgz", + "integrity": "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "license": "MIT", + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/ci-info": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/collapse-white-space": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", + "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/common-ancestor-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", + "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", + "license": "ISC" + }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cookie-es": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.2.2.tgz", + "integrity": "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==", + "license": "MIT" + }, + "node_modules/crossws": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.3.5.tgz", + "integrity": "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA==", + "license": "MIT", + "dependencies": { + "uncrypto": "^0.1.3" + } + }, + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-selector-parser": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-3.3.0.tgz", + "integrity": "sha512-Y2asgMGFqJKF4fq4xHDSlFYIkeVfRsm69lQC1q9kbEsH5XtnINTMrweLkjYMeaUgiXBy/uvKeO/a1JHTNnmB2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, + "node_modules/css-tree": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", + "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.12.2", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "license": "CC0-1.0" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/defu": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", + "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", + "license": "MIT" + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/destr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz", + "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/deterministic-object-hash": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/deterministic-object-hash/-/deterministic-object-hash-2.0.2.tgz", + "integrity": "sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==", + "license": "MIT", + "dependencies": { + "base-64": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/devalue": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.6.2.tgz", + "integrity": "sha512-nPRkjWzzDQlsejL1WVifk5rvcFi/y1onBRxjaFMjZeR9mFpqu2gmAZ9xUB9/IEanEP/vBtGeGganC/GO1fmufg==", + "license": "MIT" + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/diff": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.3.tgz", + "integrity": "sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/direction": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/direction/-/direction-2.0.1.tgz", + "integrity": "sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==", + "license": "MIT", + "bin": { + "direction": "cli.js" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "license": "MIT" + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dset": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/dset/-/dset-3.1.4.tgz", + "integrity": "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "license": "MIT" + }, + "node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "license": "MIT" + }, + "node_modules/esast-util-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", + "integrity": "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/esast-util-from-js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz", + "integrity": "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "acorn": "^8.0.0", + "esast-util-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/estree-util-attach-comments": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", + "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-build-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", + "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-walker": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-scope": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.0.tgz", + "integrity": "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-to-js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", + "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "astring": "^1.8.0", + "source-map": "^0.7.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-visit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", + "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "license": "MIT" + }, + "node_modules/expressive-code": { + "version": "0.41.6", + "resolved": "https://registry.npmjs.org/expressive-code/-/expressive-code-0.41.6.tgz", + "integrity": "sha512-W/5+IQbrpCIM5KGLjO35wlp1NCwDOOVQb+PAvzEoGkW1xjGM807ZGfBKptNWH6UECvt6qgmLyWolCMYKh7eQmA==", + "license": "MIT", + "dependencies": { + "@expressive-code/core": "^0.41.6", + "@expressive-code/plugin-frames": "^0.41.6", + "@expressive-code/plugin-shiki": "^0.41.6", + "@expressive-code/plugin-text-markers": "^0.41.6" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/flattie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flattie/-/flattie-1.1.1.tgz", + "integrity": "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/fontace": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/fontace/-/fontace-0.4.1.tgz", + "integrity": "sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw==", + "license": "MIT", + "dependencies": { + "fontkitten": "^1.0.2" + } + }, + "node_modules/fontkitten": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/fontkitten/-/fontkitten-1.0.2.tgz", + "integrity": "sha512-piJxbLnkD9Xcyi7dWJRnqszEURixe7CrF/efBfbffe2DPyabmuIuqraruY8cXTs19QoM8VJzx47BDRVNXETM7Q==", + "license": "MIT", + "dependencies": { + "tiny-inflate": "^1.0.3" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", + "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/github-slugger": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz", + "integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==", + "license": "ISC" + }, + "node_modules/h3": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.5.tgz", + "integrity": "sha512-xEyq3rSl+dhGX2Lm0+eFQIAzlDN6Fs0EcC4f7BNUmzaRX/PTzeuM+Tr2lHB8FoXggsQIeXLj8EDVgs5ywxyxmg==", + "license": "MIT", + "dependencies": { + "cookie-es": "^1.2.2", + "crossws": "^0.3.5", + "defu": "^6.1.4", + "destr": "^2.0.5", + "iron-webcrypto": "^1.2.1", + "node-mock-http": "^1.0.4", + "radix3": "^1.1.2", + "ufo": "^1.6.3", + "uncrypto": "^0.1.3" + } + }, + "node_modules/hast-util-embedded": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-embedded/-/hast-util-embedded-3.0.0.tgz", + "integrity": "sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-is-element": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-format": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hast-util-format/-/hast-util-format-1.1.0.tgz", + "integrity": "sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-minify-whitespace": "^1.0.0", + "hast-util-phrasing": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "html-whitespace-sensitive-tag-names": "^3.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-html": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz", + "integrity": "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "devlop": "^1.1.0", + "hast-util-from-parse5": "^8.0.0", + "parse5": "^7.0.0", + "vfile": "^6.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.3.tgz", + "integrity": "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^9.0.0", + "property-information": "^7.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-has-property": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-3.0.0.tgz", + "integrity": "sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-body-ok-link": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-is-body-ok-link/-/hast-util-is-body-ok-link-3.0.1.tgz", + "integrity": "sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-is-element": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz", + "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-minify-whitespace": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hast-util-minify-whitespace/-/hast-util-minify-whitespace-1.0.1.tgz", + "integrity": "sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-is-element": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-phrasing": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-phrasing/-/hast-util-phrasing-3.0.1.tgz", + "integrity": "sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-embedded": "^3.0.0", + "hast-util-has-property": "^3.0.0", + "hast-util-is-body-ok-link": "^3.0.0", + "hast-util-is-element": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", + "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-select": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/hast-util-select/-/hast-util-select-6.0.4.tgz", + "integrity": "sha512-RqGS1ZgI0MwxLaKLDxjprynNzINEkRHY2i8ln4DDjgv9ZhcYVIHN9rlpiYsqtFwrgpYU361SyWDQcGNIBVu3lw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "bcp-47-match": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "css-selector-parser": "^3.0.0", + "devlop": "^1.0.0", + "direction": "^2.0.0", + "hast-util-has-property": "^3.0.0", + "hast-util-to-string": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "nth-check": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-estree": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz", + "integrity": "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-attach-comments": "^3.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-html": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.1.tgz", + "integrity": "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-string": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-3.0.1.tgz", + "integrity": "sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-text": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-4.0.2.tgz", + "integrity": "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "hast-util-is-element": "^3.0.0", + "unist-util-find-after": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz", + "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/html-escaper": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz", + "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==", + "license": "MIT" + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/html-whitespace-sensitive-tag-names": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-whitespace-sensitive-tag-names/-/html-whitespace-sensitive-tag-names-3.0.1.tgz", + "integrity": "sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "license": "BSD-2-Clause" + }, + "node_modules/i18next": { + "version": "23.16.8", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.16.8.tgz", + "integrity": "sha512-06r/TitrM88Mg5FdUXAKL96dJMzgqLE5dv3ryBAra4KCwD9mJ4ndOTS95ZuymIGoE+2hzfdaMak2X11/es7ZWg==", + "funding": [ + { + "type": "individual", + "url": "https://locize.com" + }, + { + "type": "individual", + "url": "https://locize.com/i18next.html" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + } + ], + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.2" + } + }, + "node_modules/import-meta-resolve": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", + "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/inline-style-parser": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", + "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", + "license": "MIT" + }, + "node_modules/iron-webcrypto": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz", + "integrity": "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/brc-dd" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/lru-cache": { + "version": "11.2.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.5.tgz", + "integrity": "sha512-vFrFJkWtJvJnD5hg+hJvVE8Lh/TcMzKnTgCWmtBipwI5yLX/iX+5UB2tfuyODF5E7k9xEzMdYgGqaSb1c0c5Yw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/magicast": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.2.tgz", + "integrity": "sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "source-map-js": "^1.2.1" + } + }, + "node_modules/markdown-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", + "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-definitions": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-6.0.0.tgz", + "integrity": "sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-directive": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.1.0.tgz", + "integrity": "sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", + "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", + "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", + "license": "CC0-1.0" + }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-directive": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.2.tgz", + "integrity": "sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "parse-entities": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-expression": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz", + "integrity": "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz", + "integrity": "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-md": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", + "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", + "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", + "license": "MIT", + "dependencies": { + "acorn": "^8.0.0", + "acorn-jsx": "^5.0.0", + "micromark-extension-mdx-expression": "^3.0.0", + "micromark-extension-mdx-jsx": "^3.0.0", + "micromark-extension-mdx-md": "^2.0.0", + "micromark-extension-mdxjs-esm": "^3.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", + "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz", + "integrity": "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-events-to-acorn": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz", + "integrity": "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/neotraverse": { + "version": "0.6.18", + "resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-0.6.18.tgz", + "integrity": "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/nlcst-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-4.0.0.tgz", + "integrity": "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/node-fetch-native": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.7.tgz", + "integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==", + "license": "MIT" + }, + "node_modules/node-mock-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.4.tgz", + "integrity": "sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==", + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/ofetch": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.5.1.tgz", + "integrity": "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==", + "license": "MIT", + "dependencies": { + "destr": "^2.0.5", + "node-fetch-native": "^1.6.7", + "ufo": "^1.6.1" + } + }, + "node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", + "license": "MIT" + }, + "node_modules/oniguruma-parser": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.1.tgz", + "integrity": "sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==", + "license": "MIT" + }, + "node_modules/oniguruma-to-es": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.4.tgz", + "integrity": "sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA==", + "license": "MIT", + "dependencies": { + "oniguruma-parser": "^0.12.1", + "regex": "^6.0.1", + "regex-recursion": "^6.0.2" + } + }, + "node_modules/p-limit": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-6.2.0.tgz", + "integrity": "sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-8.1.1.tgz", + "integrity": "sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^5.0.1", + "p-timeout": "^6.1.2" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-6.1.4.tgz", + "integrity": "sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-manager-detector": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz", + "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==", + "license": "MIT" + }, + "node_modules/pagefind": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/pagefind/-/pagefind-1.4.0.tgz", + "integrity": "sha512-z2kY1mQlL4J8q5EIsQkLzQjilovKzfNVhX8De6oyE6uHpfFtyBaqUpcl/XzJC/4fjD8vBDyh1zolimIcVrCn9g==", + "license": "MIT", + "bin": { + "pagefind": "lib/runner/bin.cjs" + }, + "optionalDependencies": { + "@pagefind/darwin-arm64": "1.4.0", + "@pagefind/darwin-x64": "1.4.0", + "@pagefind/freebsd-x64": "1.4.0", + "@pagefind/linux-arm64": "1.4.0", + "@pagefind/linux-x64": "1.4.0", + "@pagefind/windows-x64": "1.4.0" + } + }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/parse-latin": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-7.0.0.tgz", + "integrity": "sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "@types/unist": "^3.0.0", + "nlcst-to-string": "^4.0.0", + "unist-util-modify-children": "^4.0.0", + "unist-util-visit-children": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/piccolore": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/piccolore/-/piccolore-0.1.3.tgz", + "integrity": "sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==", + "license": "ISC" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/prismjs": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", + "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/radix3": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz", + "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==", + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/recma-build-jsx": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz", + "integrity": "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-build-jsx": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-jsx": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.1.tgz", + "integrity": "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==", + "license": "MIT", + "dependencies": { + "acorn-jsx": "^5.0.0", + "estree-util-to-js": "^2.0.0", + "recma-parse": "^1.0.0", + "recma-stringify": "^1.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/recma-parse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-parse/-/recma-parse-1.0.0.tgz", + "integrity": "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "esast-util-from-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-stringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-stringify/-/recma-stringify-1.0.0.tgz", + "integrity": "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-to-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/regex/-/regex-6.1.0.tgz", + "integrity": "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==", + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-recursion": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", + "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", + "license": "MIT" + }, + "node_modules/rehype": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/rehype/-/rehype-13.0.2.tgz", + "integrity": "sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "rehype-parse": "^9.0.0", + "rehype-stringify": "^10.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-expressive-code": { + "version": "0.41.6", + "resolved": "https://registry.npmjs.org/rehype-expressive-code/-/rehype-expressive-code-0.41.6.tgz", + "integrity": "sha512-aBMX8kxPtjmDSFUdZlAWJkMvsQ4ZMASfee90JWIAV8tweltXLzkWC3q++43ToTelI8ac5iC0B3/S/Cl4Ql1y2g==", + "license": "MIT", + "dependencies": { + "expressive-code": "^0.41.6" + } + }, + "node_modules/rehype-format": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/rehype-format/-/rehype-format-5.0.1.tgz", + "integrity": "sha512-zvmVru9uB0josBVpr946OR8ui7nJEdzZobwLOOqHb/OOD88W0Vk2SqLwoVOj0fM6IPCCO6TaV9CvQvJMWwukFQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-format": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-parse": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-9.0.1.tgz", + "integrity": "sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-from-html": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-raw": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-recma": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rehype-recma/-/rehype-recma-1.0.0.tgz", + "integrity": "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "hast-util-to-estree": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-stringify": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-10.0.1.tgz", + "integrity": "sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-to-html": "^9.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-directive": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-3.0.1.tgz", + "integrity": "sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-directive": "^3.0.0", + "micromark-extension-directive": "^3.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.1.tgz", + "integrity": "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==", + "license": "MIT", + "dependencies": { + "mdast-util-mdx": "^3.0.0", + "micromark-extension-mdxjs": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-smartypants": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/remark-smartypants/-/remark-smartypants-3.0.2.tgz", + "integrity": "sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==", + "license": "MIT", + "dependencies": { + "retext": "^9.0.0", + "retext-smartypants": "^6.0.0", + "unified": "^11.0.4", + "unist-util-visit": "^5.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/retext/-/retext-9.0.0.tgz", + "integrity": "sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "retext-latin": "^4.0.0", + "retext-stringify": "^4.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-latin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/retext-latin/-/retext-latin-4.0.0.tgz", + "integrity": "sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "parse-latin": "^7.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-smartypants": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/retext-smartypants/-/retext-smartypants-6.2.0.tgz", + "integrity": "sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "nlcst-to-string": "^4.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/retext-stringify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/retext-stringify/-/retext-stringify-4.0.0.tgz", + "integrity": "sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==", + "license": "MIT", + "dependencies": { + "@types/nlcst": "^2.0.0", + "nlcst-to-string": "^4.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rollup": { + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.57.1.tgz", + "integrity": "sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==", + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.57.1", + "@rollup/rollup-android-arm64": "4.57.1", + "@rollup/rollup-darwin-arm64": "4.57.1", + "@rollup/rollup-darwin-x64": "4.57.1", + "@rollup/rollup-freebsd-arm64": "4.57.1", + "@rollup/rollup-freebsd-x64": "4.57.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.57.1", + "@rollup/rollup-linux-arm-musleabihf": "4.57.1", + "@rollup/rollup-linux-arm64-gnu": "4.57.1", + "@rollup/rollup-linux-arm64-musl": "4.57.1", + "@rollup/rollup-linux-loong64-gnu": "4.57.1", + "@rollup/rollup-linux-loong64-musl": "4.57.1", + "@rollup/rollup-linux-ppc64-gnu": "4.57.1", + "@rollup/rollup-linux-ppc64-musl": "4.57.1", + "@rollup/rollup-linux-riscv64-gnu": "4.57.1", + "@rollup/rollup-linux-riscv64-musl": "4.57.1", + "@rollup/rollup-linux-s390x-gnu": "4.57.1", + "@rollup/rollup-linux-x64-gnu": "4.57.1", + "@rollup/rollup-linux-x64-musl": "4.57.1", + "@rollup/rollup-openbsd-x64": "4.57.1", + "@rollup/rollup-openharmony-arm64": "4.57.1", + "@rollup/rollup-win32-arm64-msvc": "4.57.1", + "@rollup/rollup-win32-ia32-msvc": "4.57.1", + "@rollup/rollup-win32-x64-gnu": "4.57.1", + "@rollup/rollup-win32-x64-msvc": "4.57.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/sax": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.4.tgz", + "integrity": "sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" + } + }, + "node_modules/shiki": { + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-3.22.0.tgz", + "integrity": "sha512-LBnhsoYEe0Eou4e1VgJACes+O6S6QC0w71fCSp5Oya79inkwkm15gQ1UF6VtQ8j/taMDh79hAB49WUk8ALQW3g==", + "license": "MIT", + "dependencies": { + "@shikijs/core": "3.22.0", + "@shikijs/engine-javascript": "3.22.0", + "@shikijs/engine-oniguruma": "3.22.0", + "@shikijs/langs": "3.22.0", + "@shikijs/themes": "3.22.0", + "@shikijs/types": "3.22.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, + "node_modules/sitemap": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-8.0.2.tgz", + "integrity": "sha512-LwktpJcyZDoa0IL6KT++lQ53pbSrx2c9ge41/SeLTyqy2XUNA6uR4+P9u5IVo5lPeL2arAcOKn1aZAxoYbCKlQ==", + "license": "MIT", + "dependencies": { + "@types/node": "^17.0.5", + "@types/sax": "^1.2.1", + "arg": "^5.0.0", + "sax": "^1.4.1" + }, + "bin": { + "sitemap": "dist/cli.js" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=6.0.0" + } + }, + "node_modules/sitemap/node_modules/@types/node": { + "version": "17.0.45", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", + "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==", + "license": "MIT" + }, + "node_modules/smol-toml": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.6.0.tgz", + "integrity": "sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 18" + }, + "funding": { + "url": "https://github.com/sponsors/cyyynthia" + } + }, + "node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stream-replace-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/stream-replace-string/-/stream-replace-string-2.0.0.tgz", + "integrity": "sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==", + "license": "MIT" + }, + "node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/style-to-js": { + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz", + "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==", + "license": "MIT", + "dependencies": { + "style-to-object": "1.0.14" + } + }, + "node_modules/style-to-object": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz", + "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.7" + } + }, + "node_modules/svgo": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.0.tgz", + "integrity": "sha512-VvrHQ+9uniE+Mvx3+C9IEe/lWasXCU0nXMY2kZeLrHNICuRiC8uMPyM14UEaMOFA5mhyQqEkB02VoQ16n3DLaw==", + "license": "MIT", + "dependencies": { + "commander": "^11.1.0", + "css-select": "^5.1.0", + "css-tree": "^3.0.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.1.1", + "sax": "^1.4.1" + }, + "bin": { + "svgo": "bin/svgo.js" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/tiny-inflate": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", + "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/tsconfck": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.6.tgz", + "integrity": "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==", + "license": "MIT", + "bin": { + "tsconfck": "bin/tsconfck.js" + }, + "engines": { + "node": "^18 || >=20" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD", + "optional": true + }, + "node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", + "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", + "license": "MIT" + }, + "node_modules/ultrahtml": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ultrahtml/-/ultrahtml-1.6.0.tgz", + "integrity": "sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==", + "license": "MIT" + }, + "node_modules/uncrypto": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz", + "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==", + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "license": "MIT" + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unifont": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/unifont/-/unifont-0.7.3.tgz", + "integrity": "sha512-b0GtQzKCyuSHGsfj5vyN8st7muZ6VCI4XD4vFlr7Uy1rlWVYxC3npnfk8MyreHxJYrz1ooLDqDzFe9XqQTlAhA==", + "license": "MIT", + "dependencies": { + "css-tree": "^3.1.0", + "ofetch": "^1.5.1", + "ohash": "^2.0.11" + } + }, + "node_modules/unist-util-find-after": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-5.0.0.tgz", + "integrity": "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-modify-children": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-4.0.0.tgz", + "integrity": "sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "array-iterate": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", + "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", + "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-children": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit-children/-/unist-util-visit-children-3.0.0.tgz", + "integrity": "sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unstorage": { + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.4.tgz", + "integrity": "sha512-fHK0yNg38tBiJKp/Vgsq4j0JEsCmgqH58HAn707S7zGkArbZsVr/CwINoi+nh3h98BRCwKvx1K3Xg9u3VV83sw==", + "license": "MIT", + "dependencies": { + "anymatch": "^3.1.3", + "chokidar": "^5.0.0", + "destr": "^2.0.5", + "h3": "^1.15.5", + "lru-cache": "^11.2.0", + "node-fetch-native": "^1.6.7", + "ofetch": "^1.5.1", + "ufo": "^1.6.3" + }, + "peerDependencies": { + "@azure/app-configuration": "^1.8.0", + "@azure/cosmos": "^4.2.0", + "@azure/data-tables": "^13.3.0", + "@azure/identity": "^4.6.0", + "@azure/keyvault-secrets": "^4.9.0", + "@azure/storage-blob": "^12.26.0", + "@capacitor/preferences": "^6 || ^7 || ^8", + "@deno/kv": ">=0.9.0", + "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", + "@planetscale/database": "^1.19.0", + "@upstash/redis": "^1.34.3", + "@vercel/blob": ">=0.27.1", + "@vercel/functions": "^2.2.12 || ^3.0.0", + "@vercel/kv": "^1 || ^2 || ^3", + "aws4fetch": "^1.0.20", + "db0": ">=0.2.1", + "idb-keyval": "^6.2.1", + "ioredis": "^5.4.2", + "uploadthing": "^7.4.4" + }, + "peerDependenciesMeta": { + "@azure/app-configuration": { + "optional": true + }, + "@azure/cosmos": { + "optional": true + }, + "@azure/data-tables": { + "optional": true + }, + "@azure/identity": { + "optional": true + }, + "@azure/keyvault-secrets": { + "optional": true + }, + "@azure/storage-blob": { + "optional": true + }, + "@capacitor/preferences": { + "optional": true + }, + "@deno/kv": { + "optional": true + }, + "@netlify/blobs": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@upstash/redis": { + "optional": true + }, + "@vercel/blob": { + "optional": true + }, + "@vercel/functions": { + "optional": true + }, + "@vercel/kv": { + "optional": true + }, + "aws4fetch": { + "optional": true + }, + "db0": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "uploadthing": { + "optional": true + } + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", + "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vitefu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.1.tgz", + "integrity": "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==", + "license": "MIT", + "workspaces": [ + "tests/deps/*", + "tests/projects/*", + "tests/projects/workspace/packages/*" + ], + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/which-pm-runs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz", + "integrity": "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/widest-line": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-5.0.0.tgz", + "integrity": "sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==", + "license": "MIT", + "dependencies": { + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/xxhash-wasm": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-1.1.0.tgz", + "integrity": "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==", + "license": "MIT" + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", + "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yocto-spinner": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/yocto-spinner/-/yocto-spinner-0.2.3.tgz", + "integrity": "sha512-sqBChb33loEnkoXte1bLg45bEBsOP9N1kzQh5JZNKj/0rik4zAPTNSAVPj3uQAdc6slYJ0Ksc403G2XgxsJQFQ==", + "license": "MIT", + "dependencies": { + "yoctocolors": "^2.1.1" + }, + "engines": { + "node": ">=18.19" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz", + "integrity": "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.25.1", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.1.tgz", + "integrity": "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==", + "license": "ISC", + "peerDependencies": { + "zod": "^3.25 || ^4" + } + }, + "node_modules/zod-to-ts": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/zod-to-ts/-/zod-to-ts-1.2.0.tgz", + "integrity": "sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA==", + "peerDependencies": { + "typescript": "^4.9.4 || ^5.0.2", + "zod": "^3" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/site/package.json b/site/package.json new file mode 100644 index 0000000..7288c72 --- /dev/null +++ b/site/package.json @@ -0,0 +1,17 @@ +{ + "name": "site", + "type": "module", + "version": "0.0.1", + "scripts": { + "dev": "astro dev", + "start": "astro dev", + "build": "astro build", + "preview": "astro preview", + "astro": "astro" + }, + "dependencies": { + "@astrojs/starlight": "^0.37.6", + "astro": "^5.6.1", + "sharp": "^0.34.2" + } +} \ No newline at end of file diff --git a/site/public/favicon.svg b/site/public/favicon.svg new file mode 100644 index 0000000..cba5ac1 --- /dev/null +++ b/site/public/favicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/public/images/2.png b/site/public/images/2.png new file mode 100644 index 0000000..7fc39e3 Binary files /dev/null and b/site/public/images/2.png differ diff --git a/site/public/images/Tracker-121.webp b/site/public/images/Tracker-121.webp new file mode 100644 index 0000000..970b5f9 Binary files /dev/null and b/site/public/images/Tracker-121.webp differ diff --git a/site/public/images/datasheet/wireless-tracker-datasheet_page_10_img_1.png b/site/public/images/datasheet/wireless-tracker-datasheet_page_10_img_1.png new file mode 100644 index 0000000..921f600 Binary files /dev/null and b/site/public/images/datasheet/wireless-tracker-datasheet_page_10_img_1.png differ diff --git a/site/public/images/datasheet/wireless-tracker-datasheet_page_11_img_1.png b/site/public/images/datasheet/wireless-tracker-datasheet_page_11_img_1.png new file mode 100644 index 0000000..921f600 Binary files /dev/null and b/site/public/images/datasheet/wireless-tracker-datasheet_page_11_img_1.png differ diff --git a/site/public/images/datasheet/wireless-tracker-datasheet_page_12_img_1.png b/site/public/images/datasheet/wireless-tracker-datasheet_page_12_img_1.png new file mode 100644 index 0000000..921f600 Binary files /dev/null and b/site/public/images/datasheet/wireless-tracker-datasheet_page_12_img_1.png differ diff --git a/site/public/images/datasheet/wireless-tracker-datasheet_page_13_img_1.png b/site/public/images/datasheet/wireless-tracker-datasheet_page_13_img_1.png new file mode 100644 index 0000000..921f600 Binary files /dev/null and b/site/public/images/datasheet/wireless-tracker-datasheet_page_13_img_1.png differ diff --git a/site/public/images/datasheet/wireless-tracker-datasheet_page_14_img_1.png b/site/public/images/datasheet/wireless-tracker-datasheet_page_14_img_1.png new file mode 100644 index 0000000..921f600 Binary files /dev/null and b/site/public/images/datasheet/wireless-tracker-datasheet_page_14_img_1.png differ diff --git a/site/public/images/datasheet/wireless-tracker-datasheet_page_15_img_1.png b/site/public/images/datasheet/wireless-tracker-datasheet_page_15_img_1.png new file mode 100644 index 0000000..921f600 Binary files /dev/null and b/site/public/images/datasheet/wireless-tracker-datasheet_page_15_img_1.png differ diff --git a/site/public/images/datasheet/wireless-tracker-datasheet_page_16_img_1.png b/site/public/images/datasheet/wireless-tracker-datasheet_page_16_img_1.png new file mode 100644 index 0000000..6b5e2d6 Binary files /dev/null and b/site/public/images/datasheet/wireless-tracker-datasheet_page_16_img_1.png differ diff --git a/site/public/images/datasheet/wireless-tracker-datasheet_page_16_img_2.png b/site/public/images/datasheet/wireless-tracker-datasheet_page_16_img_2.png new file mode 100644 index 0000000..921f600 Binary files /dev/null and b/site/public/images/datasheet/wireless-tracker-datasheet_page_16_img_2.png differ diff --git a/site/public/images/datasheet/wireless-tracker-datasheet_page_17_img_1.png b/site/public/images/datasheet/wireless-tracker-datasheet_page_17_img_1.png new file mode 100644 index 0000000..921f600 Binary files /dev/null and b/site/public/images/datasheet/wireless-tracker-datasheet_page_17_img_1.png differ diff --git a/site/public/images/datasheet/wireless-tracker-datasheet_page_1_img_1.png b/site/public/images/datasheet/wireless-tracker-datasheet_page_1_img_1.png new file mode 100644 index 0000000..f531303 Binary files /dev/null and b/site/public/images/datasheet/wireless-tracker-datasheet_page_1_img_1.png differ diff --git a/site/public/images/datasheet/wireless-tracker-datasheet_page_1_img_2.png b/site/public/images/datasheet/wireless-tracker-datasheet_page_1_img_2.png new file mode 100644 index 0000000..9ecfe79 Binary files /dev/null and b/site/public/images/datasheet/wireless-tracker-datasheet_page_1_img_2.png differ diff --git a/site/public/images/datasheet/wireless-tracker-datasheet_page_2_img_1.png b/site/public/images/datasheet/wireless-tracker-datasheet_page_2_img_1.png new file mode 100644 index 0000000..921f600 Binary files /dev/null and b/site/public/images/datasheet/wireless-tracker-datasheet_page_2_img_1.png differ diff --git a/site/public/images/datasheet/wireless-tracker-datasheet_page_3_img_1.png b/site/public/images/datasheet/wireless-tracker-datasheet_page_3_img_1.png new file mode 100644 index 0000000..921f600 Binary files /dev/null and b/site/public/images/datasheet/wireless-tracker-datasheet_page_3_img_1.png differ diff --git a/site/public/images/datasheet/wireless-tracker-datasheet_page_4_img_1.png b/site/public/images/datasheet/wireless-tracker-datasheet_page_4_img_1.png new file mode 100644 index 0000000..921f600 Binary files /dev/null and b/site/public/images/datasheet/wireless-tracker-datasheet_page_4_img_1.png differ diff --git a/site/public/images/datasheet/wireless-tracker-datasheet_page_5_img_1.png b/site/public/images/datasheet/wireless-tracker-datasheet_page_5_img_1.png new file mode 100644 index 0000000..921f600 Binary files /dev/null and b/site/public/images/datasheet/wireless-tracker-datasheet_page_5_img_1.png differ diff --git a/site/public/images/datasheet/wireless-tracker-datasheet_page_6_img_1.png b/site/public/images/datasheet/wireless-tracker-datasheet_page_6_img_1.png new file mode 100644 index 0000000..1b100ae Binary files /dev/null and b/site/public/images/datasheet/wireless-tracker-datasheet_page_6_img_1.png differ diff --git a/site/public/images/datasheet/wireless-tracker-datasheet_page_6_img_2.png b/site/public/images/datasheet/wireless-tracker-datasheet_page_6_img_2.png new file mode 100644 index 0000000..921f600 Binary files /dev/null and b/site/public/images/datasheet/wireless-tracker-datasheet_page_6_img_2.png differ diff --git a/site/public/images/datasheet/wireless-tracker-datasheet_page_7_img_1.png b/site/public/images/datasheet/wireless-tracker-datasheet_page_7_img_1.png new file mode 100644 index 0000000..921f600 Binary files /dev/null and b/site/public/images/datasheet/wireless-tracker-datasheet_page_7_img_1.png differ diff --git a/site/public/images/datasheet/wireless-tracker-datasheet_page_8_img_1.png b/site/public/images/datasheet/wireless-tracker-datasheet_page_8_img_1.png new file mode 100644 index 0000000..921f600 Binary files /dev/null and b/site/public/images/datasheet/wireless-tracker-datasheet_page_8_img_1.png differ diff --git a/site/public/images/datasheet/wireless-tracker-datasheet_page_9_img_1.png b/site/public/images/datasheet/wireless-tracker-datasheet_page_9_img_1.png new file mode 100644 index 0000000..921f600 Binary files /dev/null and b/site/public/images/datasheet/wireless-tracker-datasheet_page_9_img_1.png differ diff --git a/site/public/images/gnss-protocol/gnss-protocol_page_1_img_1.png b/site/public/images/gnss-protocol/gnss-protocol_page_1_img_1.png new file mode 100644 index 0000000..ef1da79 Binary files /dev/null and b/site/public/images/gnss-protocol/gnss-protocol_page_1_img_1.png differ diff --git a/site/public/images/gnss-protocol/gnss-protocol_page_1_img_2.png b/site/public/images/gnss-protocol/gnss-protocol_page_1_img_2.png new file mode 100644 index 0000000..6c6bd2e Binary files /dev/null and b/site/public/images/gnss-protocol/gnss-protocol_page_1_img_2.png differ diff --git a/site/public/images/pinout-diagram.png b/site/public/images/pinout-diagram.png new file mode 100644 index 0000000..2f3650b Binary files /dev/null and b/site/public/images/pinout-diagram.png differ diff --git a/site/public/images/schematic/schematic_page_1_img_1.png b/site/public/images/schematic/schematic_page_1_img_1.png new file mode 100644 index 0000000..568ad70 Binary files /dev/null and b/site/public/images/schematic/schematic_page_1_img_1.png differ diff --git a/site/public/images/structure-chart.png b/site/public/images/structure-chart.png new file mode 100644 index 0000000..ec9d5e6 Binary files /dev/null and b/site/public/images/structure-chart.png differ diff --git a/site/public/images/tracker-1.png b/site/public/images/tracker-1.png new file mode 100644 index 0000000..40db4ae Binary files /dev/null and b/site/public/images/tracker-1.png differ diff --git a/site/public/images/tracker-3.png b/site/public/images/tracker-3.png new file mode 100644 index 0000000..406fc61 Binary files /dev/null and b/site/public/images/tracker-3.png differ diff --git a/site/public/images/wireless-tracker-pin-map.png b/site/public/images/wireless-tracker-pin-map.png new file mode 100644 index 0000000..9c8bfce Binary files /dev/null and b/site/public/images/wireless-tracker-pin-map.png differ diff --git a/site/src/assets/houston.webp b/site/src/assets/houston.webp new file mode 100644 index 0000000..930c164 Binary files /dev/null and b/site/src/assets/houston.webp differ diff --git a/site/src/assets/tracker-icon.svg b/site/src/assets/tracker-icon.svg new file mode 100644 index 0000000..e689e39 --- /dev/null +++ b/site/src/assets/tracker-icon.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + S3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/site/src/content.config.ts b/site/src/content.config.ts new file mode 100644 index 0000000..d9ee8c9 --- /dev/null +++ b/site/src/content.config.ts @@ -0,0 +1,7 @@ +import { defineCollection } from 'astro:content'; +import { docsLoader } from '@astrojs/starlight/loaders'; +import { docsSchema } from '@astrojs/starlight/schema'; + +export const collections = { + docs: defineCollection({ loader: docsLoader(), schema: docsSchema() }), +}; diff --git a/site/src/content/docs/getting-started/development-platforms.mdx b/site/src/content/docs/getting-started/development-platforms.mdx new file mode 100644 index 0000000..d4ed7b5 --- /dev/null +++ b/site/src/content/docs/getting-started/development-platforms.mdx @@ -0,0 +1,173 @@ +--- +title: Development Platforms +description: Choose your development environment for the Heltec Wireless Tracker +--- + +import { Aside, Tabs, TabItem, Card, CardGrid } from '@astrojs/starlight/components'; + +Three primary development approaches are available for the Wireless Tracker, each suited to different goals and experience levels. + +## Platform Comparison + + + + **Best for**: Library ecosystem, familiar workflow, rapid development + + Pros: Huge library ecosystem, familiar syntax, active community + + Cons: Abstraction overhead, may hide hardware details + + + **Best for**: Production applications, low-level control + + Pros: Full feature access, official support, best performance + + Cons: Steeper learning curve, more verbose code + + + **Best for**: Rapid prototyping, education, scripting + + Pros: Fast iteration, interactive REPL, easy to learn + + Cons: Slower execution, higher memory usage + + + +## Recommended Platform by Use Case + +| Use Case | Recommended | +|----------|-------------| +| Meshtastic | Pre-built firmware | +| LoRaWAN projects | Arduino/PlatformIO | +| GNSS development | ESP-IDF or Arduino | +| Quick prototyping | MicroPython | +| Production devices | ESP-IDF | + +## Setup Instructions + + + + PlatformIO provides a professional development environment with dependency management. + + ### platformio.ini + + ```ini + [env:heltec_wireless_tracker] + platform = espressif32 + board = heltec_wireless_tracker + framework = arduino + monitor_speed = 115200 + lib_deps = + heltec-automation/Heltec ESP32 Dev-Boards + ``` + + ### Installation + + 1. Install VS Code with PlatformIO extension + 2. Create new project with the configuration above + 3. Build and upload with Ctrl+Alt+U + + + The Arduino IDE offers a beginner-friendly environment. + + ### Board Manager Setup + + 1. Open **File → Preferences** + 2. Add to "Additional Board Manager URLs": + ``` + https://resource.heltec.cn/download/package_heltec_esp32_index.json + ``` + 3. Open **Tools → Board → Boards Manager** + 4. Search for "Heltec ESP32" and install + 5. Select **Tools → Board → Heltec ESP32 Series Dev-boards → Wireless Tracker** + + ### Library Installation + + 1. Open **Sketch → Include Library → Manage Libraries** + 2. Search "Heltec ESP32" and install + + + The official Espressif framework provides maximum control. + + ### Prerequisites + + 1. Install ESP-IDF v5.x following [official docs](https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/get-started/) + 2. Clone Heltec examples: + ```bash + git clone https://github.com/Heltec-Aaron-Lee/WiFi_Kit_series.git + ``` + + ### Build Example + + ```bash + cd WiFi_Kit_series/esp-idf/examples/wireless_tracker + idf.py set-target esp32s3 + idf.py build + idf.py -p /dev/ttyUSB0 flash monitor + ``` + + + MicroPython enables interactive development and rapid prototyping. + + ### Firmware Installation + + 1. Download ESP32-S3 MicroPython firmware from [micropython.org](https://micropython.org/download/ESP32_GENERIC_S3/) + 2. Flash with esptool: + ```bash + esptool.py --port /dev/ttyUSB0 erase_flash + esptool.py --port /dev/ttyUSB0 write_flash -z 0 esp32s3-*.bin + ``` + + ### Basic Example + + ```python + from machine import Pin, UART + import time + + # Enable GNSS power (V1.1) + gnss_pwr = Pin(3, Pin.OUT) + gnss_pwr.value(1) + + # Setup GNSS UART + gnss = UART(1, baudrate=115200, tx=34, rx=33) + + while True: + if gnss.any(): + print(gnss.readline()) + time.sleep(0.1) + ``` + + + +## Heltec Library Functions + +The official Heltec library provides helper functions for common operations: + +```cpp +#include "HT_st7735.h" // TFT display +#include "LoRaWan_APP.h" // LoRaWAN stack +#include "HT_TinyGPS++.h" // GNSS parsing + +// Display initialization +HT_st7735 display; +display.init(); +display.clear(); +display.drawString(0, 0, "Hello Tracker!"); + +// LoRa initialization +Mcu.begin(HELTEC_BOARD, SLOW_CLK_TPYE); +LoRaWAN.init(CLASS_A, ACTIVE_REGION); +``` + + + +## Bootloader Access + +If code upload fails, manually enter bootloader mode: + +1. **Device not connected**: Press and hold `USER` before plugging in USB +2. **Device already connected**: Hold `USER` → Press `RESET` → Release `RESET` → Release `USER` + +Timing requirement: Reset signal must be held for ≥10 ms. diff --git a/site/src/content/docs/getting-started/hardware-versions.mdx b/site/src/content/docs/getting-started/hardware-versions.mdx new file mode 100644 index 0000000..d4aa425 --- /dev/null +++ b/site/src/content/docs/getting-started/hardware-versions.mdx @@ -0,0 +1,122 @@ +--- +title: Hardware Versions +description: Differences between Wireless Tracker V1.0 and V1.1 hardware revisions +--- + +import { Aside, Tabs, TabItem } from '@astrojs/starlight/components'; + +The Wireless Tracker has undergone hardware revisions since its initial release. Understanding the differences is critical for firmware compatibility. + +## Version Timeline + +| Version | Release | Key Change | +|---------|---------|------------| +| **V1.0** | June 2023 | Initial release | +| **V1.1** | Late 2023 | Added dedicated GNSS LDO, GPIO3 control | + +## V1.1 Changes + +The V1.1 revision addressed power isolation issues that could cause GNSS failures during LoRa transmission. + +### What Changed + +| Feature | V1.0 | V1.1 | +|---------|------|------| +| GNSS Power | Shared rail | Dedicated LDO | +| GNSS Control | Always on | GPIO3 (HIGH = enabled) | +| Power Isolation | Limited | Improved | +| Low Power Mode | Basic | Enhanced | + + + +## Identifying Your Version + +### Physical Inspection + +Look for the version marking on the PCB near the USB connector. + +### Programmatic Detection + +```cpp +// V1.1 detection - check if GPIO3 controls GNSS +#define GNSS_CTRL_PIN 3 + +void setup() { + Serial.begin(115200); + + // For V1.1 hardware - enable GNSS power + pinMode(GNSS_CTRL_PIN, OUTPUT); + digitalWrite(GNSS_CTRL_PIN, HIGH); + + delay(1000); // Allow GNSS to power up + + // Check for GNSS response... +} +``` + +## Firmware Compatibility + +### Meshtastic + + + + Meshtastic **2.2.17 Beta** and later auto-detect the hardware version. + + For earlier versions, use the temporary firmware from Heltec: + ```bash + device-install.bat -f firmware.factory.bin + ``` + + + Standard Meshtastic firmware works without modification. + + + +### Custom Firmware + +Always include GNSS power initialization for V1.1 compatibility: + +```cpp +// Universal initialization - works on both V1.0 and V1.1 +void initGNSS() { + // V1.1: Enable GNSS power via GPIO3 + // V1.0: This has no effect (pin not connected to GNSS power) + pinMode(3, OUTPUT); + digitalWrite(3, HIGH); + + // Wait for GNSS module to initialize + delay(100); + + // Continue with GNSS serial setup... +} +``` + +## Technical Details + +### V1.1 Power Architecture + +The V1.1 added a dedicated low-dropout regulator (LDO) for the UC6580 GNSS module: + +- **Input**: Vext rail (controlled by GPIO3) +- **Output**: Clean 3.3V for GNSS +- **Benefit**: Eliminates voltage drops during high-current LoRa TX + +### Power Consumption Improvements + +| Mode | V1.0 | V1.1 | +|------|------|------| +| Deep Sleep | ~25 µA | ~15 µA | +| GNSS Only | 90 mA | 89 mA | +| LoRa + GNSS | Unstable | 89 + TX mA | + + + +## Documentation Links + +- [V1.0 Schematic](https://resource.heltec.cn/download/Wireless_Tracker/Wireless_Tacker1.0/HTIT-Tracker_V0.3.pdf) +- [V1.1 Schematic](https://resource.heltec.cn/download/Wireless_Tracker/Wireless_Tacker1.1) +- [V1.1 Datasheet](https://resource.heltec.cn/download/Wireless_Tracker/Wireless%20Tracker%201.1.pdf) diff --git a/site/src/content/docs/getting-started/overview.mdx b/site/src/content/docs/getting-started/overview.mdx new file mode 100644 index 0000000..88524cb --- /dev/null +++ b/site/src/content/docs/getting-started/overview.mdx @@ -0,0 +1,63 @@ +--- +title: Product Overview +description: Introduction to the Heltec Wireless Tracker ESP32-S3FN8 development kit +--- + +import { Aside, Card, CardGrid } from '@astrojs/starlight/components'; + +The **Wireless Tracker** is a development kit based on the ESP32-S3FN8. It integrates both SX1262 and UC6580 to provide a fast GNSS solution for IoT. Combined with the sample programs and development tools provided, you can track any object and upload data wirelessly via Wi-Fi, Bluetooth, or LoRa. + +![Wireless Tracker Board](/images/tracker-1.png) + +## Key Features + + + + Wi-Fi 802.11 b/g/n, Bluetooth 5 with mesh support, and LoRa SX1262 for long-range communication. + + + L1+L5 positioning with GPS, GLONASS, BDS, Galileo, NAVIC, and QZSS support. + + + 0.96" RGB TFT-LCD (80×160) for status, debugging, and user interface. + + + Integrated lithium battery charging, discharge protection, and automatic USB/battery switching. + + + +## Hardware Highlights + +- **ESP32-S3FN8** dual-core Xtensa LX7 processor with 8MB flash +- **SX1262** LoRa transceiver with up to +21 dBm TX power +- **UC6580** 96-channel GNSS receiver +- **Type-C USB** with ESD protection and voltage regulation +- **SH1.25-2** battery connector with charging circuit +- **IPEX connectors** for LoRa and GNSS external antennas +- **Metal spring antenna** for 2.4 GHz Wi-Fi/Bluetooth + +## Product Models + +| Model | LoRa Frequency | Regional Networks | +|-------|----------------|-------------------| +| Wireless Tracker-LF | 470-510 MHz | CN470 (China) | +| Wireless Tracker-HF | 863-928 MHz | EU868, US915, AU915, AS923, KR920 | + + + +## Typical Applications + +- **Asset tracking**: Vehicles, containers, equipment +- **Personal safety**: Elderly, children, pets +- **Agriculture**: Livestock, irrigation systems +- **Fleet management**: Delivery, logistics +- **Sports & recreation**: Hiking, cycling, boating +- **Mesh networking**: Meshtastic off-grid communication + +## What's Next? + +- [Hardware Versions](/getting-started/hardware-versions/) - Differences between V1.0 and V1.1 +- [Development Platforms](/getting-started/development-platforms/) - Choose your development environment +- [Pinout Reference](/hardware/pinout/) - Pin assignments and GPIO functions diff --git a/site/src/content/docs/guides/heart-rate-monitor.mdx b/site/src/content/docs/guides/heart-rate-monitor.mdx new file mode 100644 index 0000000..6cd6c36 --- /dev/null +++ b/site/src/content/docs/guides/heart-rate-monitor.mdx @@ -0,0 +1,290 @@ +--- +title: Heart Rate Monitor via LoRaWAN +description: Build a wireless heart rate monitor using the Heltec Wireless Tracker and MAX30102 sensor +--- + +import { Aside, Steps, Tabs, TabItem } from '@astrojs/starlight/components'; + +This project enables real-time heart rate monitoring using the Wireless Tracker connected to a MAX30102 pulse oximetry sensor. Data transmits via LoRaWAN to the SnapEmu platform for visualization. + +## Hardware Requirements + +| Component | Purpose | +|-----------|---------| +| Heltec Wireless Tracker | Main controller + LoRa TX | +| HT-M7603 Indoor LoRa Gateway | LoRaWAN network gateway | +| MAX30102 Heart Rate Sensor | Pulse oximetry sensor | +| DuPont Wires | Connections | + +## Wiring Diagram + +The MAX30102 connects via I2C: + +| MAX30102 Pin | Tracker Pin | Description | +|--------------|-------------|-------------| +| VCC | 3V3 | Power (3.3V) | +| GND | GND | Ground | +| SDA | GPIO45 | I2C Data | +| SCL | GPIO46 | I2C Clock | + + + +## Software Setup + + + +1. **Configure LoRa Gateway** + + Set up your HT-M7603 gateway with SnapEmu platform following the [official Heltec documentation](https://docs.heltec.cn/en/gateway/ht-m7603/connect_to_snapemu.html). + +2. **Register Device on SnapEmu** + + Register your Wireless Tracker node following the [SnapEmu device connection guide](https://snapemudoc.readthedocs.io/en/latest/Node%20Devices%20Connection/register_on_snapemu.html). + +3. **Install Libraries** + + Required Arduino libraries: + - `Wire.h` (built-in) + - `MAX30102_PulseOximeter.h` + - `LoRaWan_APP.h` (Heltec library) + +4. **Test Sensor Standalone** + + Upload the test code to verify sensor operation before adding LoRaWAN. + +5. **Deploy Full Application** + + Upload the complete LoRaWAN code with your OTAA credentials. + + + +## Code Examples + + + +```cpp +#include +#include "MAX30102_PulseOximeter.h" + +#define REPORTING_PERIOD_MS 1000 +PulseOximeter pox; +uint32_t tsLastReport = 0; + +void onBeatDetected() { + Serial.println("Beat detected!"); +} + +void setup() { + Serial.begin(115200); + Wire.begin(45, 46); // SDA=GPIO45, SCL=GPIO46 + Serial.print("Initializing MAX30102.."); + delay(3000); + + if (!pox.begin()) { + Serial.println("FAILED"); + for(;;); + } else { + Serial.println("SUCCESS"); + } + + pox.setIRLedCurrent(MAX30102_LED_CURR_7_6MA); + pox.setOnBeatDetectedCallback(onBeatDetected); +} + +void loop() { + pox.update(); + + if (millis() - tsLastReport > REPORTING_PERIOD_MS) { + float heartRate = pox.getHeartRate(); + float spo2 = pox.getSpO2(); + + Serial.print("HR: "); + Serial.print(heartRate > 0 ? String(heartRate) : "N/A"); + Serial.print(" bpm / SpO2: "); + Serial.print(spo2 > 0 ? String(spo2) : "N/A"); + Serial.println("%"); + + tsLastReport = millis(); + } +} +``` + + +```cpp +#include +#include "MAX30102_PulseOximeter.h" +#include "LoRaWan_APP.h" + +#define REPORTING_PERIOD_MS 1000 + +// OTAA Parameters - Replace with your SnapEmu values +uint8_t devEui[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA8 }; +uint8_t appEui[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; +uint8_t appKey[] = { 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88 }; + +// LoRaWAN Configuration +uint16_t userChannelsMask[6] = { 0x00FF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }; +LoRaMacRegion_t loraWanRegion = ACTIVE_REGION; +DeviceClass_t loraWanClass = CLASS_A; +uint32_t appTxDutyCycle = 15000; // 15 second transmit interval +bool overTheAirActivation = true; +bool loraWanAdr = true; +bool isTxConfirmed = true; +uint8_t appPort = 2; +uint8_t confirmedNbTrials = 4; + +PulseOximeter pox; +uint32_t tsLastReport = 0; + +static void prepareTxFrame(uint8_t port) { + pox.update(); + float heartRate = pox.getHeartRate(); + float spo2 = pox.getSpO2(); + unsigned char *puc; + + appDataSize = 0; + + // Packet header + appData[appDataSize++] = 0x04; + appData[appDataSize++] = 0x00; + appData[appDataSize++] = 0x0A; + appData[appDataSize++] = 0x02; + + // Heart rate (4 bytes float) + puc = (unsigned char *)(&heartRate); + appData[appDataSize++] = puc[0]; + appData[appDataSize++] = puc[1]; + appData[appDataSize++] = puc[2]; + appData[appDataSize++] = puc[3]; + + // Separator + appData[appDataSize++] = 0x12; + + // SpO2 (4 bytes float) + puc = (unsigned char *)(&spo2); + appData[appDataSize++] = puc[0]; + appData[appDataSize++] = puc[1]; + appData[appDataSize++] = puc[2]; + appData[appDataSize++] = puc[3]; + + Serial.printf("TX: HR=%.1f SpO2=%.1f\n", heartRate, spo2); +} + +void onBeatDetected() { + Serial.println("Beat!"); +} + +void setup() { + Serial.begin(115200); + Wire.begin(45, 46); + Mcu.begin(HELTEC_BOARD, SLOW_CLK_TPYE); + + Serial.print("Initializing MAX30102.."); + delay(3000); + + if (!pox.begin()) { + Serial.println("FAILED"); + for(;;); + } + Serial.println("SUCCESS"); + + pox.setIRLedCurrent(MAX30102_LED_CURR_27_1MA); + pox.setOnBeatDetectedCallback(onBeatDetected); + + LoRaWAN.init(loraWanClass, loraWanRegion); + LoRaWAN.setDefaultDR(3); +} + +void loop() { + pox.update(); + + // Local display + if (millis() - tsLastReport > REPORTING_PERIOD_MS) { + float heartRate = pox.getHeartRate(); + float spo2 = pox.getSpO2(); + + Serial.printf("HR: %s bpm | SpO2: %s%%\n", + heartRate > 0 ? String(heartRate).c_str() : "N/A", + spo2 > 0 ? String(spo2).c_str() : "N/A"); + + tsLastReport = millis(); + } + + // LoRaWAN state machine + switch (deviceState) { + case DEVICE_STATE_INIT: + case DEVICE_STATE_JOIN: + LoRaWAN.join(); + break; + case DEVICE_STATE_SEND: + prepareTxFrame(appPort); + LoRaWAN.send(); + deviceState = DEVICE_STATE_CYCLE; + break; + case DEVICE_STATE_CYCLE: + txDutyCycleTime = appTxDutyCycle + + randr(-APP_TX_DUTYCYCLE_RND, APP_TX_DUTYCYCLE_RND); + LoRaWAN.cycle(txDutyCycleTime); + deviceState = DEVICE_STATE_SLEEP; + break; + case DEVICE_STATE_SLEEP: + LoRaWAN.sleep(loraWanClass); + break; + default: + deviceState = DEVICE_STATE_INIT; + break; + } +} +``` + + +```javascript +// SnapEmu payload decoder +function Decoder(bytes, port) { + var decoded = {}; + + if (bytes.length >= 13) { + // Extract heart rate (bytes 4-7) + var hrBytes = new Uint8Array([bytes[4], bytes[5], bytes[6], bytes[7]]); + var hrView = new DataView(hrBytes.buffer); + decoded.heartRate = hrView.getFloat32(0, true); + + // Extract SpO2 (bytes 9-12) + var spo2Bytes = new Uint8Array([bytes[9], bytes[10], bytes[11], bytes[12]]); + var spo2View = new DataView(spo2Bytes.buffer); + decoded.spo2 = spo2View.getFloat32(0, true); + } + + return decoded; +} +``` + + + +## Platform Features + +SnapEmu provides: + +- Real-time heart rate graph +- SpO2 level monitoring +- Historical data (up to 1 month) +- Mobile app + web interface + +## Troubleshooting + +| Issue | Solution | +|-------|----------| +| No heartbeat detected | Ensure finger is properly placed, adjust LED current | +| Erratic readings | Clean sensor, reduce movement, check power supply | +| LoRa join failed | Verify gateway connection, check OTAA credentials | +| Data not on platform | Check decoder function, verify port number matches | + +## References + +- [SnapEmu Documentation](https://snapemudoc.readthedocs.io/) +- [Heltec Sensor Decoding Guide](https://docs.heltec.cn/general/define_sensor_decoding_function_on_snapemu.html) + +Based on the project by ashley15 on Hackster.io. diff --git a/site/src/content/docs/guides/lorawan-setup.mdx b/site/src/content/docs/guides/lorawan-setup.mdx new file mode 100644 index 0000000..d132c9d --- /dev/null +++ b/site/src/content/docs/guides/lorawan-setup.mdx @@ -0,0 +1,299 @@ +--- +title: LoRaWAN Setup Guide +description: Connect your Heltec Wireless Tracker to LoRaWAN networks +--- + +import { Aside, Steps, Tabs, TabItem } from '@astrojs/starlight/components'; + +This guide covers connecting your Wireless Tracker to LoRaWAN networks including The Things Network (TTN), SnapEmu, and other LoRaWAN servers. + +## Prerequisites + +- Heltec Wireless Tracker with LoRa antenna +- Gateway coverage in your area (or your own gateway) +- Account on your chosen LoRaWAN network server +- Arduino IDE or PlatformIO with Heltec libraries + +## Regional Frequencies + +Choose the correct model for your region: + +| Region | Frequency | Model | +|--------|-----------|-------| +| EU868 | 863-870 MHz | Wireless Tracker-HF | +| US915 | 902-928 MHz | Wireless Tracker-HF | +| AU915 | 915-928 MHz | Wireless Tracker-HF | +| AS923 | 920-925 MHz | Wireless Tracker-HF | +| KR920 | 920-923 MHz | Wireless Tracker-HF | +| CN470 | 470-510 MHz | Wireless Tracker-LF | + + + +## OTAA vs ABP + +| Method | Pros | Cons | +|--------|------|------| +| **OTAA** (Over-The-Air Activation) | More secure, automatic session renewal | Requires join process | +| **ABP** (Activation By Personalization) | Immediate transmission | Less secure, manual key management | + + + +## Network Registration + + + + +### Register on TTN + + + +1. Create account at [thethingsnetwork.org](https://www.thethingsnetwork.org/) + +2. Create a new **Application** + +3. Add an **End Device**: + - Select "Enter end device specifics manually" + - Frequency plan: Match your region (e.g., US915 FSB2) + - LoRaWAN version: 1.0.3 + - Regional Parameters: RP001 Regional Parameters 1.0.3 revision A + +4. Generate credentials: + - DevEUI: Generate or use chip's MAC + - AppEUI: All zeros or generate + - AppKey: Generate (save this!) + +5. Copy credentials for firmware + + + +### TTN Payload Decoder + +```javascript +function decodeUplink(input) { + return { + data: { + // Parse your payload format here + battery: input.bytes[0] / 10, + latitude: ((input.bytes[1] << 24) | (input.bytes[2] << 16) | + (input.bytes[3] << 8) | input.bytes[4]) / 1000000, + longitude: ((input.bytes[5] << 24) | (input.bytes[6] << 16) | + (input.bytes[7] << 8) | input.bytes[8]) / 1000000 + }, + warnings: [], + errors: [] + }; +} +``` + + + +### Register on SnapEmu + + + +1. Create account at [snapemu.com](https://snapemu.com/) + +2. Configure your Heltec gateway to connect to SnapEmu + +3. Add a new **Node Device** + +4. Copy the generated credentials: + - DevEUI + - AppEUI + - AppKey + + + +### SnapEmu Features + +- Automatic device provisioning for Heltec devices +- Built-in decoder library +- Real-time data visualization +- Historical data storage + + + +## Firmware Configuration + +### Basic LoRaWAN Example + +```cpp +#include "LoRaWan_APP.h" + +// OTAA Credentials - Replace with your values +uint8_t devEui[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; +uint8_t appEui[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; +uint8_t appKey[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + +// Channel mask for US915 FSB2 (channels 8-15) +uint16_t userChannelsMask[6] = { 0xFF00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }; + +// For EU868, use: +// uint16_t userChannelsMask[6] = { 0x00FF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }; + +LoRaMacRegion_t loraWanRegion = LORAMAC_REGION_US915; // Change for your region +DeviceClass_t loraWanClass = CLASS_A; +uint32_t appTxDutyCycle = 60000; // 60 second transmit interval +bool overTheAirActivation = true; +bool loraWanAdr = true; +bool isTxConfirmed = true; +uint8_t appPort = 1; +uint8_t confirmedNbTrials = 4; + +void setup() { + Serial.begin(115200); + Mcu.begin(HELTEC_BOARD, SLOW_CLK_TPYE); + + LoRaWAN.init(loraWanClass, loraWanRegion); + LoRaWAN.setDefaultDR(3); // SF7-SF12 depending on region +} + +static void prepareTxFrame(uint8_t port) { + appDataSize = 4; + + // Example: Send battery voltage and status + float voltage = readBatteryVoltage(); + uint16_t vBat = (uint16_t)(voltage * 100); + + appData[0] = (uint8_t)(vBat >> 8); + appData[1] = (uint8_t)(vBat & 0xFF); + appData[2] = 0x00; // Status byte + appData[3] = 0x00; // Reserved +} + +void loop() { + switch (deviceState) { + case DEVICE_STATE_INIT: + LoRaWAN.init(loraWanClass, loraWanRegion); + deviceState = DEVICE_STATE_JOIN; + break; + + case DEVICE_STATE_JOIN: + LoRaWAN.join(); + break; + + case DEVICE_STATE_SEND: + prepareTxFrame(appPort); + LoRaWAN.send(); + deviceState = DEVICE_STATE_CYCLE; + break; + + case DEVICE_STATE_CYCLE: + txDutyCycleTime = appTxDutyCycle + + randr(-APP_TX_DUTYCYCLE_RND, APP_TX_DUTYCYCLE_RND); + LoRaWAN.cycle(txDutyCycleTime); + deviceState = DEVICE_STATE_SLEEP; + break; + + case DEVICE_STATE_SLEEP: + LoRaWAN.sleep(loraWanClass); + break; + + default: + deviceState = DEVICE_STATE_INIT; + break; + } +} + +float readBatteryVoltage() { + pinMode(2, OUTPUT); + digitalWrite(2, LOW); + int raw = analogRead(1); + digitalWrite(2, HIGH); + return (raw / 4095.0) * 3.3 * 4.9; +} +``` + +### Region Configuration + +| Region | `LoRaMacRegion_t` | Default DR | Notes | +|--------|-------------------|------------|-------| +| EU868 | `LORAMAC_REGION_EU868` | DR5 (SF7) | 1% duty cycle | +| US915 | `LORAMAC_REGION_US915` | DR3 (SF7) | Use FSB2 for TTN | +| AU915 | `LORAMAC_REGION_AU915` | DR3 (SF7) | Similar to US915 | +| AS923 | `LORAMAC_REGION_AS923` | DR5 (SF7) | Multiple sub-bands | +| CN470 | `LORAMAC_REGION_CN470` | DR3 (SF7) | LF model only | + +## Sending GPS Data + +```cpp +#include "TinyGPS++.h" + +TinyGPSPlus gps; +HardwareSerial GPSSerial(1); + +void setup() { + // Enable GNSS power (V1.1) + pinMode(3, OUTPUT); + digitalWrite(3, HIGH); + + // Initialize GNSS serial + GPSSerial.begin(115200, SERIAL_8N1, 33, 34); +} + +static void prepareTxFrame(uint8_t port) { + // Read latest GPS data + while (GPSSerial.available()) { + gps.encode(GPSSerial.read()); + } + + if (gps.location.isValid()) { + int32_t lat = gps.location.lat() * 1000000; + int32_t lon = gps.location.lng() * 1000000; + + appDataSize = 9; + + // Latitude (4 bytes, big-endian) + appData[0] = (lat >> 24) & 0xFF; + appData[1] = (lat >> 16) & 0xFF; + appData[2] = (lat >> 8) & 0xFF; + appData[3] = lat & 0xFF; + + // Longitude (4 bytes, big-endian) + appData[4] = (lon >> 24) & 0xFF; + appData[5] = (lon >> 16) & 0xFF; + appData[6] = (lon >> 8) & 0xFF; + appData[7] = lon & 0xFF; + + // Satellites + appData[8] = gps.satellites.value(); + } +} +``` + +## Troubleshooting + +### Join Failures + +| Symptom | Cause | Solution | +|---------|-------|----------| +| No join accept | Wrong credentials | Double-check DevEUI, AppEUI, AppKey | +| Timeout | No gateway | Verify gateway coverage | +| Repeated joins | Session expired | Check network server settings | + +### No Uplinks Received + +1. Verify antenna is connected +2. Check frequency plan matches gateway +3. Increase spreading factor (lower DR) for better range +4. Monitor RSSI/SNR on gateway + +### Duty Cycle Exceeded + +EU868 has strict 1% duty cycle limits: + +```cpp +// Increase transmit interval to respect duty cycle +uint32_t appTxDutyCycle = 300000; // 5 minutes minimum for EU868 +``` + +## References + +- [LoRaWAN Specification](https://lora-alliance.org/resource-hub/lorawanr-specification-v103) +- [Heltec LoRaWAN Examples](https://github.com/Heltec-Aaron-Lee/WiFi_Kit_series) +- [TTN Device Registration](https://www.thethingsnetwork.org/docs/devices/) diff --git a/site/src/content/docs/guides/meshtastic-low-power.mdx b/site/src/content/docs/guides/meshtastic-low-power.mdx new file mode 100644 index 0000000..5b1468c --- /dev/null +++ b/site/src/content/docs/guides/meshtastic-low-power.mdx @@ -0,0 +1,162 @@ +--- +title: Meshtastic Low Power Configuration +description: Optimize battery life on the Heltec Wireless Tracker with Meshtastic +--- + +import { Aside, Steps } from '@astrojs/starlight/components'; + +This guide demonstrates how to configure a Heltec Wireless Tracker with Meshtastic to achieve extended battery life through optimized sleep settings. + +## Hardware Requirements + +- Heltec Wireless Tracker development kit +- 1000mAh (or larger) lithium battery, fully charged +- LoRa antenna (IPEX connector) +- Meshtastic firmware (2.2.17+ recommended) + + + +## Expected Results + +With proper configuration, you can achieve: + +| Metric | Value | +|--------|-------| +| Idle current draw | 13 µA | +| Active operation | ~1% battery/hour | +| Runtime (1000mAh) | ~100 hours active | + +## Power Consumption Reference + +| Mode | Current Draw | +|------|--------------| +| Deep Sleep | 13 µA | +| Light Sleep | ~1 mA | +| GPS Active | ~89 mA | +| LoRa TX | ~178 mA | +| LoRa RX | ~59 mA | + +## Configuration Steps + + + +1. **Flash Meshtastic Firmware** + + Download and flash the latest Meshtastic firmware for Wireless Tracker: + ```bash + # Using esptool + esptool.py write_flash 0x0 firmware-heltec-wireless-tracker.factory.bin + + # Or use the Meshtastic flasher app + ``` + +2. **Connect via Bluetooth** + + Open the Meshtastic mobile app and pair with your device via Bluetooth. + +3. **Set Device Role** + + Navigate to **Settings → Device Config**: + - Set **Role** to `TRACKER` + +4. **Configure Position Settings** + + Navigate to **Settings → Position Config**: + + | Parameter | Value | Description | + |-----------|-------|-------------| + | Position broadcast interval | 900 s | Broadcast every 15 minutes | + | Smart broadcast min distance | 10 m | Movement threshold | + | Smart broadcast min interval | 900 s | Minimum time between broadcasts | + | GPS update interval | 30 s | How often to poll GPS | + + **Pin Configuration** (should be auto-detected): + | Pin | Value | + |-----|-------| + | GPS_RX_PIN | 33 | + | GPS_TX_PIN | 34 | + | PIN_GPS_EN | 3 (V1.1) | + +5. **Configure Power Settings** + + Navigate to **Settings → Power Config**: + + | Parameter | Value | Description | + |-----------|-------|-------------| + | Wait for Bluetooth | 0 | Don't wait for BT connection | + | Super deep sleep duration | 1800 s | 30-minute deep sleep | + | Light sleep duration | 900 s | 15-minute light sleep | + | Minimum wake time | 30 s | Minimum active time | + +6. **Save and Reboot** + + Apply settings and reboot the device. + + + +## Tips for Maximum Battery Life + +1. **Use a larger battery** + - 2000-3000mAh recommended for multi-day operation + - Higher capacity = proportionally longer runtime + +2. **Optimize broadcast interval** + - Increase if tracking precision isn't critical + - 15-30 minute intervals work well for most uses + +3. **Use external antenna** + - Better signal = faster TX completion = less power + - Quality antenna reduces retransmissions + +4. **Disable unused features** + - Wi-Fi: Disable if not needed for configuration + - Bluetooth: Set timeout to 0 after configuration + +5. **Reduce GPS polling** + - 60-120 second intervals for stationary tracking + - Disable GPS entirely for relay-only nodes + +## Troubleshooting + +### Device won't enter deep sleep + + + +- Verify firmware version supports deep sleep +- Check for continuous mesh traffic +- Ensure no USB power connected (keeps device awake) + +### GPS not getting fix + +- **V1.1 hardware**: Ensure GPIO3 is HIGH (automatic in new firmware) +- Check antenna connection (IPEX connector fully seated) +- Allow 30-60 seconds for cold start fix +- Move to area with clear sky view + +### Battery draining faster than expected + +- Check if device is stuck in active mode (monitor serial output) +- Verify sleep settings were saved (check via app) +- Look for wake events in serial log +- Ensure no continuous retransmissions (poor antenna/coverage) + +## Serial Monitoring + +Monitor power states via serial console: + +```cpp +// Connect at 115200 baud +// Look for these messages: +// "Going to deep sleep for X seconds" +// "Waking from deep sleep" +// "GPS fix acquired" +// "Transmitting position" +``` + +## Source + +Based on the tutorial by ashley15 on Hackster.io, adapted for Wireless Tracker V1.1. diff --git a/site/src/content/docs/hardware/pinout.mdx b/site/src/content/docs/hardware/pinout.mdx new file mode 100644 index 0000000..12c5a66 --- /dev/null +++ b/site/src/content/docs/hardware/pinout.mdx @@ -0,0 +1,229 @@ +--- +title: Pinout Reference +description: Pin assignments and GPIO functions for the Heltec Wireless Tracker +--- + +import { Aside, Tabs, TabItem } from '@astrojs/starlight/components'; + +## Pin Map Overview + +![Wireless Tracker Pin Map](/images/datasheet/wireless-tracker-datasheet_page_6_img_1.png) + + + +## Header J2 (Left Side) + +### Power Pins + +| Pin | Name | Type | Function | +|-----|------|------|----------| +| 1 | 5V | Power | 5V power supply | +| 2 | GND | Power | Ground | +| 3 | 3V3 | Power | 3.3V output | +| 4 | GND | Power | Ground | +| 5 | 3V3 | Power | 3.3V output | +| 6 | GND | Power | Ground | +| 7 | Vext | Power | 3.3V output for TFT and GNSS | +| 8 | GND | Power | Ground | + +### GPIO Pins (J2) + +| Pin | GPIO | Type | Primary Function | Alternate Functions | +|-----|------|------|------------------|---------------------| +| 1 | RST | - | Reset button | - | +| 2 | 0 | I/O | USER button | Boot select | +| 3 | 1 | I/O | **Vbat_Read**¹ | Touch1, ADC1_CH0 | +| 4 | 2 | I/O | ADC Control | Touch2, ADC1_CH1 | +| 5 | 3 | I/O | **Vext Control**² | Touch3, ADC1_CH2 | +| 6 | 19 | I/O | USB D- | CLK_OUT2, ADC2_CH8, U1RTS | +| 7 | 20 | I | USB D+ | CLK_OUT1, ADC2_CH9, U1CTS | +| 8 | 21 | I/O | TFT backlight | - | +| 9 | 26 | I/O | General I/O | SPICS1 | +| 10 | 48 | I/O | D_SEL | - | +| 11 | 47 | I/O | Boot mode | - | +| 12 | 33 | I/O | **GNSS TX** | SPIIO4, FSPIHD | +| 13 | 34 | I/O | **GNSS RX** | SPI05, FSPICS0 | +| 14 | 35 | I/O | **GNSS RST** | SPI06, FSPID | +| 15 | 36 | I/O | **GNSS PPS** | SPI07, FSPICLK | +| 16 | 37 | I/O | General I/O | SPIDQS, FSPIQ | + + + + + +## Header J3 (Right Side) + +### GPIO Pins (J3) + +| Pin | GPIO | Type | Primary Function | Alternate Functions | +|-----|------|------|------------------|---------------------| +| 1 | 18 | I/O | **LED Control** | U1RXD, ADC2_CH7, CLK_OUT3 | +| 2 | 17 | I/O | General I/O | U1TXD, ADC2_CH6 | +| 3 | 16 | I/O | General I/O | U0CTS, ADC2_CH5, XTAL_32K_N | +| 4 | 15 | I/O | General I/O | U0RTS, ADC2_CH4, XTAL_32K_P | +| 5 | 7 | I/O | General I/O | ADC1_CH6, Touch7 | +| 6 | 6 | I/O | General I/O | ADC1_CH5, Touch6 | +| 7 | 5 | I/O | General I/O | ADC1_CH4, Touch5 | +| 8 | 4 | I/O | General I/O | ADC1_CH3, Touch4 | + +| Pin | GPIO | Type | Primary Function | Alternate Functions | +|-----|------|------|------------------|---------------------| +| 1 | 46 | I/O | **I2C SCL** | - | +| 2 | 45 | I/O | **I2C SDA** | - | +| 4 | 44 | I/O | U0RXD | Serial RX | +| 5 | 43 | I/O | U0TXD | Serial TX | +| 6 | 14 | I/O | **LoRa DIO1** | ADC2_CH3, Touch14 | +| 7 | 13 | I/O | **LoRa Busy** | ADC2_CH2, Touch13 | +| 8 | 12 | I/O | **LoRa RST** | ADC2_CH1, Touch12 | +| 9 | 11 | I/O | **LoRa MISO** | ADC2_CH0, Touch11 | +| 10 | 10 | I/O | **LoRa MOSI** | ADC1_CH9, Touch10 | +| 11 | 9 | I/O | **LoRa SCK** | ADC1_CH8, Touch9 | +| 12 | 8 | I/O | **LoRa NSS** | ADC1_CH7, Touch8, SUBSPICS1 | +| 13 | 42 | I/O | **TFT SDIN** | MTMS | +| 14 | 41 | I/O | **TFT SCLK** | MTDI | +| 15 | 40 | I/O | **TFT RS** | MTMS | +| 16 | 39 | I/O | **TFT RES** | MTMS | +| 18 | 38 | I/O | **TFT CS** | FSPIWP, SUBSPIWP | + +## Peripheral Pin Assignments + +### GNSS Module (UC6580) + +| Function | GPIO | Notes | +|----------|------|-------| +| TX | 33 | GNSS → ESP32 | +| RX | 34 | ESP32 → GNSS | +| RST | 35 | Active low reset | +| PPS | 36 | 1PPS timing output | +| Power | 3 | V1.1: HIGH to enable | + +### LoRa Module (SX1262) + +| Function | GPIO | Notes | +|----------|------|-------| +| MOSI | 10 | SPI data out | +| MISO | 11 | SPI data in | +| SCK | 9 | SPI clock | +| NSS | 8 | Chip select (active low) | +| RST | 12 | Reset | +| BUSY | 13 | Busy indicator | +| DIO1 | 14 | Interrupt | + +### TFT Display (ST7735S) + +| Function | GPIO | Notes | +|----------|------|-------| +| SDIN | 42 | SPI data | +| SCLK | 41 | SPI clock | +| RS (DC) | 40 | Data/Command | +| RES | 39 | Reset | +| CS | 38 | Chip select | +| LED_K | 21 | Backlight control | + +### I2C Bus + +| Function | GPIO | Notes | +|----------|------|-------| +| SDA | 45 | Data | +| SCL | 46 | Clock | + + + +## Code Examples + + + +```cpp +// Wireless Tracker Pin Definitions + +// GNSS (UC6580) +#define GNSS_TX_PIN 33 +#define GNSS_RX_PIN 34 +#define GNSS_RST_PIN 35 +#define GNSS_PPS_PIN 36 +#define GNSS_PWR_PIN 3 // V1.1 only + +// LoRa (SX1262) +#define LORA_MOSI_PIN 10 +#define LORA_MISO_PIN 11 +#define LORA_SCK_PIN 9 +#define LORA_NSS_PIN 8 +#define LORA_RST_PIN 12 +#define LORA_BUSY_PIN 13 +#define LORA_DIO1_PIN 14 + +// TFT Display +#define TFT_SDIN_PIN 42 +#define TFT_SCLK_PIN 41 +#define TFT_DC_PIN 40 +#define TFT_RST_PIN 39 +#define TFT_CS_PIN 38 +#define TFT_LED_PIN 21 + +// I2C +#define I2C_SDA_PIN 45 +#define I2C_SCL_PIN 46 + +// User Interface +#define USER_BTN_PIN 0 +#define LED_PIN 18 + +// Battery +#define VBAT_ADC_PIN 1 +#define VBAT_ADC_CTRL 2 +#define VEXT_CTRL_PIN 3 +``` + + +```cpp +void initGNSS() { + // Enable GNSS power (V1.1) + pinMode(GNSS_PWR_PIN, OUTPUT); + digitalWrite(GNSS_PWR_PIN, HIGH); + + // Setup GNSS serial + Serial1.begin(115200, SERIAL_8N1, GNSS_RX_PIN, GNSS_TX_PIN); +} + +void initLoRa() { + SPI.begin(LORA_SCK_PIN, LORA_MISO_PIN, LORA_MOSI_PIN, LORA_NSS_PIN); + + pinMode(LORA_RST_PIN, OUTPUT); + pinMode(LORA_BUSY_PIN, INPUT); + pinMode(LORA_DIO1_PIN, INPUT); + + // Reset LoRa module + digitalWrite(LORA_RST_PIN, LOW); + delay(10); + digitalWrite(LORA_RST_PIN, HIGH); + delay(10); +} + +void initDisplay() { + pinMode(TFT_LED_PIN, OUTPUT); + digitalWrite(TFT_LED_PIN, HIGH); // Enable backlight + + // TFT initialization via library... +} + +float readBatteryVoltage() { + pinMode(VBAT_ADC_CTRL, OUTPUT); + digitalWrite(VBAT_ADC_CTRL, LOW); + + int raw = analogRead(VBAT_ADC_PIN); + float voltage = (raw / 4095.0) * 3.3 * 4.9; + + digitalWrite(VBAT_ADC_CTRL, HIGH); + return voltage; +} +``` + + diff --git a/site/src/content/docs/hardware/power.mdx b/site/src/content/docs/hardware/power.mdx new file mode 100644 index 0000000..b33cec6 --- /dev/null +++ b/site/src/content/docs/hardware/power.mdx @@ -0,0 +1,207 @@ +--- +title: Power Management +description: Power supply options and consumption characteristics for the Wireless Tracker +--- + +import { Aside, Tabs, TabItem } from '@astrojs/starlight/components'; + +## Power Supply Options + +The Wireless Tracker supports multiple power sources with automatic switching. + + + +### Input Specifications + +| Power Mode | Min | Typical | Max | Unit | +|------------|-----|---------|-----|------| +| Type-C USB (≥500mA) | 4.7 | 5.0 | 6.0 | V | +| Lithium battery (≥250mA) | 3.3 | 3.7 | 4.2 | V | +| 5V pin (≥500mA) | 4.7 | 5.0 | 6.0 | V | +| 3V3 pin (≥150mA) | 2.7 | 3.3 | 3.5 | V | + +### Output Specifications + +| Output | Max Current | Notes | +|--------|-------------|-------| +| 3.3V Pin | 500 mA | Regulated output | +| 5V Pin | 500 mA | USB powered only | +| Vext Pin | 350 mA | Powers TFT + GNSS | + +## Power Consumption + +### By Operating Mode + +| Mode | USB Power | Battery Power | +|------|-----------|---------------| +| Wi-Fi Scanning | 100 mA | 74 mA | +| Wi-Fi Access Point | 150 mA | 111 mA | +| Bluetooth Active | 102 mA | 75 mA | +| GNSS Active | 120 mA | 89 mA | +| LoRa TX @ 14 dBm | 200 mA | 148 mA | +| LoRa TX @ 17 dBm | 220 mA | 163 mA | +| LoRa TX @ 22 dBm | 240 mA | 178 mA | +| LoRa RX Only | 80 mA | 59 mA | +| Deep Sleep | 2 mA | **15 µA** | + + + +## Battery Management + +The Wireless Tracker includes an integrated battery management system: + +- **Charging**: Automatic when USB connected with battery attached +- **Protection**: Overcharge, over-discharge, short circuit +- **Switching**: Automatic USB/battery source selection +- **Monitoring**: Battery voltage readable via GPIO1 ADC + +### Reading Battery Voltage + +```cpp +#define VBAT_ADC_PIN 1 +#define VBAT_CTRL_PIN 2 + +float getBatteryVoltage() { + // Enable ADC voltage divider + pinMode(VBAT_CTRL_PIN, OUTPUT); + digitalWrite(VBAT_CTRL_PIN, LOW); + + // Read ADC + int rawADC = analogRead(VBAT_ADC_PIN); + + // Disable voltage divider to save power + digitalWrite(VBAT_CTRL_PIN, HIGH); + + // Convert to voltage + // Formula: VBAT = ADC_Reading × (3.3V / 4095) × 4.9 + float voltage = (rawADC / 4095.0) * 3.3 * 4.9; + + return voltage; +} + +int getBatteryPercent() { + float voltage = getBatteryVoltage(); + + // Simple linear approximation + // 4.2V = 100%, 3.3V = 0% + int percent = (int)((voltage - 3.3) / (4.2 - 3.3) * 100); + + return constrain(percent, 0, 100); +} +``` + +### Battery Voltage Thresholds + +| Voltage | State | Approximate % | +|---------|-------|---------------| +| 4.20 V | Full | 100% | +| 4.00 V | High | 80% | +| 3.80 V | Medium | 50% | +| 3.60 V | Low | 20% | +| 3.40 V | Critical | 5% | +| 3.30 V | Cutoff | 0% | + +## Low Power Modes + +### Deep Sleep + +The ESP32-S3 supports ultra-low-power deep sleep mode: + +```cpp +#include "esp_sleep.h" + +void enterDeepSleep(uint64_t sleepTimeUs) { + // Disable peripherals + digitalWrite(GNSS_PWR_PIN, LOW); // V1.1 + digitalWrite(TFT_LED_PIN, LOW); + + // Configure wakeup + esp_sleep_enable_timer_wakeup(sleepTimeUs); + + // Optional: wakeup on button press + esp_sleep_enable_ext0_wakeup(GPIO_NUM_0, LOW); + + // Enter deep sleep + esp_deep_sleep_start(); +} + +void setup() { + // Check wakeup reason + esp_sleep_wakeup_cause_t reason = esp_sleep_get_wakeup_cause(); + + switch (reason) { + case ESP_SLEEP_WAKEUP_TIMER: + Serial.println("Woke from timer"); + break; + case ESP_SLEEP_WAKEUP_EXT0: + Serial.println("Woke from button"); + break; + default: + Serial.println("Normal boot"); + break; + } +} +``` + +### Light Sleep + +For faster wake with moderate power savings: + +```cpp +void enterLightSleep(uint64_t sleepTimeUs) { + esp_sleep_enable_timer_wakeup(sleepTimeUs); + esp_light_sleep_start(); + // Execution continues here after wakeup +} +``` + +## Peripheral Power Control + +### Vext Control (V1.1) + +GPIO3 controls the Vext rail that powers the TFT display and GNSS module: + +```cpp +#define VEXT_PIN 3 + +void enableVext() { + pinMode(VEXT_PIN, OUTPUT); + digitalWrite(VEXT_PIN, HIGH); +} + +void disableVext() { + digitalWrite(VEXT_PIN, LOW); +} +``` + + + +### Display Backlight + +```cpp +#define TFT_LED 21 + +void setBacklight(bool on) { + digitalWrite(TFT_LED, on ? HIGH : LOW); +} + +// PWM dimming (optional) +void setBacklightBrightness(uint8_t level) { + analogWrite(TFT_LED, level); // 0-255 +} +``` + +## Power Optimization Tips + +1. **Disable unused peripherals**: Turn off Wi-Fi, Bluetooth, GNSS when not needed +2. **Use deep sleep**: 15µA vs 74mA is a 5000× improvement +3. **Reduce LoRa TX power**: 14dBm uses 25% less current than 22dBm +4. **Lower GNSS update rate**: 1Hz vs 10Hz reduces average current +5. **PWM the display**: Dimming backlight saves significant power +6. **Batch operations**: Wake, collect data, transmit, sleep diff --git a/site/src/content/docs/hardware/schematic.mdx b/site/src/content/docs/hardware/schematic.mdx new file mode 100644 index 0000000..1eed4a2 --- /dev/null +++ b/site/src/content/docs/hardware/schematic.mdx @@ -0,0 +1,189 @@ +--- +title: Schematic Reference +description: Component reference and circuit details for the Heltec Wireless Tracker +--- + +import { Aside } from '@astrojs/starlight/components'; + +This page provides a reference to the key components and circuit blocks in the Wireless Tracker. For full schematics, see the [Downloads](/resources/downloads/) page. + +## Block Diagram + +![Hardware Resources Overview](/images/structure-chart.png) + +## Power Management + +The power section provides battery charging, voltage regulation, and power path management. + +### Components + +| Component | Value/Part | Function | +|-----------|-----------|----------| +| F1 | 6V 500mA | Input fuse | +| D1 | RSB6.8S | TVS diode (ESD protection) | +| D2 | 1N5819 | Schottky diode (reverse polarity) | +| Q1 | AO3401 | P-channel MOSFET (power switch) | +| U2 | TP4054 | Li-Po charger IC | +| U4 | CE6260B33M | 3.3V LDO (main) | +| U6 | CE6260B33M | 3.3V LDO (Vext) | +| R16 | 2K/5% | Charge current programming | + + + +### Battery Monitoring + +| Component | Value | Function | +|-----------|-------|----------| +| R13 | 390K/1% | Voltage divider (high side) | +| R14 | 100K/1% | Voltage divider (low side) | +| Q3 | S9013 | ADC enable transistor | + +Voltage divider ratio: `4.9:1` → `VBAT = ADC × 4.9` + +## ESP32-S3FN8 (U7) + +The main MCU handles all processing, connectivity, and peripheral control. + +### Crystal Oscillators + +| Component | Value | Function | +|-----------|-------|----------| +| U5 | 40 MHz | Main crystal | +| C19, C20 | 22pF | Main crystal load caps | +| X1 | 32.768 kHz | RTC crystal | +| C8, C22 | 4.7pF | RTC crystal load caps | + +### Key GPIO Assignments + +| GPIO | Function | Notes | +|------|----------|-------| +| 0 | USER_Key | Boot select / user button | +| 1 | Vbat_Read | Battery ADC input | +| 2 | ADC_Ctrl | ADC enable control | +| 3 | Vext_Ctrl | External power control (V1.1) | +| 8-14 | LoRa SPI | NSS, SCK, MOSI, MISO, RST, BUSY, DIO1 | +| 18 | LED | User LED control | +| 19/20 | USB | D-/D+ native USB | +| 21 | LED_K | TFT backlight | +| 33-36 | GNSS | TX, RX, RST, PPS | +| 38-42 | TFT | CS, RES, RS, SCLK, SDIN | + +## SX1262 LoRa Module (U12) + +The LoRa transceiver provides long-range, low-power wireless communication. + +### RF Components + +| Component | Value | Function | +|-----------|-------|----------| +| L1 | 2.7nH | RF matching | +| L2 | 24nH | RF filter | +| L3 | 2.0nH | RF matching | +| C12, C15, C18, C25 | 0.1µF | Decoupling | +| C13, C14 | 1.8pF | RF matching | +| U11 | UPG2179 | RF switch | +| X4 | 32 MHz | TCXO | +| E4 | IPEX | LoRa antenna connector | + +### SPI Interface + +| Signal | GPIO | Direction | +|--------|------|-----------| +| NSS | 8 | Output (chip select) | +| SCK | 9 | Output (clock) | +| MOSI | 10 | Output (data to SX1262) | +| MISO | 11 | Input (data from SX1262) | +| RST | 12 | Output (reset) | +| BUSY | 13 | Input (busy indicator) | +| DIO1 | 14 | Input (interrupt) | + +## UC6580 GNSS Module (U9) + +The GNSS receiver provides multi-constellation positioning with L1+L5 frequencies. + +### Crystal and Timing + +| Component | Value | Function | +|-----------|-------|----------| +| X2 | 26 MHz | Main TCXO | +| X3 | 32.768 kHz | RTC crystal | +| C34, C41 | 4.7pF | Crystal load caps | +| R27 | 10K | Reset pullup | + +### RF Frontend + +| Component | Value | Function | +|-----------|-------|----------| +| U8 | HDDL1L5RSS-B8 | L1/L5 LNA | +| U10 | SW7125DE | RF amplifier | +| E3 | IPEX | GNSS antenna connector | + +### RF Matching Network + +| Component | Value | +|-----------|-------| +| L4 | 68nH | +| L5 | 1nH | +| L6 | 2.2nH | +| L7 | 18nH | +| L9 | 6.8nH | +| L10 | 7nH | +| L11 | 4.5nH | +| EL2 | 1µH | + +### UART Interface + +| Signal | GPIO | Direction | +|--------|------|-----------| +| TX | 33 | GNSS → ESP32 | +| RX | 34 | ESP32 → GNSS | +| RST | 35 | Reset (active low) | +| PPS | 36 | 1PPS timing pulse | + +## TFT Display (U1) + +The 0.96" TFT display (ST7735S driver) provides visual feedback. + +| Signal | GPIO | Function | +|--------|------|----------| +| SDIN | 42 | SPI data | +| SCLK | 41 | SPI clock | +| RS (DC) | 40 | Data/Command select | +| RES | 39 | Reset | +| CS | 38 | Chip select | +| LED_K | 21 | Backlight (via Q4) | + +## USB Type-C (U3) + +| Pin | Signal | Notes | +|-----|--------|-------| +| VBUS | VDD_5V | 5V power input | +| DN1/DN2 | USB_N | Data negative | +| DP1/DP2 | USB_P | Data positive | +| CC1 | R3 (5.1K) | Configuration channel | +| CC2 | R6 (5.1K) | Configuration channel | + + + +## Status LEDs + +| LED | Color | Resistor | Function | +|-----|-------|----------|----------| +| LED1 | Orange | R7 (330Ω) | Charging indicator | +| LED2 | White | R10 (330Ω) | User LED (GPIO18) | + +## Buttons + +| Button | Function | GPIO | +|--------|----------|------| +| S1 | RESET_SW | RST | +| S2 | USER_SW | GPIO0 | + +## Download Links + +- [V1.0 Schematic (PDF)](https://resource.heltec.cn/download/Wireless_Tracker/Wireless_Tacker1.0/HTIT-Tracker_V0.3.pdf) +- [V1.1 Schematic (PDF)](https://resource.heltec.cn/download/Wireless_Tracker/Wireless_Tacker1.1/HTIT-Tracker_V0.5.pdf) diff --git a/site/src/content/docs/hardware/specifications.mdx b/site/src/content/docs/hardware/specifications.mdx new file mode 100644 index 0000000..6c03d08 --- /dev/null +++ b/site/src/content/docs/hardware/specifications.mdx @@ -0,0 +1,147 @@ +--- +title: Specifications +description: Complete technical specifications for the Heltec Wireless Tracker +--- + +import { Aside } from '@astrojs/starlight/components'; + +## General Specifications + +| Parameter | Value | +|-----------|-------| +| **Master Chip** | ESP32-S3FN8 (Xtensa 32-bit LX7 dual-core) | +| **LoRa Chipset** | Semtech SX1262 | +| **GNSS Chipset** | Unicore UC6580 | +| **LoRa Frequency** | 470-510 MHz (LF) / 863-928 MHz (HF) | +| **Max TX Power** | 21 ±1 dBm | +| **LoRa Sensitivity** | -135 dBm @ SF12/125kHz | +| **Wi-Fi** | 802.11 b/g/n (2.4 GHz) | +| **Bluetooth** | Bluetooth 5, BLE, Mesh | +| **Operating Temp** | -20°C to +70°C | +| **Dimensions** | 65.48 × 28.06 × 13.52 mm | + +## Interfaces + +| Interface | Description | +|-----------|-------------| +| USB | Type-C with ESD protection | +| Battery | SH1.25-2 lithium battery connector | +| LoRa Antenna | IPEX (U.FL) connector | +| GNSS Antenna | IPEX (U.FL) connector | +| Wi-Fi/BT Antenna | Onboard 2.4 GHz metal spring | +| Display | 0.96" TFT-LCD (80×160 RGB) | + +## Power Supply + + + +| Power Mode | Minimum | Typical | Maximum | Unit | +|------------|---------|---------|---------|------| +| Type-C USB (≥500mA) | 4.7 | 5.0 | 6.0 | V | +| Lithium battery (≥250mA) | 3.3 | 3.7 | 4.2 | V | +| 5V pin (≥500mA) | 4.7 | 5.0 | 6.0 | V | +| 3V3 pin (≥150mA) | 2.7 | 3.3 | 3.5 | V | + +## Power Output + +| Output Pin | Max Current | +|------------|-------------| +| 3.3V Pin | 500 mA | +| 5V Pin (USB powered only) | 500 mA | +| Vext Pin | 350 mA | + +## Power Consumption + +| Mode | USB Power | Battery Power | +|------|-----------|---------------| +| Wi-Fi Scan | 100 mA | 74 mA | +| Wi-Fi AP | 150 mA | 111 mA | +| Bluetooth | 102 mA | 75 mA | +| GNSS Active | 120 mA | 89 mA | +| LoRa TX 14 dBm | 200 mA | 148 mA | +| LoRa TX 17 dBm | 220 mA | 163 mA | +| LoRa TX 22 dBm | 240 mA | 178 mA | +| LoRa RX | 80 mA | 59 mA | +| Deep Sleep | 2 mA | 15 µA | + + + +## LoRa RF Specifications + +### Transmit Power + +| Frequency Band | Max Power | +|----------------|-----------| +| 470-510 MHz | 21 ±1 dBm | +| 867-870 MHz | 21 ±1 dBm | +| 902-928 MHz | 21 ±1 dBm | + +### Receiver Sensitivity + +| Bandwidth | Spreading Factor | Sensitivity | +|-----------|------------------|-------------| +| 125 kHz | SF12 | -135 dBm | +| 125 kHz | SF10 | -130 dBm | +| 125 kHz | SF7 | -124 dBm | + +### Regional Frequencies + +| Region | Frequency (MHz) | Model | +|--------|-----------------|-------| +| EU433 | 433.175-434.665 | Wireless Tracker-LF | +| CN470 | 470-510 | Wireless Tracker-LF | +| IN868 | 865-867 | Wireless Tracker-HF | +| EU868 | 863-870 | Wireless Tracker-HF | +| US915 | 902-928 | Wireless Tracker-HF | +| AU915 | 915-928 | Wireless Tracker-HF | +| KR920 | 920-923 | Wireless Tracker-HF | +| AS923 | 920-925 | Wireless Tracker-HF | + +## GNSS Specifications + +### Basic Information + +| Parameter | Value | +|-----------|-------| +| Channels | 96 | +| Update Rate | Up to 10 Hz | +| Data Format | NMEA-0183, Unicore, RTCM 3.x | +| Frequency Points | GPS L1+L5, BDS B2a, GLONASS G1, Galileo E1+E5a, QZSS L1+L5, SBAS L1, NAVIC L5* | + +*NAVIC L5 requires specific firmware + +### Position Accuracy + +| Parameter | Value | +|-----------|-------| +| Horizontal (RMS) | 1.5 m | +| Vertical (RMS) | 2.5 m | +| Time (RMS) | 5 ns | +| Speed | 0.02 m/s | + +### Time to First Fix (TTFF) + +| Mode | Time | +|------|------| +| Cold Start | < 26 s | +| Warm Start | < 2 s | +| Recapture | 1 s | + +### Sensitivity by System + +| Sensitivity | GNSS | BDS | GPS | Galileo | GLONASS | +|-------------|------|-----|-----|---------|---------| +| Cold Start | -148 | -146 | -148 | -144 | -144 dBm | +| Warm Start | -156 | -155 | -155 | -154 | -148 dBm | +| Tracking | -165 | -163 | -165 | -163 | -158 dBm | +| Recapture | -156 | -154 | -156 | -154 | -152 dBm | + +## Physical Dimensions + +![Physical Dimensions](/images/datasheet/wireless-tracker-datasheet_page_16_img_1.png) + +Dimensions: **65.48 × 28.06 × 13.52 mm** diff --git a/site/src/content/docs/index.mdx b/site/src/content/docs/index.mdx new file mode 100644 index 0000000..9017ebf --- /dev/null +++ b/site/src/content/docs/index.mdx @@ -0,0 +1,71 @@ +--- +title: Heltec Wireless Tracker +description: Documentation for the Heltec Wireless Tracker ESP32-S3FN8 development kit +template: splash +hero: + tagline: A compact development kit combining ESP32-S3, LoRa, and multi-constellation GNSS for IoT tracking applications + image: + file: ../../assets/tracker-icon.svg + actions: + - text: Get Started + link: /getting-started/overview/ + icon: right-arrow + variant: primary + - text: View Pinout + link: /hardware/pinout/ + icon: external +--- + +import { Card, CardGrid, LinkCard } from '@astrojs/starlight/components'; + +## What is the Wireless Tracker? + +The **Heltec Wireless Tracker** is a development kit based on the ESP32-S3FN8 that integrates: + +- **SX1262** LoRa transceiver for long-range, low-power communication +- **UC6580** GNSS module with L1+L5 dual-frequency positioning +- **0.96" TFT display** for status and debugging +- **Lithium battery management** with charging and protection + + + + Supports GPS, GLONASS, BDS, Galileo, NAVIC, and QZSS for fast, accurate positioning anywhere in the world. + + + Compatible with EU868, US915, AU915, AS923, and other regional LoRaWAN frequencies for global deployment. + + + 22nm technology enables sleep currents as low as 15µA on battery power for extended field operation. + + + Works with Meshtastic firmware for decentralized off-grid mesh networking. + + + +## Hardware Variants + +| Model | Frequency Range | Use Case | +|-------|-----------------|----------| +| **Wireless Tracker-LF** | 470-510 MHz | China mainland (CN470) | +| **Wireless Tracker-HF** | 863-928 MHz | EU868, US915, AU915, AS923, KR920 | + +:::caution[Hardware Version] +The V1.1 hardware revision changed GNSS power control to GPIO3. Check [Hardware Versions](/getting-started/hardware-versions/) for compatibility details. +::: + +## Quick Links + + + + + + + + +## Popular Guides + + + + + + diff --git a/site/src/content/docs/reference/faq.mdx b/site/src/content/docs/reference/faq.mdx new file mode 100644 index 0000000..9f2c141 --- /dev/null +++ b/site/src/content/docs/reference/faq.mdx @@ -0,0 +1,212 @@ +--- +title: Frequently Asked Questions +description: Common questions and solutions for the Heltec Wireless Tracker +--- + +import { Aside } from '@astrojs/starlight/components'; + +## Bootloader & Programming + +### How do I enter boot mode manually? + +The Wireless Tracker uses ESP32-S3's internal USB, which may fail to enter bootloader mode in certain situations. To manually enter boot mode: + +**Device not connected:** +1. Press and hold the `USER` button +2. Connect the USB cable +3. Release `USER` button + +**Device already connected:** +1. Hold `USER` button +2. Press `RESET` button +3. Release `RESET` button +4. Release `USER` button + + + +### Why can't I upload code? + +Common causes: +1. Wrong board selected in IDE +2. Device not in bootloader mode +3. Serial port driver issues +4. Another program has the port open + +**Solutions:** +1. Select "Heltec Wireless Tracker" in board manager +2. Use manual boot mode entry (see above) +3. Install CP210x or CH340 drivers if needed +4. Close serial monitor before uploading + +## Hardware Versions + +### What are the key differences between V1.0 and V1.1? + +| Feature | V1.0 | V1.1 | +|---------|------|------| +| GNSS Power | Shared rail | Dedicated LDO | +| GNSS Control | Always on | GPIO3 (HIGH = enabled) | +| Power Isolation | Limited | Improved | +| Sleep Current | ~25 µA | ~15 µA | + + + +### How do I identify my hardware version? + +1. **Physical marking**: Look for version marking on PCB near USB connector +2. **Programmatic detection**: V1.1 has GNSS tied to GPIO3 control + +```cpp +// Simple test - if GNSS works after this, it's V1.1 +pinMode(3, OUTPUT); +digitalWrite(3, HIGH); +``` + +## Meshtastic + +### Why isn't Meshtastic firmware working on V1.1? + +The V1.1 hardware changed the GNSS power control pin to GPIO3. Older Meshtastic firmware didn't know about this change. + +**Solution:** +- Use **Meshtastic 2.2.17 Beta or later** (auto-detects version) +- Or use temporary Heltec firmware: `device-install.bat -f firmware.factory.bin` + +### Device shows "No GPS" in Meshtastic + +1. **V1.1 hardware**: Ensure you're using compatible firmware +2. **Antenna**: Check GNSS antenna is connected (IPEX connector) +3. **Location**: Move outdoors with clear sky view +4. **Cold start**: Allow 30-60 seconds for initial fix + +## Display Issues + +### Why is my screen not displaying? + +**When running LoRa/LoRaWAN code:** +1. Check serial output for errors +2. Press RST button +3. Verify device activation via licensing docs + +**When running Meshtastic:** +1. Confirm correct firmware version for your hardware +2. Check display settings in Meshtastic app +3. Verify backlight pin (GPIO21) is enabled + +### Screen shows garbage or artifacts + +1. Check TFT library version compatibility +2. Verify SPI pin configuration +3. Try reducing SPI clock speed +4. Check power supply stability + +## Power & Battery + +### How do I read battery voltage? + +```cpp +#define VBAT_ADC_PIN 1 +#define VBAT_CTRL_PIN 2 + +float readBattery() { + pinMode(VBAT_CTRL_PIN, OUTPUT); + digitalWrite(VBAT_CTRL_PIN, LOW); // Enable divider + + int raw = analogRead(VBAT_ADC_PIN); + + digitalWrite(VBAT_CTRL_PIN, HIGH); // Disable to save power + + // VBAT = ADC * 4.9 + return (raw / 4095.0) * 3.3 * 4.9; +} +``` + +### Device won't charge + +1. Verify USB cable supports data+power (not charge-only) +2. Check battery polarity (red=positive) +3. Battery may be deeply discharged - leave connected for 30 min +4. Check charging LED (orange when charging) + +### High sleep current consumption + +1. **V1.1**: Set GPIO3 LOW to disable GNSS in sleep +2. Disable display backlight (GPIO21 LOW) +3. Disable WiFi/BT before sleep +4. Use `esp_deep_sleep_start()` not light sleep + +## GPS/GNSS + +### GPS won't get a fix + +1. **Antenna**: Ensure IPEX antenna is connected securely +2. **Power (V1.1)**: Set GPIO3 HIGH to enable GNSS +3. **Location**: Clear sky view required, move away from buildings +4. **Time**: Cold start takes up to 26 seconds +5. **Interference**: Move away from other electronics + +### GPS accuracy is poor + +1. Allow time for multi-constellation acquisition +2. Use external active antenna for better signal +3. Check if all GNSS systems are enabled (`$CFGSYS,H11`) +4. Verify antenna has clear sky view (not just outdoors) + +## LoRa + +### No LoRa communication + +1. Verify antenna is connected (IPEX connector on LoRa port) +2. Check frequency matches between devices +3. Verify regional settings are correct +4. Increase spreading factor for longer range + +### LoRaWAN join fails + +1. Double-check DevEUI, AppEUI, AppKey +2. Verify gateway is online and in range +3. Check frequency plan matches network server +4. Try increasing TX power or SF + +### Short range + +1. Use higher spreading factor (SF10-SF12) +2. Check antenna connection and orientation +3. Verify TX power settings +4. Consider terrain and obstacles + +## Software + +### "Board not found" in Arduino IDE + +1. Add Heltec board URL to preferences: + ``` + https://resource.heltec.cn/download/package_heltec_esp32_index.json + ``` +2. Install "Heltec ESP32 Series Dev-boards" from Boards Manager +3. Select "Wireless Tracker" from board menu + +### Library conflicts + +The Heltec library may conflict with generic ESP32 libraries. Solutions: +1. Use Heltec-specific library versions +2. Remove duplicate libraries from Arduino/libraries folder +3. Use PlatformIO with explicit lib_deps + +### Memory issues (sketch too large) + +1. Use minimal partition scheme +2. Enable PSRAM if available +3. Reduce debug output +4. Use release build (-O2 optimization) + +## Resources + +- [Heltec Wiki](https://wiki.heltec.org) +- [Heltec GitHub](https://github.com/Heltec-Aaron-Lee/WiFi_Kit_series) +- [Meshtastic Documentation](https://meshtastic.org/docs/) +- [Downloads Page](/resources/downloads/) diff --git a/site/src/content/docs/reference/gnss-protocol.mdx b/site/src/content/docs/reference/gnss-protocol.mdx new file mode 100644 index 0000000..842e853 --- /dev/null +++ b/site/src/content/docs/reference/gnss-protocol.mdx @@ -0,0 +1,301 @@ +--- +title: GNSS Protocol Reference +description: UC6580 GNSS module command reference for the Wireless Tracker +--- + +import { Aside, Tabs, TabItem } from '@astrojs/starlight/components'; + +The Wireless Tracker uses the Unicore UC6580 GNSS module, which communicates via the Unicore protocol (compatible with NMEA-0183). This page covers the most commonly used commands. + + + +## Serial Configuration + +| Parameter | Value | +|-----------|-------| +| Default Baud | 115200 | +| Data Bits | 8 | +| Parity | None | +| Stop Bits | 1 | +| GPIO TX | 33 (GNSS → ESP32) | +| GPIO RX | 34 (ESP32 → GNSS) | + +## Message Format + +All messages follow this format: + +``` +$MSGNAME,data1,data2,data3,...[*CC]\r\n +``` + +- `$` - Message start +- `MSGNAME` - Command name +- `,` - Parameter separator +- `*CC` - Optional checksum (XOR of all characters between `$` and `*`) +- `\r\n` - Message terminator + +## Common Commands + +### PDTINFO - Product Information + +Query device information: + +``` +$PDTINFO +``` + +Response: +``` +$PDTINFO,UC6580,G1B1,V4.1,R3.4.0.19,080101000001,000101114303845 +``` + +| Field | Description | +|-------|-------------| +| pdtName | Product name | +| config | Configuration | +| hwVer | Hardware version | +| fwVer | Firmware version | +| PN | Product number | +| SN | Serial number | + +### RESET - Receiver Reset + +``` +$RESET,type,clrMask +``` + +| clrMask | Start Type | +|---------|------------| +| h00 | Hot start | +| h01 | Warm start | +| h85 | Cold start | + +Example (cold start): +``` +$RESET,0,h85 +``` + +### CFGPRT - Port Configuration + +Query current port: +``` +$CFGPRT +``` + +Set port configuration: +``` +$CFGPRT,portID,addr,baud,inProto,outProto +``` + +| Parameter | Description | +|-----------|-------------| +| portID | 1 = UART1, 2 = UART2 | +| addr | Always h0 | +| baud | 9600, 115200, 230400, 460800 | +| inProto | Input protocol mask | +| outProto | Output protocol mask | + +### CFGMSG - Message Output Configuration + +Enable/disable specific messages: + +``` +$CFGMSG,msgClass,msgID,switch +``` + +| Message | Class | ID | Switch | +|---------|-------|----|--------| +| GGA | 0 | 0 | 0=off, 1=on | +| GLL | 0 | 1 | 0=off, 1=on | +| GSA | 0 | 2 | 0=off, 1=on | +| GSV | 0 | 3 | 0=off, 1=on | +| RMC | 0 | 4 | 0=off, 1=on | +| VTG | 0 | 5 | 0=off, 1=on | +| ZDA | 0 | 6 | 0=off, 1=on | +| GST | 0 | 7 | 0=off, 1=on | + +Example (enable GGA): +``` +$CFGMSG,0,0,1 +``` + +### CFGSYS - Satellite System Configuration + +``` +$CFGSYS,sysMask +``` + +| sysMask | Systems | +|---------|---------| +| H01 | GPS+SBAS+QZSS | +| H10 | BDS only | +| H11 | GPS+BDS+Galileo+SBAS+QZSS | +| H101 | GPS+GLONASS+Galileo+SBAS+QZSS | + +### CFGSAVE - Save Configuration + +Save current settings to flash: + +``` +$CFGSAVE +``` + + + +## NMEA Output Messages + +### GGA - Position Fix + +``` +$GPGGA,time,lat,N,lon,E,quality,numSV,HDOP,alt,M,sep,M,diffAge,diffStation*cs +``` + +| Field | Description | +|-------|-------------| +| time | UTC time (hhmmss.ss) | +| lat | Latitude (ddmm.mmmmm) | +| N/S | North/South indicator | +| lon | Longitude (dddmm.mmmmm) | +| E/W | East/West indicator | +| quality | 0=invalid, 1=GPS, 2=DGPS | +| numSV | Number of satellites | +| HDOP | Horizontal dilution | +| alt | Altitude (meters) | + +### RMC - Recommended Minimum + +``` +$GPRMC,time,status,lat,N,lon,E,speed,course,date,magVar,magE,mode*cs +``` + +| Field | Description | +|-------|-------------| +| time | UTC time | +| status | A=valid, V=invalid | +| speed | Speed over ground (knots) | +| course | Course over ground (degrees) | +| date | UTC date (ddmmyy) | + +### GSV - Satellites in View + +``` +$GPGSV,numMsg,msgNum,numSV,prn1,elv1,az1,snr1,...*cs +``` + +Reports visible satellites with: +- PRN number +- Elevation angle (0-90°) +- Azimuth (0-359°) +- Signal-to-noise ratio (dB-Hz) + +## ESP32 Code Examples + + + +```cpp +#include + +HardwareSerial GNSS(1); + +void setup() { + Serial.begin(115200); + + // Enable GNSS power (V1.1) + pinMode(3, OUTPUT); + digitalWrite(3, HIGH); + delay(100); + + // Initialize GNSS serial + GNSS.begin(115200, SERIAL_8N1, 33, 34); + + Serial.println("GNSS initialized"); +} + +void loop() { + while (GNSS.available()) { + char c = GNSS.read(); + Serial.write(c); + } +} +``` + + +```cpp +void sendGNSSCommand(const char* cmd) { + // Calculate checksum + uint8_t checksum = 0; + for (int i = 1; cmd[i] != '\0' && cmd[i] != '*'; i++) { + checksum ^= cmd[i]; + } + + // Send command with checksum + GNSS.printf("%s*%02X\r\n", cmd, checksum); +} + +void configureGNSS() { + // Enable all GNSS systems + sendGNSSCommand("$CFGSYS,H11"); + delay(100); + + // Enable GGA and RMC at 1Hz + sendGNSSCommand("$CFGMSG,0,0,1"); + sendGNSSCommand("$CFGMSG,0,4,1"); + delay(100); + + // Save configuration + sendGNSSCommand("$CFGSAVE"); +} +``` + + +```cpp +#include + +TinyGPSPlus gps; + +void loop() { + while (GNSS.available()) { + if (gps.encode(GNSS.read())) { + if (gps.location.isValid()) { + Serial.printf("Lat: %.6f, Lon: %.6f\n", + gps.location.lat(), + gps.location.lng()); + Serial.printf("Satellites: %d\n", + gps.satellites.value()); + Serial.printf("HDOP: %.2f\n", + gps.hdop.hdop()); + } + } + } +} +``` + + + +## Position Accuracy + +| Parameter | Value | +|-----------|-------| +| Horizontal (RMS) | 1.5 m | +| Vertical (RMS) | 2.5 m | +| Time (RMS) | 5 ns | +| Velocity | 0.02 m/s | + +## Time to First Fix + +| Mode | Time | +|------|------| +| Cold Start | < 26 s | +| Warm Start | < 2 s | +| Recapture | 1 s | + +## Sensitivity + +| Mode | GPS | BDS | Galileo | GLONASS | +|------|-----|-----|---------|---------| +| Cold Start | -148 dBm | -146 dBm | -144 dBm | -144 dBm | +| Tracking | -165 dBm | -163 dBm | -163 dBm | -158 dBm | diff --git a/site/src/content/docs/reference/lora-frequencies.mdx b/site/src/content/docs/reference/lora-frequencies.mdx new file mode 100644 index 0000000..7f6e3da --- /dev/null +++ b/site/src/content/docs/reference/lora-frequencies.mdx @@ -0,0 +1,220 @@ +--- +title: LoRa Frequency Reference +description: Regional frequency allocations and channel configurations for the Wireless Tracker +--- + +import { Aside } from '@astrojs/starlight/components'; + +The Wireless Tracker supports multiple regional frequency plans. Choose the correct model and configuration for your location. + +## Product Models + +| Model | Frequency Range | Regions | +|-------|-----------------|---------| +| **Wireless Tracker-LF** | 470-510 MHz | China (CN470), EU433 | +| **Wireless Tracker-HF** | 863-928 MHz | EU868, US915, AU915, AS923, KR920, IN865 | + + + +## Regional Specifications + +### EU868 (Europe) + +| Parameter | Value | +|-----------|-------| +| Frequency Range | 863-870 MHz | +| Default Channels | 868.1, 868.3, 868.5 MHz | +| Max TX Power | +14 dBm (25 mW) ERP | +| Duty Cycle | 1% (36 sec/hour) | +| Listen Before Talk | Required for some bands | + +**Channel Plan:** +| Channel | Frequency | Duty Cycle | +|---------|-----------|------------| +| 0 | 868.1 MHz | 1% | +| 1 | 868.3 MHz | 1% | +| 2 | 868.5 MHz | 1% | +| 3-7 | User defined | Varies | + +### US915 (North America) + +| Parameter | Value | +|-----------|-------| +| Frequency Range | 902-928 MHz | +| Uplink Channels | 64 (125 kHz) + 8 (500 kHz) | +| Downlink Channels | 8 (500 kHz) | +| Max TX Power | +30 dBm (1 W) EIRP | +| Duty Cycle | None (FCC Part 15) | + +**Sub-Band Configuration:** + +Most networks (TTN, Helium) use Sub-Band 2 (FSB2): + +| Sub-Band | Channels | Frequencies | +|----------|----------|-------------| +| FSB1 | 0-7 | 902.3-903.7 MHz | +| **FSB2** | 8-15 | 903.9-905.3 MHz | +| FSB3 | 16-23 | 905.5-906.9 MHz | +| FSB4 | 24-31 | 907.1-908.5 MHz | +| FSB5 | 32-39 | 908.7-910.1 MHz | +| FSB6 | 40-47 | 910.3-911.7 MHz | +| FSB7 | 48-55 | 911.9-913.3 MHz | +| FSB8 | 56-63 | 913.5-914.9 MHz | + +**Channel Mask for FSB2:** +```cpp +uint16_t userChannelsMask[6] = { 0xFF00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }; +``` + +### AU915 (Australia) + +| Parameter | Value | +|-----------|-------| +| Frequency Range | 915-928 MHz | +| Uplink Channels | 64 (125 kHz) + 8 (500 kHz) | +| Max TX Power | +30 dBm EIRP | +| Duty Cycle | None | + +Similar to US915 but with different default sub-band. TTN Australia uses FSB2. + +### AS923 (Asia) + +| Parameter | Value | +|-----------|-------| +| Frequency Range | 920-925 MHz | +| Default Channels | 923.2, 923.4 MHz | +| Max TX Power | +16 dBm (varies by country) | +| Dwell Time | 400 ms max | + +**AS923 Sub-types:** +| Variant | Countries | +|---------|-----------| +| AS923-1 | Japan, Singapore, Indonesia | +| AS923-2 | Vietnam, Malaysia | +| AS923-3 | Philippines | +| AS923-4 | Israel | + +### CN470 (China) + +| Parameter | Value | +|-----------|-------| +| Frequency Range | 470-510 MHz | +| Uplink Channels | 96 | +| Max TX Power | +17 dBm | +| Model Required | Wireless Tracker-LF | + + + +### KR920 (South Korea) + +| Parameter | Value | +|-----------|-------| +| Frequency Range | 920-923 MHz | +| Channels | 920.9, 921.1, 921.3, 921.5, 921.7, 921.9 MHz | +| Max TX Power | +14 dBm | +| Listen Before Talk | Required | + +### IN865 (India) + +| Parameter | Value | +|-----------|-------| +| Frequency Range | 865-867 MHz | +| Channels | 865.0625, 865.4025, 865.985 MHz | +| Max TX Power | +30 dBm EIRP | +| Duty Cycle | None | + +## SX1262 RF Specifications + +### Transmit Power + +| Frequency Band | Max Power | +|----------------|-----------| +| 470-510 MHz | 21 ±1 dBm | +| 867-870 MHz | 21 ±1 dBm | +| 902-928 MHz | 21 ±1 dBm | + +### Receiver Sensitivity + +| Bandwidth | Spreading Factor | Sensitivity | +|-----------|------------------|-------------| +| 125 kHz | SF12 | -135 dBm | +| 125 kHz | SF10 | -130 dBm | +| 125 kHz | SF7 | -124 dBm | +| 250 kHz | SF7 | -121 dBm | +| 500 kHz | SF7 | -118 dBm | + +## Data Rate Configuration + +### EU868 Data Rates + +| DR | Config | Bit Rate | Max Payload | +|----|--------|----------|-------------| +| 0 | SF12/125 | 250 bps | 59 bytes | +| 1 | SF11/125 | 440 bps | 59 bytes | +| 2 | SF10/125 | 980 bps | 59 bytes | +| 3 | SF9/125 | 1760 bps | 123 bytes | +| 4 | SF8/125 | 3125 bps | 230 bytes | +| 5 | SF7/125 | 5470 bps | 230 bytes | +| 6 | SF7/250 | 11000 bps | 230 bytes | + +### US915 Data Rates + +| DR | Config | Bit Rate | Max Payload | +|----|--------|----------|-------------| +| 0 | SF10/125 | 980 bps | 19 bytes | +| 1 | SF9/125 | 1760 bps | 61 bytes | +| 2 | SF8/125 | 3125 bps | 133 bytes | +| 3 | SF7/125 | 5470 bps | 250 bytes | +| 4 | SF8/500 | 12500 bps | 250 bytes | + +## Code Configuration + +### Setting Region in Firmware + +```cpp +#include "LoRaWan_APP.h" + +// Choose your region +LoRaMacRegion_t loraWanRegion = LORAMAC_REGION_EU868; +// Other options: +// LORAMAC_REGION_US915 +// LORAMAC_REGION_AU915 +// LORAMAC_REGION_AS923 +// LORAMAC_REGION_CN470 +// LORAMAC_REGION_KR920 +// LORAMAC_REGION_IN865 +``` + +### Channel Mask Examples + +```cpp +// EU868 - Default 3 channels +uint16_t userChannelsMask[6] = { 0x00FF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }; + +// US915 FSB1 (channels 0-7) +uint16_t userChannelsMask[6] = { 0x00FF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }; + +// US915 FSB2 (channels 8-15) - TTN default +uint16_t userChannelsMask[6] = { 0xFF00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }; + +// AU915 FSB2 +uint16_t userChannelsMask[6] = { 0xFF00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 }; +``` + +## Range Estimation + +Approximate line-of-sight ranges: + +| Environment | SF7 | SF12 | +|-------------|-----|------| +| Urban | 2 km | 5 km | +| Suburban | 5 km | 10 km | +| Rural | 10 km | 15+ km | + + diff --git a/site/src/content/docs/resources/downloads.mdx b/site/src/content/docs/resources/downloads.mdx new file mode 100644 index 0000000..aa3f491 --- /dev/null +++ b/site/src/content/docs/resources/downloads.mdx @@ -0,0 +1,175 @@ +--- +title: Downloads & Resources +description: Datasheets, schematics, firmware, and tools for the Heltec Wireless Tracker +--- + +import { Card, CardGrid, LinkCard } from '@astrojs/starlight/components'; + +## Official Documentation + + + + + + + + +## Legacy Hardware (V1.0) + + + + + + +## Firmware & Software + +### Development Tools + + + + + + + +### Meshtastic + + + + + + +## Arduino IDE Setup + +### Board Manager URL + +Add this URL to **File → Preferences → Additional Board Manager URLs**: + +``` +https://resource.heltec.cn/download/package_heltec_esp32_index.json +``` + +### Library Installation + +1. Open **Sketch → Include Library → Manage Libraries** +2. Search "Heltec ESP32" +3. Install "Heltec ESP32 Dev-Boards" + +### Board Selection + +**Tools → Board → Heltec ESP32 Series Dev-boards → Wireless Tracker** + +## PlatformIO Configuration + +```ini +[env:heltec_wireless_tracker] +platform = espressif32 +board = heltec_wireless_tracker +framework = arduino +monitor_speed = 115200 +lib_deps = + heltec-automation/Heltec ESP32 Dev-Boards +``` + +## Useful Links + +### Heltec Resources + +| Resource | Link | +|----------|------| +| Heltec Wiki | [wiki.heltec.org](https://wiki.heltec.org) | +| Product Page | [heltec.org/project/wireless-tracker](https://heltec.org/project/wireless-tracker/) | +| Support Email | support@heltec.cn | +| Technical Forum | [community.heltec.cn](https://community.heltec.cn/) | + +### Community Projects + +| Project | Description | +|---------|-------------| +| [Meshtastic](https://meshtastic.org) | Off-grid mesh networking | +| [SnapEmu](https://snapemu.com) | LoRaWAN testing platform | +| [TTN](https://www.thethingsnetwork.org) | The Things Network | + +### ESP32-S3 Resources + +| Resource | Link | +|----------|------| +| ESP32-S3 Datasheet | [espressif.com](https://www.espressif.com/en/products/socs/esp32-s3) | +| ESP-IDF Documentation | [docs.espressif.com](https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/) | +| Arduino-ESP32 | [github.com/espressif/arduino-esp32](https://github.com/espressif/arduino-esp32) | + +### LoRa Resources + +| Resource | Link | +|----------|------| +| SX1262 Datasheet | [semtech.com](https://www.semtech.com/products/wireless-rf/lora-connect/sx1262) | +| LoRaWAN Specification | [lora-alliance.org](https://lora-alliance.org/resource-hub/) | +| RadioLib Library | [github.com/jgromes/RadioLib](https://github.com/jgromes/RadioLib) | + +### GNSS Resources + +| Resource | Link | +|----------|------| +| UC6580 Documentation | [unicorecomm.com](https://www.unicorecomm.com/) | +| TinyGPS++ Library | [github.com/mikalhart/TinyGPSPlus](https://github.com/mikalhart/TinyGPSPlus) | +| NMEA Reference | [nmea.org](https://www.nmea.org/) | + +## Drivers + +If your device isn't recognized, you may need USB drivers: + +| Driver | For | +|--------|-----| +| [CP210x](https://www.silabs.com/developers/usb-to-uart-bridge-vcp-drivers) | Silicon Labs USB-UART | +| [CH340](http://www.wch-ic.com/downloads/CH341SER_ZIP.html) | WCH USB-UART | + +The Wireless Tracker uses the ESP32-S3's native USB, so drivers are usually not required on modern operating systems. + +## Licensing + +All Heltec documentation is © Chengdu Heltec Automation Technology Co., Ltd. + +Non-commercial use (personal download and printing) is permitted. Commercial use requires written permission from Heltec. diff --git a/site/src/styles/custom.css b/site/src/styles/custom.css new file mode 100644 index 0000000..de4da1d --- /dev/null +++ b/site/src/styles/custom.css @@ -0,0 +1,91 @@ +/* Custom styles for Heltec Wireless Tracker documentation */ + +/* Hardware version badge colors */ +:root { + --sl-color-accent-low: #1e3a5f; + --sl-color-accent: #3b82f6; + --sl-color-accent-high: #93c5fd; +} + +/* V1.0 vs V1.1 callout styling */ +.hardware-v10 { + border-left: 4px solid #f59e0b; + background: rgba(245, 158, 11, 0.1); +} + +.hardware-v11 { + border-left: 4px solid #10b981; + background: rgba(16, 185, 129, 0.1); +} + +/* Pin table styling */ +table.pin-table { + font-size: 0.875rem; +} + +table.pin-table th { + background: var(--sl-color-gray-6); +} + +table.pin-table tr:hover { + background: var(--sl-color-gray-7); +} + +/* Code block improvements */ +.expressive-code pre { + border-radius: 8px; +} + +/* Product feature cards */ +.feature-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + gap: 1rem; + margin: 1.5rem 0; +} + +.feature-card { + padding: 1rem; + border: 1px solid var(--sl-color-gray-5); + border-radius: 8px; + background: var(--sl-color-gray-7); +} + +.feature-card h4 { + margin-top: 0; + color: var(--sl-color-accent); +} + +/* Specification tables */ +.spec-table { + width: 100%; +} + +.spec-table td:first-child { + font-weight: 600; + width: 40%; +} + +/* Image zoom hint */ +img[src*="pinout"], +img[src*="schematic"] { + cursor: zoom-in; + transition: transform 0.2s ease; +} + +img[src*="pinout"]:hover, +img[src*="schematic"]:hover { + transform: scale(1.02); +} + +/* Mobile responsiveness for pin tables */ +@media (max-width: 640px) { + table.pin-table { + font-size: 0.75rem; + } + + table.pin-table td, + table.pin-table th { + padding: 0.25rem 0.5rem; + } +} diff --git a/site/tsconfig.json b/site/tsconfig.json new file mode 100644 index 0000000..8bf91d3 --- /dev/null +++ b/site/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "astro/tsconfigs/strict", + "include": [".astro/types.d.ts", "**/*"], + "exclude": ["dist"] +}