From f5421a1f21266753e79fb587595d9cda2b372785 Mon Sep 17 00:00:00 2001 From: Raika Furude Date: Sat, 18 Oct 2025 18:12:55 -0400 Subject: [PATCH] added readme --- README.md | 523 +++++++++++++++++++++++++++ install_vitallink.sh | 621 -------------------------------- vitallink/logs/backend.log | 699 +++++++++++++++++++++++++++++++++++++ 3 files changed, 1222 insertions(+), 621 deletions(-) create mode 100644 README.md delete mode 100755 install_vitallink.sh diff --git a/README.md b/README.md new file mode 100644 index 0000000..702fdac --- /dev/null +++ b/README.md @@ -0,0 +1,523 @@ +# VitalLink - Emergency Room Patient Monitoring System + +**A comprehensive IoT-based patient monitoring system using smart wristbands for emergency department triage and real-time vital signs tracking.** + +--- + +## 🎯 Project Overview + +VitalLink is an intelligent ER patient monitoring system that uses smart wristbands to continuously track patient vital signs and automatically prioritize care based on real-time health data. The system supports both physical BLE wristbands and simulated devices for testing and demonstration. + +### Key Features +- ✅ **Real-time vital sign monitoring** (Heart Rate, SpO₂, Temperature, Activity) +- ✅ **Automatic patient prioritization** based on condition severity +- ✅ **Three-tier alert system** (Normal, Alert, Emergency) +- ✅ **Self-service check-in kiosk** for patient registration +- ✅ **Staff monitoring dashboard** with live updates +- ✅ **Mixed real/simulated wristbands** for flexible testing +- ✅ **Bluetooth Low Energy (BLE)** communication protocol +- ✅ **Dynamic queue management** with priority scoring + +--- + +## 📁 Project Structure +``` +vitallink/ +├── backend/ # Backend API Server +│ └── server.py # FastAPI REST API + WebSocket server +│ +├── simulator/ # Wristband Management System +│ ├── wristband_simulator.py # Original standalone simulator +│ ├── wristband_manager.py # Unified wristband manager (real + simulated) +│ ├── config_system.py # Configuration management & CLI tools +│ ├── main_runner.py # Main system orchestrator +│ └── wristband_config.yaml # Wristband inventory configuration +│ +├── frontend/ # Web User Interfaces +│ ├── dashboard/ # Staff Monitoring Dashboard (React + Vite) +│ │ ├── src/ +│ │ │ ├── App.jsx # Main dashboard component +│ │ │ └── index.css # Tailwind CSS imports +│ │ ├── index.html # HTML entry point +│ │ └── package.json # NPM dependencies +│ │ +│ └── kiosk/ # Patient Check-in Kiosk (React + Vite) +│ ├── src/ +│ │ ├── App.jsx # Check-in interface component +│ │ └── index.css # Tailwind CSS imports +│ ├── index.html # HTML entry point +│ └── package.json # NPM dependencies +│ +├── tests/ # Test Suite +│ └── test_suite.py # Comprehensive system tests +│ +├── logs/ # System Logs (auto-generated) +│ ├── backend.log +│ ├── wristbands.log +│ ├── dashboard.log +│ └── kiosk.log +│ +├── .venv/ # Python virtual environment (UV) +├── requirements.txt # Python dependencies +├── start_everything.sh # Master startup script +├── stop_everything.sh # Master shutdown script +└── README.md # This file +``` + +--- + +## 🔄 System Architecture & Data Flow +``` +┌─────────────────────────────────────────────────────────────────┐ +│ PATIENT CHECK-IN FLOW │ +└─────────────────────────────────────────────────────────────────┘ + + 1. Patient arrives at ER + ↓ + 2. Self-service kiosk (http://localhost:5174) + - Enter personal info + - Select symptoms + - Rate severity + ↓ + 3. Backend API assigns patient ID + wristband ID + ↓ + 4. Wristband Manager detects new patient + ↓ + 5. Auto-assigns wristband (prefers real over simulated) + ↓ + 6. Starts monitoring vital signs + + +┌─────────────────────────────────────────────────────────────────┐ +│ DATA MONITORING FLOW │ +└─────────────────────────────────────────────────────────────────┘ + + Wristband (Real BLE or Simulated) + ↓ + Generates 16-byte packet every 1-60 seconds + [ver][seq][timestamp][flags][hr][spo2][temp][activity][checksum] + ↓ + Wristband Manager decodes packet + ↓ + Sends to Backend API (/api/vitals) + ↓ + Backend processes & stores data + ↓ + WebSocket broadcasts to connected clients + ↓ + Staff Dashboard updates in real-time (http://localhost:5173) + ↓ + Priority queue recalculates + ↓ + Emergency alerts triggered if thresholds exceeded +``` + +--- + +## 📄 File Purposes + +### Backend (`backend/`) + +#### `server.py` +**Purpose:** Core backend API server +**Technology:** FastAPI + Uvicorn +**Key Functions:** +- Patient registration and management +- Vital signs data ingestion and storage +- Priority queue calculation algorithm +- WebSocket real-time updates +- RESTful API endpoints for all operations + +**Main Endpoints:** +- `POST /api/checkin` - Register new patient +- `POST /api/vitals` - Receive vital signs data +- `GET /api/queue` - Get prioritized patient queue +- `GET /api/stats` - System statistics +- `GET /api/wristband-details` - Wristband inventory +- `POST /api/patients/{id}/discharge` - Discharge patient +- `WS /ws` - WebSocket for real-time updates + +--- + +### Wristband System (`simulator/`) + +#### `wristband_simulator.py` +**Purpose:** Original standalone wristband simulator +**Technology:** Python asyncio +**Key Functions:** +- Generates realistic vital sign data +- Simulates 5 patient condition profiles (stable, deteriorating, critical, etc.) +- Creates proper 16-byte BLE packets with checksums +- Can run independently for testing + +**When to use:** Quick testing without the full system + +--- + +#### `wristband_manager.py` +**Purpose:** Unified wristband management system +**Technology:** Python asyncio + Bleak (for BLE) +**Key Functions:** +- **Manages both real and simulated wristbands** with identical interface +- Scans for real BLE devices +- Decodes 16-byte packets according to spec +- Handles wristband inventory (available, assigned, in-use) +- Auto-assigns wristbands to new patients + +**Key Classes:** +- `BaseWristband` - Abstract interface for all wristbands +- `RealWristband` - Connects to physical BLE devices +- `SimulatedWristband` - Software simulation for testing +- `WristbandManager` - Central inventory manager +- `PacketDecoder` - Decodes 16-byte BLE packets + +--- + +#### `config_system.py` +**Purpose:** Configuration management and CLI tools +**Technology:** Python + PyYAML +**Key Functions:** +- Loads wristband inventory from YAML config +- Command-line tools for managing wristbands +- BLE device scanning and discovery +- Add/remove wristbands without code changes + +**CLI Commands:** +```bash +python config_system.py --inventory # Show configured wristbands +python config_system.py --scan # Scan for real BLE devices +python config_system.py --add-simulated # Add a simulated wristband +``` + +--- + +#### `main_runner.py` +**Purpose:** Main system orchestrator +**Technology:** Python asyncio +**Key Functions:** +- **Auto-detects new patient check-ins** from backend +- **Auto-assigns wristbands** (prefers real, falls back to simulated) +- Creates emergency simulated bands if inventory depleted +- Reports wristband status to backend every 10 seconds +- Manages lifecycle of all wristband monitoring tasks + +**This is the heart of the wristband system!** + +--- + +#### `wristband_config.yaml` +**Purpose:** Wristband inventory configuration +**Technology:** YAML configuration file +**Structure:** +```yaml +backend_url: "http://localhost:8000" +auto_scan_ble: true # Scan for real bands on startup +prefer_real_bands: true # Use real bands first + +simulated_bands: # MOCK wristbands for testing + - band_id: "MOCK-SIM1" + profile: "stable" + +real_bands: # Physical BLE devices + - band_id: "VitalLink-A3B2" + ble_address: "AA:BB:CC:DD:EE:FF" +``` + +**Edit this file** to add/remove wristbands without touching code! + +--- + +### Frontend (`frontend/`) + +#### `dashboard/src/App.jsx` +**Purpose:** Staff monitoring dashboard +**Technology:** React + Vite + Tailwind CSS +**Key Features:** +- **Patients Tab:** + - Real-time vital signs display + - Color-coded alert tiers (🟢 Normal, 🟡 Alert, 🔴 Emergency) + - Priority queue ordering + - Filter by tier + - Discharge patients +- **Wristbands Tab:** + - Inventory management view + - Real vs simulated differentiation (🔵 vs 🟢) + - Click wristband to see **raw 16-byte packet hex dump** + - Decoded packet fields + - Flag visualization (emergency, alert, battery, etc.) + +**Port:** http://localhost:5173 + +--- + +#### `kiosk/src/App.jsx` +**Purpose:** Patient self-service check-in +**Technology:** React + Vite + Tailwind CSS +**Key Features:** +- User-friendly check-in wizard +- Symptom selection +- Severity rating +- Wristband assignment confirmation +- Next steps guidance + +**Port:** http://localhost:5174 + +--- + +### Tests (`tests/`) + +#### `test_suite.py` +**Purpose:** Comprehensive system testing +**Technology:** Python asyncio +**Test Coverage:** +- Patient data validation +- Packet generation and checksums +- Tier classification logic +- Priority score calculation +- Simulator stability +- Deterioration detection +- Transmission timing + +**Run with:** `python tests/test_suite.py` + +--- + +### Scripts + +#### `start_everything.sh` +**Purpose:** Master startup script - **ONE COMMAND TO START ENTIRE SYSTEM** +**What it does:** +1. ✅ Activates Python virtual environment +2. ✅ Starts backend API server (port 8000) +3. ✅ Starts wristband management system +4. ✅ Starts staff dashboard (port 5173) +5. ✅ Starts check-in kiosk (port 5174) +6. ✅ Creates logs for all services + +**Usage:** `./start_everything.sh` + +--- + +#### `stop_everything.sh` +**Purpose:** Clean shutdown of all services +**What it does:** +1. Stops backend server +2. Stops wristband system +3. Stops frontend dev servers +4. Cleans up PID files + +**Usage:** `./stop_everything.sh` + +--- + +## 🔗 How Components Connect + +### 1. Patient Check-In Flow +``` +Kiosk (React) + → POST /api/checkin + → Backend creates patient record + → Main Runner detects new patient + → Wristband Manager assigns band + → Monitoring starts +``` + +### 2. Vital Signs Data Flow +``` +Wristband (Real or Simulated) + → Generates 16-byte BLE packet + → Wristband Manager decodes + → POST /api/vitals to Backend + → Backend updates patient record + → WebSocket broadcasts to Dashboard + → Dashboard displays live data +``` + +### 3. Priority Queue Flow +``` +Backend calculates priority scores every 3 seconds based on: + - Tier (Emergency=100, Alert=50, Normal=0) + - Wait time (increases after 30 min) + - Initial severity (severe=20, moderate=10, mild=5) + - Vital sign abnormalities + → Queue reordered + → Dashboard fetches updated queue + → Patients displayed in priority order +``` + +### 4. Wristband Inventory Flow +``` +Main Runner reports inventory every 10 seconds: + → POST /api/wristband-details (full inventory + packet data) + → Backend caches data + → Dashboard fetches wristband details + → Wristbands tab displays inventory + → Click wristband → show raw packet hex +``` + +--- + +## 🛠️ Technology Stack + +| Component | Technology | Purpose | +|-----------|-----------|---------| +| Backend | FastAPI + Uvicorn | REST API + WebSocket server | +| Wristband System | Python asyncio + Bleak | BLE communication + simulation | +| Frontend | React + Vite | Fast, modern UI development | +| Styling | Tailwind CSS | Utility-first responsive design | +| Icons | Lucide React | Beautiful, consistent icons | +| BLE Protocol | Bluetooth Low Energy | Wireless communication with wristbands | +| Data Format | 16-byte binary packets | Efficient, spec-compliant data transmission | +| Configuration | YAML | Human-readable wristband inventory | +| Virtual Env | UV (optional) or venv | Python dependency isolation | + +--- + +## 🚀 Quick Start + +### 1. Start Everything +```bash +./start_everything.sh +``` + +### 2. Access Interfaces +- **Staff Dashboard:** http://localhost:5173 +- **Check-in Kiosk:** http://localhost:5174 +- **API Documentation:** http://localhost:8000/docs + +### 3. Test the System +1. Open kiosk, check in a patient +2. Watch dashboard - patient appears with assigned wristband +3. Click "Wristbands" tab to see inventory +4. Click any wristband to view raw packet data + +### 4. Stop Everything +```bash +./stop_everything.sh +``` + +--- + +## 🔧 Configuration + +### Adding Simulated Wristbands +Edit `simulator/wristband_config.yaml`: +```yaml +simulated_bands: + - band_id: "MOCK-SIM4" + profile: "critical" +``` + +### Adding Real Wristbands +1. Scan for devices: +```bash + python simulator/config_system.py --scan +``` +2. Add to config when prompted, or manually: +```yaml + real_bands: + - band_id: "VitalLink-A3B2" + ble_address: "AA:BB:CC:DD:EE:FF" +``` + +### Changing Priority Preferences +```yaml +prefer_real_bands: true # Use real bands first +auto_scan_ble: true # Scan on startup +``` + +--- + +## 📊 BLE Packet Structure + +VitalLink wristbands transmit 16-byte packets over BLE: + +| Bytes | Field | Type | Description | +|-------|-------|------|-------------| +| 0 | Version | uint8 | Protocol version (0x01) | +| 1-2 | Sequence | uint16 | Packet counter | +| 3-6 | Timestamp | uint32 | Milliseconds since boot | +| 7 | Flags | uint8 | Status bits (emergency, alert, battery, etc.) | +| 8 | Heart Rate | uint8 | BPM | +| 9 | SpO₂ | uint8 | Oxygen saturation % | +| 10-11 | Temperature | int16 | Celsius × 100 (3650 = 36.50°C) | +| 12-13 | Activity | uint16 | RMS × 100 | +| 14 | Checksum | uint8 | Sum of bytes 0-13 mod 256 | +| 15 | Reserved | uint8 | Future use | + +**Example Packet:** +``` +01 2A 00 87 D6 12 00 02 4E 61 3D 0E B4 00 BA 00 +``` + +**View in Dashboard:** Click any wristband in the Wristbands tab! + +--- + +## 📝 Development Notes + +### For Hardware Integration +When you get physical wristbands: +1. Power on wristbands (remove from charger) +2. Run: `python simulator/config_system.py --scan` +3. Add discovered bands to config +4. Set `prefer_real_bands: true` +5. Restart system - real bands will be used automatically! + +### Mixed Mode Testing +You can run **1 real + 5 simulated** simultaneously: +- Real wristband: For actual patient (you wearing it) +- Simulated: For demo patients with various conditions + +### Packet Debugging +View raw packets in real-time: +1. Dashboard → Wristbands tab +2. Click any active wristband +3. See hex dump + decoded fields +4. Perfect for verifying hardware compliance! + +--- + +## 🎓 For Capstone Presentation + +### Demo Flow +1. **Start system:** `./start_everything.sh` +2. **Show kiosk:** Check in yourself as a patient +3. **Show dashboard:** You appear in queue with assigned wristband +4. **Show wristbands tab:** Your band is listed as "in use" +5. **Click your wristband:** Show raw 16-byte packet matching spec +6. **Add mock patient:** Check in another via kiosk +7. **Show auto-assignment:** System assigns MOCK band automatically +8. **Show priority queue:** Emergency patients automatically moved to top + +### Key Talking Points +- ✅ Real-time vital sign monitoring +- ✅ Automatic triage prioritization +- ✅ Seamless real/simulated wristband mixing +- ✅ Production-ready BLE protocol implementation +- ✅ Complete end-to-end system +- ✅ Scalable microservice architecture + +--- + +## 📚 Additional Resources + +- **BLE Protocol Details:** See uploaded specification document +- **API Documentation:** http://localhost:8000/docs (when running) +- **Wristband Inventory:** `python simulator/config_system.py --inventory` +- **System Logs:** `tail -f logs/*.log` + +--- + +## 🏆 Credits + +**VitalLink Emergency Room Patient Monitoring System** +Capstone Project - 2025 +**Developer:** Mai(Andrew Hartley) +**Institution:** [Northeastern University] + +--- + +## 📄 License + +Educational/Capstone Project diff --git a/install_vitallink.sh b/install_vitallink.sh deleted file mode 100755 index db8fbdf..0000000 --- a/install_vitallink.sh +++ /dev/null @@ -1,621 +0,0 @@ -#!/bin/bash - -# VitalLink Automatic Installer for Arch Linux -# This script sets up the entire project structure -# You'll still need to copy the Python/React code from Claude artifacts - -set -e - -RED='\033[0;31m' -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -BLUE='\033[0;34m' -CYAN='\033[0;36m' -NC='\033[0m' - -PROJECT_ROOT="$PWD/vitallink" - -clear -echo -e "${CYAN}" -cat <<"EOF" -╔══════════════════════════════════════════════════════════════════════════╗ -║ ║ -║ ██╗ ██╗██╗████████╗ █████╗ ██╗ ██╗ ██╗███╗ ██╗██╗ ██╗ ║ -║ ██║ ██║██║╚══██╔══╝██╔══██╗██║ ██║ ██║████╗ ██║██║ ██╔╝ ║ -║ ██║ ██║██║ ██║ ███████║██║ ██║ ██║██╔██╗ ██║█████╔╝ ║ -║ ╚██╗ ██╔╝██║ ██║ ██╔══██║██║ ██║ ██║██║╚██╗██║██╔═██╗ ║ -║ ╚████╔╝ ██║ ██║ ██║ ██║███████╗███████╗██║██║ ╚████║██║ ██╗ ║ -║ ╚═══╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝╚══════╝╚══════╝╚═╝╚═╝ ╚═══╝╚═╝ ╚═╝ ║ -║ ║ -║ Emergency Room Patient Monitoring System ║ -║ Automatic Installer v1.0 ║ -║ ║ -╚══════════════════════════════════════════════════════════════════════════╝ -EOF -echo -e "${NC}" - -echo -e "${YELLOW}This script will:${NC}" -echo " 1. Create project structure in $PROJECT_ROOT" -echo " 2. Set up Python virtual environment" -echo " 3. Install all dependencies" -echo " 4. Create startup/stop scripts" -echo " 5. Generate placeholder files for you to fill" -echo "" -echo -e "${CYAN}Note: You'll need to copy Python/React code from Claude artifacts after this.${NC}" -echo "" -read -p "Continue? (y/n) " -n 1 -r -echo -if [[ ! $REPLY =~ ^[Yy]$ ]]; then - echo -e "${RED}Installation cancelled.${NC}" - exit 1 -fi - -# Check if directory exists -if [ -d "$PROJECT_ROOT" ]; then - echo -e "${YELLOW}Warning: $PROJECT_ROOT already exists.${NC}" - read -p "Delete and recreate? (y/n) " -n 1 -r - echo - if [[ $REPLY =~ ^[Yy]$ ]]; then - rm -rf "$PROJECT_ROOT" - echo -e "${GREEN}✓ Removed existing directory${NC}" - else - echo -e "${RED}Installation cancelled.${NC}" - exit 1 - fi -fi - -echo "" -echo -e "${CYAN}═══════════════════════════════════════════════════════════════════════${NC}" -echo -e "${CYAN}STEP 1: Creating Directory Structure${NC}" -echo -e "${CYAN}═══════════════════════════════════════════════════════════════════════${NC}" - -mkdir -p "$PROJECT_ROOT"/{backend,simulator,frontend/{kiosk,dashboard},tests,docs,logs} -echo -e "${GREEN}✓ Created project directories${NC}" - -cd "$PROJECT_ROOT" - -echo "" -echo -e "${CYAN}═══════════════════════════════════════════════════════════════════════${NC}" -echo -e "${CYAN}STEP 2: Setting up Python Virtual Environment${NC}" -echo -e "${CYAN}═══════════════════════════════════════════════════════════════════════${NC}" - -python -m venv venv -source venv/bin/activate -echo -e "${GREEN}✓ Virtual environment created${NC}" - -echo "" -echo -e "${CYAN}═══════════════════════════════════════════════════════════════════════${NC}" -echo -e "${CYAN}STEP 3: Creating requirements.txt${NC}" -echo -e "${CYAN}═══════════════════════════════════════════════════════════════════════${NC}" - -cat >requirements.txt <<'EOF' -# Backend API -fastapi==0.104.1 -uvicorn[standard]==0.24.0 -websockets==12.0 -pydantic==2.5.0 -python-multipart==0.0.6 - -# HTTP client for simulator integration -aiohttp==3.9.1 -requests==2.31.0 - -# Testing -pytest==7.4.3 -pytest-asyncio==0.21.1 - -# Utilities -python-dateutil==2.8.2 -EOF - -echo -e "${GREEN}✓ requirements.txt created${NC}" - -echo "" -echo -e "${CYAN}═══════════════════════════════════════════════════════════════════════${NC}" -echo -e "${CYAN}STEP 4: Installing Python Dependencies${NC}" -echo -e "${CYAN}═══════════════════════════════════════════════════════════════════════${NC}" - -pip install --upgrade pip -q -pip install -r requirements.txt -q -echo -e "${GREEN}✓ All Python packages installed${NC}" - -echo "" -echo -e "${CYAN}═══════════════════════════════════════════════════════════════════════${NC}" -echo -e "${CYAN}STEP 5: Creating Project Files${NC}" -echo -e "${CYAN}═══════════════════════════════════════════════════════════════════════${NC}" - -# Backend server placeholder -cat >backend/server.py <<'EOF' -""" -VitalLink Backend Server -TODO: Copy the complete FastAPI code from Claude artifact: - "VitalLink Backend API (FastAPI)" -""" - -print("Backend server placeholder - please copy the actual code from Claude artifacts") -EOF -echo -e "${GREEN}✓ backend/server.py created (placeholder)${NC}" - -# Simulator placeholder -cat >simulator/wristband_simulator.py <<'EOF' -""" -VitalLink Wristband Simulator -TODO: Copy the complete simulator code from Claude artifact: - "VitalLink Wristband Simulator & Base Station" -""" - -print("Simulator placeholder - please copy the actual code from Claude artifacts") -EOF -echo -e "${GREEN}✓ simulator/wristband_simulator.py created (placeholder)${NC}" - -# Test suite placeholder -cat >tests/test_suite.py <<'EOF' -""" -VitalLink Test Suite -TODO: Copy the complete test suite code from Claude artifact: - "VitalLink Complete Test Suite" -""" - -print("Test suite placeholder - please copy the actual code from Claude artifacts") -EOF -echo -e "${GREEN}✓ tests/test_suite.py created (placeholder)${NC}" - -# Dashboard HTML -cat >frontend/dashboard/index.html <<'EOF' - - - - - - VitalLink Staff Dashboard - - - - - - -
- - - - -EOF -echo -e "${GREEN}✓ frontend/dashboard/index.html created (template)${NC}" - -# Kiosk HTML -cat >frontend/kiosk/index.html <<'EOF' - - - - - - VitalLink Check-in Kiosk - - - - - - -
- - - - -EOF -echo -e "${GREEN}✓ frontend/kiosk/index.html created (template)${NC}" - -echo "" -echo -e "${CYAN}═══════════════════════════════════════════════════════════════════════${NC}" -echo -e "${CYAN}STEP 6: Creating Control Scripts${NC}" -echo -e "${CYAN}═══════════════════════════════════════════════════════════════════════${NC}" - -# Start script -cat >start.sh <<'STARTSCRIPT' -#!/bin/bash - -PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -cd "$PROJECT_ROOT" -source venv/bin/activate - -echo "╔═══════════════════════════════════════════════════════════════════════╗" -echo "║ Starting VitalLink System ║" -echo "╚═══════════════════════════════════════════════════════════════════════╝" -echo "" - -mkdir -p logs - -echo "Starting backend server..." -python backend/server.py > logs/backend.log 2>&1 & -echo $! > logs/backend.pid -echo "✓ Backend started (PID: $(cat logs/backend.pid))" - -sleep 3 - -echo "Starting wristband simulator..." -python simulator/wristband_simulator.py > logs/simulator.log 2>&1 & -echo $! > logs/simulator.pid -echo "✓ Simulator started (PID: $(cat logs/simulator.pid))" - -echo "" -echo "═══════════════════════════════════════════════════════════════════════" -echo "✅ VitalLink System Running!" -echo "═══════════════════════════════════════════════════════════════════════" -echo "" -echo "📊 Access Points:" -echo " • API Docs: http://localhost:8000/docs" -echo " • API Stats: http://localhost:8000/api/stats" -echo " • WebSocket: ws://localhost:8000/ws" -echo " • Staff Dashboard: file://$PROJECT_ROOT/frontend/dashboard/index.html" -echo " • Check-in Kiosk: file://$PROJECT_ROOT/frontend/kiosk/index.html" -echo "" -echo "📝 View Logs:" -echo " • Backend: tail -f logs/backend.log" -echo " • Simulator: tail -f logs/simulator.log" -echo "" -echo "🛑 Stop System:" -echo " • Run: ./stop.sh" -echo "" -echo "═══════════════════════════════════════════════════════════════════════" -STARTSCRIPT - -chmod +x start.sh -echo -e "${GREEN}✓ start.sh created${NC}" - -# Stop script -cat >stop.sh <<'STOPSCRIPT' -#!/bin/bash - -PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -cd "$PROJECT_ROOT" - -echo "Stopping VitalLink system..." - -if [ -f logs/backend.pid ]; then - kill $(cat logs/backend.pid) 2>/dev/null && echo "✓ Backend stopped" || echo "Backend not running" - rm -f logs/backend.pid -fi - -if [ -f logs/simulator.pid ]; then - kill $(cat logs/simulator.pid) 2>/dev/null && echo "✓ Simulator stopped" || echo "Simulator not running" - rm -f logs/simulator.pid -fi - -echo "✓ VitalLink system stopped" -STOPSCRIPT - -chmod +x stop.sh -echo -e "${GREEN}✓ stop.sh created${NC}" - -# Test script -cat >test.sh <<'TESTSCRIPT' -#!/bin/bash - -PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -cd "$PROJECT_ROOT" -source venv/bin/activate - -echo "Running VitalLink Test Suite..." -echo "" -python tests/test_suite.py -TESTSCRIPT - -chmod +x test.sh -echo -e "${GREEN}✓ test.sh created${NC}" - -echo "" -echo -e "${CYAN}═══════════════════════════════════════════════════════════════════════${NC}" -echo -e "${CYAN}STEP 7: Creating Documentation${NC}" -echo -e "${CYAN}═══════════════════════════════════════════════════════════════════════${NC}" - -# README -cat >README.md <<'EOF' -# VitalLink - ER Patient Monitoring System - -Emergency department patient monitoring system using smart wristbands. - -## Quick Start - -1. **Copy Code from Claude Artifacts:** - - `backend/server.py` ← Copy "VitalLink Backend API (FastAPI)" - - `simulator/wristband_simulator.py` ← Copy "VitalLink Wristband Simulator" - - `tests/test_suite.py` ← Copy "VitalLink Complete Test Suite" - - `frontend/dashboard/index.html` ← Insert React code from "Staff Dashboard" - - `frontend/kiosk/index.html` ← Insert React code from "Check-in Kiosk" - -2. **Test the System:** - ```bash - ./test.sh - ``` - -3. **Start the System:** - ```bash - ./start.sh - ``` - -4. **Access the Interfaces:** - - API Documentation: http://localhost:8000/docs - - Staff Dashboard: Open `frontend/dashboard/index.html` in browser - - Check-in Kiosk: Open `frontend/kiosk/index.html` in browser - -5. **Stop the System:** - ```bash - ./stop.sh - ``` - -## Project Structure - -``` -vitallink/ -├── backend/ # FastAPI server -├── simulator/ # Wristband simulator -├── frontend/ # Web interfaces -│ ├── dashboard/ # Staff monitoring -│ └── kiosk/ # Patient check-in -├── tests/ # Test suite -├── logs/ # System logs -└── venv/ # Python virtual env -``` - -## Commands - -- `./start.sh` - Start backend + simulator -- `./stop.sh` - Stop all services -- `./test.sh` - Run test suite -- `tail -f logs/backend.log` - View backend logs -- `tail -f logs/simulator.log` - View simulator logs - -## Testing - -```bash -# Run all tests -./test.sh - -# Test API -curl http://localhost:8000/api/stats - -# Create test patient -curl -X POST http://localhost:8000/api/checkin \ - -H "Content-Type: application/json" \ - -d '{"firstName":"Test","lastName":"Patient","dob":"1990-01-01","symptoms":["Fever"],"severity":"moderate"}' -``` - -## Next Steps - -See `docs/SETUP_GUIDE.md` for detailed instructions. -EOF - -echo -e "${GREEN}✓ README.md created${NC}" - -# Setup guide -cat >docs/SETUP_GUIDE.md <<'EOF' -# Detailed Setup Guide - -## Copying Code from Claude Artifacts - -### 1. Backend Server (backend/server.py) - -Open the artifact titled **"VitalLink Backend API (FastAPI)"** and copy the ENTIRE Python code. - -Paste it into `backend/server.py`. - -### 2. Wristband Simulator (simulator/wristband_simulator.py) - -Open the artifact titled **"VitalLink Wristband Simulator & Base Station"** and copy the ENTIRE Python code. - -Paste it into `simulator/wristband_simulator.py`. - -### 3. Test Suite (tests/test_suite.py) - -Open the artifact titled **"VitalLink Complete Test Suite"** and copy the ENTIRE Python code. - -Paste it into `tests/test_suite.py`. - -### 4. Staff Dashboard (frontend/dashboard/index.html) - -1. Open the artifact titled **"VitalLink Staff Monitoring Dashboard"** -2. Copy the ENTIRE React component code -3. Open `frontend/dashboard/index.html` in a text editor -4. Find the TODO comment section -5. Paste the React code there -6. Remove the line `export default StaffDashboard;` -7. Add these lines at the end: - ```javascript - const root = ReactDOM.createRoot(document.getElementById('root')); - root.render(); - ``` - -### 5. Check-in Kiosk (frontend/kiosk/index.html) - -Follow the same process as the dashboard, but use the **"VitalLink Check-in Kiosk"** artifact. - -## Verification - -After copying all code: - -```bash -# Activate virtual environment -source venv/bin/activate - -# Run tests -./test.sh - -# Start system -./start.sh - -# In another terminal, test API -curl http://localhost:8000/api/stats -``` - -If everything works, you should see JSON output from the API. -EOF - -echo -e "${GREEN}✓ docs/SETUP_GUIDE.md created${NC}" - -# .gitignore -cat >.gitignore <<'EOF' -__pycache__/ -*.py[cod] -venv/ -logs/ -*.log -*.pid -.DS_Store -EOF - -echo -e "${GREEN}✓ .gitignore created${NC}" - -echo "" -echo -e "${CYAN}═══════════════════════════════════════════════════════════════════════${NC}" -echo -e "${CYAN}STEP 8: Final Setup${NC}" -echo -e "${CYAN}═══════════════════════════════════════════════════════════════════════${NC}" - -# Create empty log directory -touch logs/.gitkeep - -# Deactivate venv for clean state -deactivate 2>/dev/null || true - -echo -e "${GREEN}✓ Project setup complete!${NC}" - -echo "" -echo -e "${GREEN}╔═══════════════════════════════════════════════════════════════════════╗${NC}" -echo -e "${GREEN}║ ✅ Installation Complete! ║${NC}" -echo -e "${GREEN}╚═══════════════════════════════════════════════════════════════════════╝${NC}" -echo "" -echo -e "${YELLOW}📁 Project Location:${NC} $PROJECT_ROOT" -echo "" -echo -e "${YELLOW}🔔 IMPORTANT - Next Steps:${NC}" -echo "" -echo -e "${CYAN}1. Copy Code from Claude Artifacts:${NC}" -echo " Open each artifact in Claude and copy the code to these files:" -echo " • backend/server.py" -echo " • simulator/wristband_simulator.py" -echo " • tests/test_suite.py" -echo " • frontend/dashboard/index.html (insert React code)" -echo " • frontend/kiosk/index.html (insert React code)" -echo "" -echo -e "${CYAN}2. Navigate to project:${NC}" -echo " cd $PROJECT_ROOT" -echo "" -echo -e "${CYAN}3. Run tests:${NC}" -echo " ./test.sh" -echo "" -echo -e "${CYAN}4. Start the system:${NC}" -echo " ./start.sh" -echo "" -echo -e "${CYAN}5. Open interfaces:${NC}" -echo " xdg-open frontend/dashboard/index.html" -echo " xdg-open frontend/kiosk/index.html" -echo "" -echo -e "${GREEN}📖 Full documentation:${NC} cat docs/SETUP_GUIDE.md" -echo "" -echo -e "${BLUE}═══════════════════════════════════════════════════════════════════════${NC}" -echo "" diff --git a/vitallink/logs/backend.log b/vitallink/logs/backend.log index 5763bbb..eb22930 100644 --- a/vitallink/logs/backend.log +++ b/vitallink/logs/backend.log @@ -180,3 +180,702 @@ INFO: 127.0.0.1:53200 - "GET /api/queue HTTP/1.1" 200 OK INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:53208 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:53214 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:53216 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:53218 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:53234 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:44644 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:44646 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:44660 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:44670 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:44672 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:44684 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:36350 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:36364 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:36372 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:36388 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:36390 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:36396 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51530 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:51538 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:51540 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:51548 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:51562 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51570 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:52486 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:52500 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:52514 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:52520 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:52534 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:52550 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:54118 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:54126 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:54142 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:54146 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:54148 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:54162 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:53770 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:53782 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:53792 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:53802 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:53810 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:53826 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:53836 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:60856 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:60862 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:60874 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:60884 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:60896 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:60902 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:38798 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:38810 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:38816 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:38824 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:38834 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:38836 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:33754 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:33760 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:33774 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:33790 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:33798 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:33806 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:56788 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:56800 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:56810 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:56824 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:56834 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:56838 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:40858 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:40862 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:40878 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:40894 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:40904 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:40912 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:45962 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:45964 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:45978 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:45980 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:45992 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:46006 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:46018 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:35982 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:35994 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:35998 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:36000 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:36004 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:36016 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:43598 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:43612 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:43622 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43624 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:43628 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:43638 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:55430 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:55442 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:55446 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:55456 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:55458 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:55472 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:48006 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:48008 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:48010 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:48026 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:48042 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:48050 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:55096 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:55102 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:55104 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:55116 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:55122 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:55126 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:55748 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:55752 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:55762 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:55778 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:55790 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:55802 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:55810 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:59564 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:59580 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:59586 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:59602 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:59614 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:59626 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:51300 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:51314 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:51320 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51322 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:51332 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:51346 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:42724 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:42738 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:42740 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:42744 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:42752 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:42756 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:34330 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:34340 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:34346 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:34360 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:34362 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:34368 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:39604 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:39620 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:39626 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:39632 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:39646 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:39656 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:42312 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:42324 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:42330 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:42342 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:42350 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:42362 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:42366 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:47694 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:47696 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:47708 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:47710 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:47712 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:47716 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:39504 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:39516 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:39526 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:39532 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:39546 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:39562 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51586 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:51594 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:51596 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:51610 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:51620 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:51628 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:43548 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:43556 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43568 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:43578 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:43590 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43598 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:48462 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:48478 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:48480 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:48488 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:48502 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:48512 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:46446 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:46462 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:46476 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:46478 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:46490 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:46496 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:46498 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:47958 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:47970 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:47982 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:47998 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:48014 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:48018 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:54544 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:54558 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:54560 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:54568 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:54580 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:54584 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:55426 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:55428 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:55440 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:55444 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:55450 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:55456 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:43632 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:43642 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43646 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:43658 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:43674 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:43676 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:35608 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:35610 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:35620 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:35622 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:35626 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:35638 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:50036 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:50050 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:50064 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:50078 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:50094 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:50100 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:50106 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:35516 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:35526 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:35534 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:35550 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:35566 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:35578 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:52394 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:52402 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:52418 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:52420 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:52426 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:52440 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:41388 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:41398 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:41404 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:41420 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:41436 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:41446 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:50050 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:50066 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:50072 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:50078 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:50082 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:50084 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:52234 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:52246 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:52260 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:52274 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:52284 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:52292 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:36692 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:36708 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:36714 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:36730 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:36738 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:36754 - "POST /api/vitals HTTP/1.1" 200 OK +INFO: 127.0.0.1:36760 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:38692 - "POST /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:38704 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/queue HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/stats HTTP/1.1" 200 OK +INFO: 127.0.0.1:57242 - "GET /api/wristband-details HTTP/1.1" 200 OK +INFO: 127.0.0.1:38708 - "GET /api/queue HTTP/1.1" 200 OK