Spaces:
Running
Running
Commit ·
1947612
0
Parent(s):
deploy: clean initial commit for Hugging Face Spaces (no binary blobs)
Browse filesThis view is limited to 50 files because it contains too many changes. See raw diff
- .antigravityrules.md +14 -0
- .dockerignore +12 -0
- .env.example +9 -0
- .gitignore +55 -0
- Dockerfile +49 -0
- README.md +78 -0
- backend/.env.example +1 -0
- backend/.gitignore +0 -0
- backend/Dockerfile +19 -0
- backend/README.md +66 -0
- backend/api/__init__.py +0 -0
- backend/api/groq_client.py +890 -0
- backend/api/inference.py +210 -0
- backend/api/pdf_generator.py +277 -0
- backend/api/serializers.py +34 -0
- backend/api/urls.py +8 -0
- backend/api/views.py +157 -0
- backend/core/__init__.py +0 -0
- backend/core/settings.py +61 -0
- backend/core/urls.py +5 -0
- backend/core/wsgi.py +5 -0
- backend/manage.py +11 -0
- backend/requirements.txt +19 -0
- backend/scripts/export_onnx.py +77 -0
- backend/staticfiles/rest_framework/css/bootstrap-theme.min.1d4b05b397c3.css +6 -0
- backend/staticfiles/rest_framework/css/bootstrap-theme.min.1d4b05b397c3.css.gz +0 -0
- backend/staticfiles/rest_framework/css/bootstrap-theme.min.css +6 -0
- backend/staticfiles/rest_framework/css/bootstrap-theme.min.css.51806092cc05.map +1 -0
- backend/staticfiles/rest_framework/css/bootstrap-theme.min.css.51806092cc05.map.gz +0 -0
- backend/staticfiles/rest_framework/css/bootstrap-theme.min.css.gz +0 -0
- backend/staticfiles/rest_framework/css/bootstrap-theme.min.css.map +1 -0
- backend/staticfiles/rest_framework/css/bootstrap-theme.min.css.map.gz +0 -0
- backend/staticfiles/rest_framework/css/bootstrap-tweaks.css +237 -0
- backend/staticfiles/rest_framework/css/bootstrap-tweaks.css.gz +0 -0
- backend/staticfiles/rest_framework/css/bootstrap-tweaks.ee4ee6acf9eb.css +237 -0
- backend/staticfiles/rest_framework/css/bootstrap-tweaks.ee4ee6acf9eb.css.gz +0 -0
- backend/staticfiles/rest_framework/css/bootstrap.min.css +0 -0
- backend/staticfiles/rest_framework/css/bootstrap.min.css.cafbda9c0e9e.map +0 -0
- backend/staticfiles/rest_framework/css/bootstrap.min.css.cafbda9c0e9e.map.gz +0 -0
- backend/staticfiles/rest_framework/css/bootstrap.min.css.gz +0 -0
- backend/staticfiles/rest_framework/css/bootstrap.min.css.map +0 -0
- backend/staticfiles/rest_framework/css/bootstrap.min.css.map.gz +0 -0
- backend/staticfiles/rest_framework/css/bootstrap.min.f17d4516b026.css +0 -0
- backend/staticfiles/rest_framework/css/bootstrap.min.f17d4516b026.css.gz +0 -0
- backend/staticfiles/rest_framework/css/default.789dfb5732d7.css +82 -0
- backend/staticfiles/rest_framework/css/default.789dfb5732d7.css.gz +0 -0
- backend/staticfiles/rest_framework/css/default.css +82 -0
- backend/staticfiles/rest_framework/css/default.css.gz +0 -0
- backend/staticfiles/rest_framework/css/font-awesome-4.0.3.c1e1ea213abf.css +1338 -0
- backend/staticfiles/rest_framework/css/font-awesome-4.0.3.c1e1ea213abf.css.gz +0 -0
.antigravityrules.md
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Antigravity Development Preferences & Guidelines
|
| 2 |
+
|
| 3 |
+
This file serves as persistent memory and workspace rules for any AI agent pair-programming in this repository.
|
| 4 |
+
|
| 5 |
+
## 1. Commit Strategy: Atomic Commits
|
| 6 |
+
* **Rule**: Always commit code in small, granular, logical pieces (atomic commits) instead of large bundles.
|
| 7 |
+
* **Format**: Use clear, conventional commit messages:
|
| 8 |
+
- `feat: [description]` for new features
|
| 9 |
+
- `fix: [description]` for bug fixes
|
| 10 |
+
- `refactor: [description]` for code cleanups
|
| 11 |
+
* **Validation**: Ensure all changes compile and build perfectly before making a commit.
|
| 12 |
+
|
| 13 |
+
## 2. Active Branch Configuration
|
| 14 |
+
* All code changes and features must be committed and pushed directly to the **`Ayine`** branch unless explicitly instructed otherwise.
|
.dockerignore
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
node_modules
|
| 2 |
+
dist
|
| 3 |
+
.git
|
| 4 |
+
.sixth
|
| 5 |
+
backend/derma
|
| 6 |
+
backend/staticfiles
|
| 7 |
+
backend/staticfiles.json
|
| 8 |
+
dermavision.db
|
| 9 |
+
*.db
|
| 10 |
+
backend/model/dermavision.onnx
|
| 11 |
+
.env
|
| 12 |
+
.env.*
|
.env.example
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# GEMINI_API_KEY: Required for Gemini AI API calls.
|
| 2 |
+
# AI Studio automatically injects this at runtime from user secrets.
|
| 3 |
+
# Users configure this via the Secrets panel in the AI Studio UI.
|
| 4 |
+
GROK_API_KEY="your_grok_api_key_here"
|
| 5 |
+
|
| 6 |
+
# APP_URL: The URL where this applet is hosted.
|
| 7 |
+
# AI Studio automatically injects this at runtime with the Cloud Run service URL.
|
| 8 |
+
# Used for self-referential links, OAuth callbacks, and API endpoints.
|
| 9 |
+
APP_URL="MY_APP_URL"
|
.gitignore
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
node_modules/
|
| 2 |
+
build/
|
| 3 |
+
dist/
|
| 4 |
+
coverage/
|
| 5 |
+
.DS_Store
|
| 6 |
+
*.log
|
| 7 |
+
.env*
|
| 8 |
+
!.env.example
|
| 9 |
+
*.db
|
| 10 |
+
backend/model/dermavision.onnx
|
| 11 |
+
|
| 12 |
+
|
| 13 |
+
# Python
|
| 14 |
+
__pycache__/
|
| 15 |
+
*.py[cod]
|
| 16 |
+
*.pyo
|
| 17 |
+
*.pyd
|
| 18 |
+
|
| 19 |
+
# Virtual environments
|
| 20 |
+
venv/
|
| 21 |
+
env/
|
| 22 |
+
.venv/
|
| 23 |
+
|
| 24 |
+
# Environment variables
|
| 25 |
+
.env
|
| 26 |
+
.env.*
|
| 27 |
+
!.env.example
|
| 28 |
+
|
| 29 |
+
# Django
|
| 30 |
+
db.sqlite3
|
| 31 |
+
media/
|
| 32 |
+
staticfiles/
|
| 33 |
+
|
| 34 |
+
# Logs
|
| 35 |
+
*.log
|
| 36 |
+
|
| 37 |
+
# VS Code
|
| 38 |
+
.vscode/
|
| 39 |
+
|
| 40 |
+
# PyCharm
|
| 41 |
+
.idea/
|
| 42 |
+
|
| 43 |
+
# OS files
|
| 44 |
+
.DS_Store
|
| 45 |
+
Thumbs.db
|
| 46 |
+
|
| 47 |
+
# Node modules (if frontend exists)
|
| 48 |
+
node_modules/
|
| 49 |
+
|
| 50 |
+
# Build/dist
|
| 51 |
+
dist/
|
| 52 |
+
build/
|
| 53 |
+
|
| 54 |
+
# Migrations cache
|
| 55 |
+
*.sqlite3
|
Dockerfile
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Use Python 3.11-slim as the robust base image
|
| 2 |
+
FROM python:3.11-slim
|
| 3 |
+
|
| 4 |
+
# Set environment variables
|
| 5 |
+
ENV PYTHONDONTWRITEBYTECODE=1
|
| 6 |
+
ENV PYTHONUNBUFFERED=1
|
| 7 |
+
ENV PORT=7860
|
| 8 |
+
|
| 9 |
+
WORKDIR /app
|
| 10 |
+
|
| 11 |
+
# Install system dependencies, curl, OpenCV support, Node.js 20,
|
| 12 |
+
# and native build tools required by better-sqlite3 (node-gyp)
|
| 13 |
+
RUN apt-get update && apt-get install -y --no-install-recommends \
|
| 14 |
+
curl \
|
| 15 |
+
libglib2.0-0 \
|
| 16 |
+
libgl1 \
|
| 17 |
+
build-essential \
|
| 18 |
+
python3-dev \
|
| 19 |
+
libsqlite3-dev \
|
| 20 |
+
&& curl -fsSL https://deb.nodesource.com/setup_20.x | bash - \
|
| 21 |
+
&& apt-get install -y nodejs \
|
| 22 |
+
&& rm -rf /var/lib/apt/lists/*
|
| 23 |
+
|
| 24 |
+
# ---- Prepare Django Python Backend ----
|
| 25 |
+
COPY backend/requirements.txt ./backend/requirements.txt
|
| 26 |
+
# Upgrade pip and install requirements + gunicorn directly in container
|
| 27 |
+
RUN pip install --no-cache-dir --upgrade pip setuptools wheel \
|
| 28 |
+
&& pip install --no-cache-dir -r ./backend/requirements.txt \
|
| 29 |
+
&& pip install --no-cache-dir gunicorn
|
| 30 |
+
|
| 31 |
+
COPY backend/ ./backend/
|
| 32 |
+
|
| 33 |
+
# ---- Prepare Node.js & React Frontend ----
|
| 34 |
+
COPY package*.json ./
|
| 35 |
+
# Force installation of devDependencies (Vite, esbuild, typescript) for building, even if NODE_ENV=production
|
| 36 |
+
RUN npm ci --include=dev
|
| 37 |
+
|
| 38 |
+
COPY . .
|
| 39 |
+
# Build both the Vite frontend and bundle the Express server
|
| 40 |
+
RUN npm run build
|
| 41 |
+
|
| 42 |
+
# Copy start script
|
| 43 |
+
COPY start.sh ./start.sh
|
| 44 |
+
RUN chmod +x ./start.sh
|
| 45 |
+
|
| 46 |
+
# Hugging Face Spaces expects port 7860
|
| 47 |
+
EXPOSE 7860
|
| 48 |
+
|
| 49 |
+
CMD ["./start.sh"]
|
README.md
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
title: DermaDetect
|
| 3 |
+
emoji: 🔬
|
| 4 |
+
colorFrom: blue
|
| 5 |
+
colorTo: green
|
| 6 |
+
sdk: docker
|
| 7 |
+
app_port: 7860
|
| 8 |
+
pinned: false
|
| 9 |
+
---
|
| 10 |
+
|
| 11 |
+
# DermaDefect | Point-of-Care Clinical Skin Diagnostics
|
| 12 |
+
|
| 13 |
+
|
| 14 |
+
**DermaDefect** is a specialized, lightweight clinical reference interface designed for frontline health workers and primary care clinicians. It provides an immediate, privacy-focused environment to document patient skin pathologies, perform diagnostic reference mapping, and generate structured clinical referral reports at the point of care.
|
| 15 |
+
|
| 16 |
+
> **Privacy Commitment:** DermaDefect operates on a local-first architecture. All patient data, clinical notes, and diagnostic records are stored strictly within the local device's browser storage. No clinical data is ever uploaded to external servers.
|
| 17 |
+
|
| 18 |
+
---
|
| 19 |
+
|
| 20 |
+
## 🔬 Clinical Workflow Capabilities
|
| 21 |
+
|
| 22 |
+
* **Guided Assessment:** Structured 3-step workflow (Patient Info, Skin Capture, Review).
|
| 23 |
+
* **Diagnostic Mapping:** Matches captured lesion specimens against standardized medical pathology criteria.
|
| 24 |
+
* **Urgency Triage:** Automated triage level identification (High/Moderate/Low) with actionable clinical advice.
|
| 25 |
+
* **Referral Documentation:** One-tap generation of formatted clinical referral summaries ready for patient transfer.
|
| 26 |
+
* **Compliance Ready:** Built with a clean, HIPAA-compliant interface design for trust and ease of use in high-pressure clinical environments.
|
| 27 |
+
|
| 28 |
+
---
|
| 29 |
+
|
| 30 |
+
## 🛠 Project Setup
|
| 31 |
+
|
| 32 |
+
### Prerequisites
|
| 33 |
+
* **Node.js** (v18 or higher recommended)
|
| 34 |
+
* **npm** or **yarn**
|
| 35 |
+
|
| 36 |
+
### Local Installation
|
| 37 |
+
|
| 38 |
+
1. **Clone and Install:**
|
| 39 |
+
```bash
|
| 40 |
+
git clone [your-repository-url]
|
| 41 |
+
cd dermadefect
|
| 42 |
+
npm install
|
| 43 |
+
```
|
| 44 |
+
|
| 45 |
+
2. **Configure Environment:**
|
| 46 |
+
Create an `.env.local` file in the root directory and add your diagnostic engine credentials:
|
| 47 |
+
```bash
|
| 48 |
+
GEMINI_API_KEY=your_secure_api_key_here
|
| 49 |
+
```
|
| 50 |
+
|
| 51 |
+
3. **Launch:**
|
| 52 |
+
```bash
|
| 53 |
+
npm run dev
|
| 54 |
+
```
|
| 55 |
+
Access the interface via `http://localhost:3000`.
|
| 56 |
+
|
| 57 |
+
---
|
| 58 |
+
|
| 59 |
+
## 🏛 Technical Architecture
|
| 60 |
+
|
| 61 |
+
* **Framework:** Next.js (App Router)
|
| 62 |
+
* **Styling:** Tailwind CSS (Clinical Light Theme)
|
| 63 |
+
* **Interaction:** `motion/react` for intuitive workflow transitions
|
| 64 |
+
* **State Management:** LocalStorage-based persistence for secure, offline-capable patient records
|
| 65 |
+
* **Icons:** Lucide React
|
| 66 |
+
|
| 67 |
+
---
|
| 68 |
+
|
| 69 |
+
## 🛡 Security & Compliance
|
| 70 |
+
|
| 71 |
+
DermaDefect is built to support clinicians in environments where patient privacy is paramount. By leveraging local browser storage, we eliminate the risks associated with cloud-based patient data transmission, ensuring that sensitive diagnostic imagery and personal information remain in the hands of the treating clinician.
|
| 72 |
+
|
| 73 |
+
---
|
| 74 |
+
|
| 75 |
+
<div align="center">
|
| 76 |
+
<p><i>Built for the next generation of primary care excellence.</i></p>
|
| 77 |
+
<img width="800" src="https://images.unsplash.com/photo-1579684385127-1ef15d508118?auto=format&fit=crop&w=1600&q=80" alt="DermaDefect Clinical Reference Interface" />
|
| 78 |
+
</div>
|
backend/.env.example
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
GROQ_API_KEY=your_real_groq_api_key_goes_here
|
backend/.gitignore
ADDED
|
Binary file (218 Bytes). View file
|
|
|
backend/Dockerfile
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
FROM python:3.11-slim
|
| 2 |
+
|
| 3 |
+
WORKDIR /app
|
| 4 |
+
|
| 5 |
+
# System deps for opencv-headless
|
| 6 |
+
RUN apt-get update && apt-get install -y --no-install-recommends \
|
| 7 |
+
libglib2.0-0 libgl1 \
|
| 8 |
+
&& rm -rf /var/lib/apt/lists/*
|
| 9 |
+
|
| 10 |
+
COPY requirements.txt .
|
| 11 |
+
RUN pip install --no-cache-dir -r requirements.txt
|
| 12 |
+
|
| 13 |
+
COPY . .
|
| 14 |
+
|
| 15 |
+
# Collect static files
|
| 16 |
+
RUN python manage.py collectstatic --noinput
|
| 17 |
+
|
| 18 |
+
EXPOSE 8000
|
| 19 |
+
CMD ["gunicorn", "core.wsgi:application", "--bind", "0.0.0.0:8000", "--workers", "2", "--timeout", "120"]
|
backend/README.md
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# DermaDetect Backend API (DermaVision)
|
| 2 |
+
|
| 3 |
+
This directory contains the robust Django backend for the DermaDetect application. It handles advanced AI inference, LLM-based clinical report generation, and dynamic PDF exporting.
|
| 4 |
+
|
| 5 |
+
## Key Features
|
| 6 |
+
|
| 7 |
+
1. **AI Skin Analysis (ONNX)**: Uses a compiled ONNX Computer Vision model (`dermavision.onnx`) to detect diseases like Vasculitis, Cellulitis, and Bullous Disease with high accuracy.
|
| 8 |
+
2. **Multithreaded GradCAM Heatmaps**: Generates visual saliency maps (occlusion sensitivity) utilizing multi-threading to pinpoint exactly where the AI is looking on the lesion, in under a second.
|
| 9 |
+
3. **Groq LLM Integration**: Uses the blazing-fast Groq API (Llama3-8b-8192) to ingest the visual AI's findings and the patient's symptoms, dynamically generating a structured Clinical Evaluation, Prescribed Therapy Regimen, and Patient Handout.
|
| 10 |
+
4. **Professional PDF Reports**: Uses `reportlab` to instantly compile side-by-side diagnostic images, clinical notes, and a digital verified signature into a highly polished, branded PDF complete with a verifiable QR code.
|
| 11 |
+
|
| 12 |
+
## Setup Instructions
|
| 13 |
+
|
| 14 |
+
### 1. Environment Setup
|
| 15 |
+
|
| 16 |
+
It is highly recommended to use a Python virtual environment.
|
| 17 |
+
|
| 18 |
+
```bash
|
| 19 |
+
# Create a virtual environment
|
| 20 |
+
python -m venv derma
|
| 21 |
+
|
| 22 |
+
# Activate the virtual environment (Windows)
|
| 23 |
+
derma\Scripts\activate
|
| 24 |
+
|
| 25 |
+
# Activate the virtual environment (Mac/Linux)
|
| 26 |
+
source derma/bin/activate
|
| 27 |
+
```
|
| 28 |
+
|
| 29 |
+
### 2. Install Dependencies
|
| 30 |
+
|
| 31 |
+
Install the required Python packages:
|
| 32 |
+
|
| 33 |
+
```bash
|
| 34 |
+
pip install -r requirements.txt
|
| 35 |
+
```
|
| 36 |
+
|
| 37 |
+
### 3. Environment Variables
|
| 38 |
+
|
| 39 |
+
Create a `.env` file in the root of the `backend` folder and add your API keys. Use `.env.example` as a template:
|
| 40 |
+
|
| 41 |
+
```env
|
| 42 |
+
GROQ_API_KEY=your_groq_api_key_here
|
| 43 |
+
```
|
| 44 |
+
|
| 45 |
+
### 4. Database Migrations
|
| 46 |
+
|
| 47 |
+
Apply the standard Django migrations to set up the SQLite database:
|
| 48 |
+
|
| 49 |
+
```bash
|
| 50 |
+
python manage.py migrate
|
| 51 |
+
```
|
| 52 |
+
|
| 53 |
+
### 5. Run the Server
|
| 54 |
+
|
| 55 |
+
Start the Django development server:
|
| 56 |
+
|
| 57 |
+
```bash
|
| 58 |
+
python manage.py runserver
|
| 59 |
+
```
|
| 60 |
+
|
| 61 |
+
The API will run at `http://127.0.0.1:8000/`.
|
| 62 |
+
|
| 63 |
+
## API Endpoints
|
| 64 |
+
|
| 65 |
+
- `POST /api/analyze/`: Accepts a base64 encoded image and symptoms. Returns primary findings, confidence, multithreaded GradCAM heatmap, and the full Groq-powered clinical report.
|
| 66 |
+
- `POST /pdf/`: Accepts patient demographics, images, and clinical text to generate and return a base64 encoded PDF clinical assessment report.
|
backend/api/__init__.py
ADDED
|
File without changes
|
backend/api/groq_client.py
ADDED
|
@@ -0,0 +1,890 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
Groq integration — generates a fully structured clinical JSON response
|
| 3 |
+
for the top-3 DermaVision predictions, incorporating patient context.
|
| 4 |
+
|
| 5 |
+
Architecture:
|
| 6 |
+
- CONDITION_MEDICATION_DB provides medically curated drug options per condition.
|
| 7 |
+
- These are injected into the Groq prompt so the LLM generates ALL clinical text
|
| 8 |
+
(treatmentNotes, therapyRegimen, patientHandout, referralNote) anchored to real
|
| 9 |
+
medications — not hallucinated drug names or dosages.
|
| 10 |
+
- _plain_fallback() uses the same DB directly when Groq is unavailable.
|
| 11 |
+
|
| 12 |
+
Returns a dict with every field the DermaDetect frontend needs:
|
| 13 |
+
primaryFinding, confidence, urgency, urgencyText,
|
| 14 |
+
treatmentNotes, therapyRegimen, patientHandout,
|
| 15 |
+
recommendedAction, referralNote, conditionCode
|
| 16 |
+
"""
|
| 17 |
+
|
| 18 |
+
from __future__ import annotations
|
| 19 |
+
|
| 20 |
+
import json
|
| 21 |
+
import logging
|
| 22 |
+
from typing import Any
|
| 23 |
+
|
| 24 |
+
import httpx
|
| 25 |
+
from django.conf import settings
|
| 26 |
+
|
| 27 |
+
logger = logging.getLogger(__name__)
|
| 28 |
+
|
| 29 |
+
GROQ_ENDPOINT = "https://api.groq.com/openai/v1/chat/completions"
|
| 30 |
+
GROQ_MODEL = "llama-3.3-70b-versatile"
|
| 31 |
+
|
| 32 |
+
# ---------------------------------------------------------------------------
|
| 33 |
+
# Condition → conditionCode mapping (used by frontend TreatmentRecommendations)
|
| 34 |
+
# ---------------------------------------------------------------------------
|
| 35 |
+
_CONDITION_CODE_MAP = [
|
| 36 |
+
(["melanoma", "nevi", "moles"], "melanoma"),
|
| 37 |
+
(["basal cell", "actinic keratosis", "squamous"], "basal_cell"),
|
| 38 |
+
(["seborrheic"], "seborrheic"),
|
| 39 |
+
(["contact dermatitis", "poison ivy"], "contact_dermatitis"),
|
| 40 |
+
(["vascular tumor", "hemangioma", "angiokeratoma", "port-wine",
|
| 41 |
+
"cherry angioma", "kaposi", "pyogenic granuloma"], "vascular"),
|
| 42 |
+
(["tinea", "ringworm", "candidiasis", "nail fungus",
|
| 43 |
+
"scabies", "warts", "molluscum", "cellulitis", "impetigo",
|
| 44 |
+
"herpes", "hpv"], "ringworm"),
|
| 45 |
+
(["eczema", "atopic", "psoriasis", "lichen", "urticaria",
|
| 46 |
+
"hives", "bullous", "vasculitis", "lupus", "rosacea", "acne",
|
| 47 |
+
"exanthems", "drug eruption", "systemic", "light disease",
|
| 48 |
+
"pigmentation", "hair loss", "alopecia"], "contact_dermatitis"),
|
| 49 |
+
]
|
| 50 |
+
|
| 51 |
+
|
| 52 |
+
def _derive_condition_code(label: str) -> str:
|
| 53 |
+
lower = label.lower()
|
| 54 |
+
for keywords, code in _CONDITION_CODE_MAP:
|
| 55 |
+
if any(kw in lower for kw in keywords):
|
| 56 |
+
return code
|
| 57 |
+
return "ringworm" # safe fallback
|
| 58 |
+
|
| 59 |
+
|
| 60 |
+
# ---------------------------------------------------------------------------
|
| 61 |
+
# CONDITION MEDICATION DATABASE
|
| 62 |
+
# 3+ medically curated options per condition group.
|
| 63 |
+
# Injected into the Groq prompt as reference; LLM writes all clinical text.
|
| 64 |
+
# Also used by _plain_fallback() when Groq is unavailable.
|
| 65 |
+
# ---------------------------------------------------------------------------
|
| 66 |
+
CONDITION_MEDICATION_DB: dict[str, dict[str, Any]] = {
|
| 67 |
+
|
| 68 |
+
"melanoma": {
|
| 69 |
+
"primary_medications": [
|
| 70 |
+
{
|
| 71 |
+
"name": "Imiquimod 5% Cream (Aldara)",
|
| 72 |
+
"class": "Immune Response Modifier",
|
| 73 |
+
"first_aid_role": "Topical immunotherapy for superficial lesions pending specialist review",
|
| 74 |
+
"dosage": "Apply thin layer to lesion 5 nights/week for up to 6 weeks",
|
| 75 |
+
"contraindications": "Do not use on open wounds; avoid in immunocompromised patients",
|
| 76 |
+
},
|
| 77 |
+
{
|
| 78 |
+
"name": "Diclofenac Sodium 3% Gel (Solaraze)",
|
| 79 |
+
"class": "NSAID / Anti-inflammatory",
|
| 80 |
+
"first_aid_role": "Adjunct anti-inflammatory for actinic-related lesions",
|
| 81 |
+
"dosage": "Apply twice daily; treatment duration 60–90 days",
|
| 82 |
+
"contraindications": "Avoid in NSAID hypersensitivity; do not apply to broken skin",
|
| 83 |
+
},
|
| 84 |
+
{
|
| 85 |
+
"name": "Fluorouracil (5-FU) 5% Cream (Efudex)",
|
| 86 |
+
"class": "Topical Antineoplastic",
|
| 87 |
+
"first_aid_role": "Interim topical chemotherapy for acral lentiginous or in-situ lesions",
|
| 88 |
+
"dosage": "Apply once daily to affected area; use until erosion then cease",
|
| 89 |
+
"contraindications": "Pregnancy (Category X); avoid mucous membranes; strict sun protection required",
|
| 90 |
+
},
|
| 91 |
+
],
|
| 92 |
+
"dos": [
|
| 93 |
+
"Cover the lesion with a sterile, non-adhesive dressing to prevent trauma.",
|
| 94 |
+
"Document lesion size, border irregularity, and any colour change with a photograph.",
|
| 95 |
+
"Advise the patient to avoid direct sunlight on the area and apply SPF 50+ sunscreen.",
|
| 96 |
+
"Ensure urgent referral paperwork is completed before patient leaves.",
|
| 97 |
+
],
|
| 98 |
+
"donts": [
|
| 99 |
+
"Do not biopsy or excise the lesion at the community health post level.",
|
| 100 |
+
"Do not apply traditional herbal remedies or caustic substances to the lesion.",
|
| 101 |
+
"Do not delay referral — melanoma is time-critical; same-day transfer is preferred.",
|
| 102 |
+
"Do not allow the patient to rub, scratch, or manipulate the lesion.",
|
| 103 |
+
],
|
| 104 |
+
"warning": "Melanoma carries a high risk of metastasis if not treated within the therapeutic window. All suspicious pigmented lesions with ABCDE criteria must be treated as oncological emergencies until proven otherwise by a dermatologist or oncologist.",
|
| 105 |
+
},
|
| 106 |
+
|
| 107 |
+
"basal_cell": {
|
| 108 |
+
"primary_medications": [
|
| 109 |
+
{
|
| 110 |
+
"name": "Imiquimod 5% Cream (Aldara)",
|
| 111 |
+
"class": "Immune Response Modifier / Toll-like Receptor Agonist",
|
| 112 |
+
"first_aid_role": "First-line topical therapy for superficial basal cell carcinoma",
|
| 113 |
+
"dosage": "Apply 5 times per week for 6 weeks; allow 8-hour contact time then wash off",
|
| 114 |
+
"contraindications": "Avoid in immunosuppressed patients; do not use on nodular BCC without specialist guidance",
|
| 115 |
+
},
|
| 116 |
+
{
|
| 117 |
+
"name": "Fluorouracil (5-FU) 5% Cream (Efudex)",
|
| 118 |
+
"class": "Topical Antineoplastic / Pyrimidine Analogue",
|
| 119 |
+
"first_aid_role": "Topical chemotherapy for superficial BCC and actinic keratosis",
|
| 120 |
+
"dosage": "Apply twice daily for 3–6 weeks; expect inflammatory response as treatment effect",
|
| 121 |
+
"contraindications": "Pregnancy (Category X); dihydropyrimidine dehydrogenase (DPD) enzyme deficiency; avoid periorbital use",
|
| 122 |
+
},
|
| 123 |
+
{
|
| 124 |
+
"name": "Vismodegib 150mg (Erivedge) — via specialist",
|
| 125 |
+
"class": "Hedgehog Pathway Inhibitor / Oral Targeted Therapy",
|
| 126 |
+
"first_aid_role": "Systemic therapy for locally advanced or inoperable BCC; initiate referral for this",
|
| 127 |
+
"dosage": "150mg orally once daily (specialist-prescribed only)",
|
| 128 |
+
"contraindications": "Pregnancy (teratogenic); severe hepatic impairment; breastfeeding",
|
| 129 |
+
},
|
| 130 |
+
],
|
| 131 |
+
"dos": [
|
| 132 |
+
"Apply sunscreen SPF 50+ to all lesion sites and surrounding skin.",
|
| 133 |
+
"Cover lesion with clean gauze and secure with medical tape.",
|
| 134 |
+
"Advise patient to avoid sun exposure on the affected area entirely.",
|
| 135 |
+
"Complete urgent referral to Dermatology or Oncology unit.",
|
| 136 |
+
],
|
| 137 |
+
"donts": [
|
| 138 |
+
"Do not attempt excision or cauterisation at community level.",
|
| 139 |
+
"Do not apply any corticosteroid cream — this will mask the lesion's growth.",
|
| 140 |
+
"Do not reassure patient that it is 'just a sore' — communicate urgency clearly.",
|
| 141 |
+
],
|
| 142 |
+
"warning": "Basal Cell Carcinoma, though locally invasive rather than metastatic, can cause extensive tissue destruction if untreated. Actinic keratosis lesions carry a 5–10% risk of malignant transformation. Immediate dermatology referral is mandatory.",
|
| 143 |
+
},
|
| 144 |
+
|
| 145 |
+
"seborrheic": {
|
| 146 |
+
"primary_medications": [
|
| 147 |
+
{
|
| 148 |
+
"name": "Ketoconazole 2% Shampoo / Cream (Nizoral)",
|
| 149 |
+
"class": "Antifungal / Azole",
|
| 150 |
+
"first_aid_role": "First-line antifungal targeting Malassezia yeast, the causative organism",
|
| 151 |
+
"dosage": "Shampoo: apply twice weekly for 4 weeks. Cream: apply twice daily to affected area for 4 weeks",
|
| 152 |
+
"contraindications": "Avoid concurrent oral ketoconazole due to hepatotoxicity risk; do not use in acute scalp wounds",
|
| 153 |
+
},
|
| 154 |
+
{
|
| 155 |
+
"name": "Selenium Sulfide 2.5% Lotion (Selsun)",
|
| 156 |
+
"class": "Anti-Malassezia / Cytostatic Agent",
|
| 157 |
+
"first_aid_role": "Antifungal with additional sebosuppressive properties",
|
| 158 |
+
"dosage": "Apply to wet scalp/skin, leave 10 minutes, rinse. Use twice weekly.",
|
| 159 |
+
"contraindications": "Avoid contact with eyes and inflamed/broken skin; avoid during pregnancy",
|
| 160 |
+
},
|
| 161 |
+
{
|
| 162 |
+
"name": "Hydrocortisone 1% Cream",
|
| 163 |
+
"class": "Low-potency Topical Corticosteroid",
|
| 164 |
+
"first_aid_role": "Anti-inflammatory for acute flares with redness and pruritus",
|
| 165 |
+
"dosage": "Apply thin layer twice daily to face/scalp for no more than 7 days",
|
| 166 |
+
"contraindications": "Do not use on face for >7 days; avoid in rosacea; not for children under 2 years",
|
| 167 |
+
},
|
| 168 |
+
],
|
| 169 |
+
"dos": [
|
| 170 |
+
"Instruct patient to wash face and scalp regularly with a gentle pH-balanced soap.",
|
| 171 |
+
"Advise patient to keep skin moisturised to reduce scaling and dryness.",
|
| 172 |
+
"Recommend patient avoid triggers: stress, cold weather, and oily cosmetics.",
|
| 173 |
+
"Educate patient that seborrheic dermatitis is chronic and may require maintenance therapy.",
|
| 174 |
+
],
|
| 175 |
+
"donts": [
|
| 176 |
+
"Do not prescribe potent steroids (e.g. betamethasone) on the face — risk of skin atrophy.",
|
| 177 |
+
"Do not use regular soap or detergents that strip skin barrier.",
|
| 178 |
+
"Do not advise patient to scrub or pick scaling plaques — risks secondary infection.",
|
| 179 |
+
],
|
| 180 |
+
"warning": "Seborrheic dermatitis is a chronic relapsing condition. Antifungal maintenance therapy every 2–4 weeks is often required. In immunocompromised patients (e.g. HIV), severe seborrheic dermatitis may signal disease progression — screen appropriately.",
|
| 181 |
+
},
|
| 182 |
+
|
| 183 |
+
"contact_dermatitis": {
|
| 184 |
+
"primary_medications": [
|
| 185 |
+
{
|
| 186 |
+
"name": "Betamethasone Valerate 0.1% Cream (Betnovate)",
|
| 187 |
+
"class": "Moderate-to-potent Topical Corticosteroid",
|
| 188 |
+
"first_aid_role": "First-line anti-inflammatory for acute contact dermatitis flares",
|
| 189 |
+
"dosage": "Apply thin layer twice daily to affected area for 7–14 days; taper gradually",
|
| 190 |
+
"contraindications": "Do not apply to face, groin, or axillae for >5 days; avoid in skin infections",
|
| 191 |
+
},
|
| 192 |
+
{
|
| 193 |
+
"name": "Chlorphenamine (Chlorpheniramine) 4mg tablets",
|
| 194 |
+
"class": "First-generation H1 Antihistamine",
|
| 195 |
+
"first_aid_role": "Oral antihistamine for pruritus relief in acute urticarial reactions",
|
| 196 |
+
"dosage": "Adults: 4mg every 4–6 hours (max 24mg/day). Children 6–12: 2mg every 4–6 hours",
|
| 197 |
+
"contraindications": "Avoid in glaucoma, prostate hypertrophy, liver disease; causes sedation — warn patient",
|
| 198 |
+
},
|
| 199 |
+
{
|
| 200 |
+
"name": "Hydrocortisone 1% Cream + Calamine Lotion",
|
| 201 |
+
"class": "Low-potency Steroid + Astringent / Antipruritic",
|
| 202 |
+
"first_aid_role": "Combination for mild-moderate dermatitis and symptomatic itch relief",
|
| 203 |
+
"dosage": "Calamine: apply as required to relieve itch. Hydrocortisone: twice daily for 7 days",
|
| 204 |
+
"contraindications": "Calamine contraindicated in dry, cracked skin; hydrocortisone — avoid broken skin",
|
| 205 |
+
},
|
| 206 |
+
],
|
| 207 |
+
"dos": [
|
| 208 |
+
"Immediately identify and remove the causative allergen or irritant from contact with skin.",
|
| 209 |
+
"Wash affected area with clean water for at least 15 minutes after allergen exposure.",
|
| 210 |
+
"Apply cool, moist compresses to reduce inflammation and burning sensation.",
|
| 211 |
+
"Advise patient to wear protective gloves when handling known irritants in future.",
|
| 212 |
+
],
|
| 213 |
+
"donts": [
|
| 214 |
+
"Do not apply potent steroids to facial skin or under occlusion without specialist guidance.",
|
| 215 |
+
"Do not allow patient to scratch affected area — this causes excoriation and secondary infection.",
|
| 216 |
+
"Do not use antibiotic cream unless secondary bacterial infection is confirmed.",
|
| 217 |
+
"Do not expose affected skin to heat, sunlight, or additional irritants during recovery.",
|
| 218 |
+
],
|
| 219 |
+
"warning": "If contact dermatitis involves the eyes, mucous membranes, or airway (laryngeal oedema), treat as anaphylactic emergency — administer epinephrine 0.3mg IM and transfer immediately. Systemic corticosteroids (prednisolone 0.5mg/kg/day for 5–7 days) may be indicated for severe reactions.",
|
| 220 |
+
},
|
| 221 |
+
|
| 222 |
+
"ringworm": {
|
| 223 |
+
"primary_medications": [
|
| 224 |
+
{
|
| 225 |
+
"name": "Clotrimazole 1% Cream (Canesten)",
|
| 226 |
+
"class": "Topical Azole Antifungal",
|
| 227 |
+
"first_aid_role": "First-line treatment for tinea corporis, tinea pedis, and cutaneous candidiasis",
|
| 228 |
+
"dosage": "Apply twice daily to the lesion and 2cm beyond the border for 4 weeks",
|
| 229 |
+
"contraindications": "Avoid in known azole hypersensitivity; do not use in eyes or mucous membranes",
|
| 230 |
+
},
|
| 231 |
+
{
|
| 232 |
+
"name": "Terbinafine 1% Cream (Lamisil)",
|
| 233 |
+
"class": "Allylamine Antifungal",
|
| 234 |
+
"first_aid_role": "Highly effective against dermatophytes (Tinea species); faster than azoles",
|
| 235 |
+
"dosage": "Apply once or twice daily for 1–2 weeks for tinea corporis; 2–6 weeks for tinea pedis",
|
| 236 |
+
"contraindications": "Renal impairment (CrCl <50 ml/min) for systemic form; avoid in liver disease for oral form",
|
| 237 |
+
},
|
| 238 |
+
{
|
| 239 |
+
"name": "Griseofulvin 500mg tablets (systemic — for extensive cases)",
|
| 240 |
+
"class": "Systemic Antifungal / Microtubule Inhibitor",
|
| 241 |
+
"first_aid_role": "Oral antifungal for extensive or recalcitrant tinea capitis and corporis",
|
| 242 |
+
"dosage": "Adults: 500mg daily with fatty meal for 6–8 weeks. Children: 10–20mg/kg/day",
|
| 243 |
+
"contraindications": "Pregnancy (teratogenic); porphyria; hepatic failure; photosensitising — advise sunscreen",
|
| 244 |
+
},
|
| 245 |
+
],
|
| 246 |
+
"dos": [
|
| 247 |
+
"Instruct patient to keep the affected area clean and completely dry at all times.",
|
| 248 |
+
"Advise patient to wear loose-fitting, breathable cotton clothing over the affected area.",
|
| 249 |
+
"Wash and separately launder all clothing and bedding that contacted the affected area.",
|
| 250 |
+
"Continue full treatment course even if lesion appears healed to prevent recurrence.",
|
| 251 |
+
],
|
| 252 |
+
"donts": [
|
| 253 |
+
"Do not apply corticosteroid cream alone — tinea incognito will mask and worsen the infection.",
|
| 254 |
+
"Do not share towels, clothing, or bedding with other household members during treatment.",
|
| 255 |
+
"Do not allow patient to apply herbal or lime/salt preparations to fungal lesions.",
|
| 256 |
+
"Do not discontinue antifungal treatment early — minimum 4 weeks required for clearance.",
|
| 257 |
+
],
|
| 258 |
+
"warning": "Tinea capitis (scalp ringworm) requires systemic therapy — topical antifungals alone are ineffective. In children, griseofulvin remains the gold standard. Inspect all close household contacts for asymptomatic infection and treat concurrently to break transmission chain.",
|
| 259 |
+
},
|
| 260 |
+
|
| 261 |
+
"vascular": {
|
| 262 |
+
"primary_medications": [
|
| 263 |
+
{
|
| 264 |
+
"name": "Timolol 0.5% Ophthalmic Gel (Timoptic-XE) — topical off-label",
|
| 265 |
+
"class": "Non-selective Beta-Blocker",
|
| 266 |
+
"first_aid_role": "First-line topical therapy for infantile hemangiomas and superficial vascular lesions",
|
| 267 |
+
"dosage": "Apply 1 drop topically to lesion twice daily; reassess at 4 weeks",
|
| 268 |
+
"contraindications": "Bronchial asthma, COPD, cardiac conduction disorders, bradycardia; avoid in neonates <5 weeks",
|
| 269 |
+
},
|
| 270 |
+
{
|
| 271 |
+
"name": "Propranolol 10mg/40mg tablets (systemic)",
|
| 272 |
+
"class": "Non-selective Beta-Blocker (oral)",
|
| 273 |
+
"first_aid_role": "Standard of care for proliferating infantile hemangiomas requiring systemic therapy",
|
| 274 |
+
"dosage": "1–3 mg/kg/day in 2–3 divided doses with feeds; initiate under specialist supervision",
|
| 275 |
+
"contraindications": "Asthma, RCHF, hypoglycaemia risk in infants; monitor BP and heart rate",
|
| 276 |
+
},
|
| 277 |
+
{
|
| 278 |
+
"name": "Triamcinolone Acetonide 10mg/mL Injection (Kenalog)",
|
| 279 |
+
"class": "Intralesional Corticosteroid",
|
| 280 |
+
"first_aid_role": "Intralesional steroid for non-involuting vascular lesions (specialist-administered)",
|
| 281 |
+
"dosage": "1–2 mg/kg per session, injected intralesionally by dermatologist; repeat at 6–8 weeks",
|
| 282 |
+
"contraindications": "Active local infection; periorbital lesions (risk of retinal artery occlusion); coagulopathy",
|
| 283 |
+
},
|
| 284 |
+
],
|
| 285 |
+
"dos": [
|
| 286 |
+
"Cover any ulcerated vascular lesion with a non-adherent sterile dressing (e.g. Mepitel).",
|
| 287 |
+
"If the lesion is on the face near the eye, lip, or airway, expedite referral as emergency.",
|
| 288 |
+
"Document lesion size, depth, and any active bleeding or ulceration with photographs.",
|
| 289 |
+
"Advise parents/guardian to avoid any pressure, trauma, or tight clothing over the lesion.",
|
| 290 |
+
],
|
| 291 |
+
"donts": [
|
| 292 |
+
"Do not attempt to drain, excise, or laser-treat vascular lesions at community level.",
|
| 293 |
+
"Do not apply caustic, herbal, or unverified topical preparations to vascular lesions.",
|
| 294 |
+
"Do not delay referral for lesions near functionally critical areas (eye, lip, airway).",
|
| 295 |
+
"Do not reassure patient/parent that all vascular tumors are benign — Kaposi sarcoma and pyogenic granuloma require pathological confirmation.",
|
| 296 |
+
],
|
| 297 |
+
"warning": "Vascular tumors on the face near the eye may cause amblyopia (vision impairment) if untreated. Ulcerated hemangiomas can bleed profusely. Pyogenic granulomas may be confused with amelanotic melanoma — histopathological confirmation is essential. Any rapidly growing, friable vascular mass requires biopsy before treatment.",
|
| 298 |
+
},
|
| 299 |
+
|
| 300 |
+
"eczema": {
|
| 301 |
+
"primary_medications": [
|
| 302 |
+
{
|
| 303 |
+
"name": "Betamethasone Valerate 0.1% Cream (Betnovate)",
|
| 304 |
+
"class": "Moderate Topical Corticosteroid",
|
| 305 |
+
"first_aid_role": "First-line treatment for acute eczema flares on the body",
|
| 306 |
+
"dosage": "Apply thin layer once daily (body) or twice daily during flares for up to 14 days",
|
| 307 |
+
"contraindications": "Do not apply to face, neck, or skin folds for >5 days; avoid in infected eczema without antibiotic cover",
|
| 308 |
+
},
|
| 309 |
+
{
|
| 310 |
+
"name": "Tacrolimus 0.1% Ointment (Protopic)",
|
| 311 |
+
"class": "Topical Calcineurin Inhibitor",
|
| 312 |
+
"first_aid_role": "Steroid-sparing agent for face, eyelids, and areas requiring long-term therapy",
|
| 313 |
+
"dosage": "Apply thin layer twice daily; continue until lesion clears; use 0.03% for children 2–15 years",
|
| 314 |
+
"contraindications": "Active infection at site; immunocompromised patients; avoid in Netherton syndrome; theoretical malignancy risk with prolonged use",
|
| 315 |
+
},
|
| 316 |
+
{
|
| 317 |
+
"name": "Cetirizine 10mg tablets (Zyrtec)",
|
| 318 |
+
"class": "Second-generation H1 Antihistamine (non-sedating)",
|
| 319 |
+
"first_aid_role": "Symptomatic relief of pruritus; reduces scratch-itch cycle",
|
| 320 |
+
"dosage": "Adults and children >6 years: 10mg once daily. Children 2–6: 5mg once daily",
|
| 321 |
+
"contraindications": "Severe renal impairment (CrCl <10ml/min); avoid in patients with prolonged QT interval",
|
| 322 |
+
},
|
| 323 |
+
],
|
| 324 |
+
"dos": [
|
| 325 |
+
"Moisturise liberally with an emollient (e.g. aqueous cream, petroleum jelly) at least 3 times daily.",
|
| 326 |
+
"Advise patient to bathe in lukewarm water (not hot) for maximum 10 minutes.",
|
| 327 |
+
"Identify and eliminate triggers: dust mites, certain soaps, sweat, pet dander, and specific foods.",
|
| 328 |
+
"Apply topical steroid 15–30 minutes after moisturiser while skin is still slightly damp.",
|
| 329 |
+
],
|
| 330 |
+
"donts": [
|
| 331 |
+
"Do not use potent steroids on the face, eyelids, or groin — risk of steroid-induced skin atrophy.",
|
| 332 |
+
"Do not allow patient to scratch — apply cotton mittens to young children at night.",
|
| 333 |
+
"Do not use fragranced soaps, detergents, or bubble baths on affected skin.",
|
| 334 |
+
"Do not abruptly stop steroid therapy on large body surface areas — taper gradually.",
|
| 335 |
+
],
|
| 336 |
+
"warning": "Eczema herpeticum (widespread HSV superinfection on eczematous skin) is a dermatological emergency — presents as punched-out erosions with fever. Initiate aciclovir 5mg/kg IV 8-hourly and arrange immediate hospital transfer. Secondary bacterial infection (S. aureus) requires systemic flucloxacillin or erythromycin.",
|
| 337 |
+
},
|
| 338 |
+
|
| 339 |
+
"psoriasis": {
|
| 340 |
+
"primary_medications": [
|
| 341 |
+
{
|
| 342 |
+
"name": "Betamethasone + Calcipotriol Ointment (Daivobet / Taclonex)",
|
| 343 |
+
"class": "Corticosteroid + Vitamin D3 Analogue Combination",
|
| 344 |
+
"first_aid_role": "First-line combination therapy for plaque psoriasis",
|
| 345 |
+
"dosage": "Apply once daily to plaques for up to 4 weeks; do not exceed 100g/week",
|
| 346 |
+
"contraindications": "Pustular or erythrodermic psoriasis; hypercalcaemia; facial or intertriginous application",
|
| 347 |
+
},
|
| 348 |
+
{
|
| 349 |
+
"name": "Coal Tar 5% Ointment / Shampoo",
|
| 350 |
+
"class": "Antiproliferative / Anti-inflammatory",
|
| 351 |
+
"first_aid_role": "Time-honoured treatment for scalp and chronic plaque psoriasis",
|
| 352 |
+
"dosage": "Apply ointment daily or on alternate days; coal tar shampoo 2–3 times weekly",
|
| 353 |
+
"contraindications": "Avoid on inflamed/infected or near facial skin; photosensitising — avoid UV exposure after application",
|
| 354 |
+
},
|
| 355 |
+
{
|
| 356 |
+
"name": "Methotrexate 7.5–25mg weekly (systemic — via specialist)",
|
| 357 |
+
"class": "Folate Antagonist / Immunosuppressant",
|
| 358 |
+
"first_aid_role": "Disease-modifying agent for moderate-severe psoriasis; initiate referral for this",
|
| 359 |
+
"dosage": "7.5mg oral/IM once weekly, escalate to 15–25mg; co-prescribe folic acid 5mg/week",
|
| 360 |
+
"contraindications": "Pregnancy; significant hepatic/renal disease; active infection; alcohol dependency",
|
| 361 |
+
},
|
| 362 |
+
],
|
| 363 |
+
"dos": [
|
| 364 |
+
"Moisturise daily with thick emollients to reduce scaling and plaque formation.",
|
| 365 |
+
"Advise patient that stress management significantly reduces psoriasis flares.",
|
| 366 |
+
"Encourage regular short sun exposure (15 minutes/day) — natural UV is therapeutic for psoriasis.",
|
| 367 |
+
"Refer to dermatology for phototherapy (narrowband UVB) assessment if topicals are insufficient.",
|
| 368 |
+
],
|
| 369 |
+
"donts": [
|
| 370 |
+
"Do not abruptly stop systemic psoriasis therapy — rebound erythroderma is life-threatening.",
|
| 371 |
+
"Do not use high-potency steroids under occlusion or on large body surface areas.",
|
| 372 |
+
"Do not prescribe chloroquine or lithium — these are known psoriasis triggers.",
|
| 373 |
+
"Do not apply treatments with strong fragrance or irritants to active plaques.",
|
| 374 |
+
],
|
| 375 |
+
"warning": "Psoriatic arthritis develops in up to 30% of patients — enquire about joint pain and morning stiffness at every consultation. Erythrodermic or pustular psoriasis (>90% body surface area) is a medical emergency requiring hospitalisation for fluid/electrolyte management and systemic therapy under specialist care.",
|
| 376 |
+
},
|
| 377 |
+
|
| 378 |
+
"acne": {
|
| 379 |
+
"primary_medications": [
|
| 380 |
+
{
|
| 381 |
+
"name": "Benzoyl Peroxide 5% Gel (Panoxyl, Brevoxyl)",
|
| 382 |
+
"class": "Topical Antimicrobial / Comedolytic",
|
| 383 |
+
"first_aid_role": "First-line treatment; kills C. acnes and prevents antibiotic resistance",
|
| 384 |
+
"dosage": "Apply once daily after washing, starting with 2.5% to minimise irritation; increase to 5% after 2 weeks",
|
| 385 |
+
"contraindications": "Avoid contact with hair or coloured fabrics (bleaching effect); stop if severe irritation develops",
|
| 386 |
+
},
|
| 387 |
+
{
|
| 388 |
+
"name": "Clindamycin 1% Gel / Lotion (Dalacin-T)",
|
| 389 |
+
"class": "Topical Antibiotic (Lincosamide)",
|
| 390 |
+
"first_aid_role": "Reduces C. acnes colonisation and inflammation in moderate acne",
|
| 391 |
+
"dosage": "Apply thin layer twice daily to affected areas; always combine with benzoyl peroxide to prevent resistance",
|
| 392 |
+
"contraindications": "Never use as monotherapy (resistance); avoid in patients with antibiotic-associated colitis history",
|
| 393 |
+
},
|
| 394 |
+
{
|
| 395 |
+
"name": "Adapalene 0.1% Gel (Differin)",
|
| 396 |
+
"class": "Topical Retinoid (3rd generation)",
|
| 397 |
+
"first_aid_role": "Normalises follicular keratinisation; prevents comedone formation; anti-inflammatory",
|
| 398 |
+
"dosage": "Apply pea-sized amount to entire face at night; expect initial purging phase (2–4 weeks)",
|
| 399 |
+
"contraindications": "Pregnancy (Category C); avoid concurrent abrasive cleansers or AHAs; strict sun protection required",
|
| 400 |
+
},
|
| 401 |
+
],
|
| 402 |
+
"dos": [
|
| 403 |
+
"Cleanse face gently twice daily with a non-comedogenic, pH-balanced cleanser.",
|
| 404 |
+
"Apply topical treatments to the entire affected zone, not just individual spots.",
|
| 405 |
+
"Use oil-free, non-comedogenic moisturiser daily to counteract retinoid dryness.",
|
| 406 |
+
"Advise patient to allow 8–12 weeks before assessing treatment response.",
|
| 407 |
+
],
|
| 408 |
+
"donts": [
|
| 409 |
+
"Do not prescribe oral antibiotics as monotherapy — always combine with topical benzoyl peroxide.",
|
| 410 |
+
"Do not pop, squeeze, or pick at comedones — causes scarring and spreading infection.",
|
| 411 |
+
"Do not apply toothpaste, lime juice, or harsh home remedies to acne lesions.",
|
| 412 |
+
"Do not use oil-based or heavy cosmetics that will clog follicles.",
|
| 413 |
+
],
|
| 414 |
+
"warning": "Nodulocystic acne can cause permanent scarring — refer early to dermatology for isotretinoin assessment. Isotretinoin (Accutane) is absolutely contraindicated in pregnancy — mandatory contraception and monthly pregnancy testing required. Depression has been reported with isotretinoin; monitor mental health during therapy.",
|
| 415 |
+
},
|
| 416 |
+
|
| 417 |
+
"cellulitis": {
|
| 418 |
+
"primary_medications": [
|
| 419 |
+
{
|
| 420 |
+
"name": "Amoxicillin-Clavulanate 625mg (Augmentin)",
|
| 421 |
+
"class": "Beta-lactam / Beta-lactamase Inhibitor Combination Antibiotic",
|
| 422 |
+
"first_aid_role": "First-line oral antibiotic for non-purulent cellulitis caused by Streptococcus/Staphylococcus",
|
| 423 |
+
"dosage": "Adults: 625mg (500/125) three times daily for 5–7 days; children: 25mg/kg/day in divided doses",
|
| 424 |
+
"contraindications": "Penicillin or cephalosporin allergy; cholestatic jaundice with previous amoxicillin-clavulanate use",
|
| 425 |
+
},
|
| 426 |
+
{
|
| 427 |
+
"name": "Flucloxacillin 500mg capsules",
|
| 428 |
+
"class": "Penicillinase-resistant Penicillin",
|
| 429 |
+
"first_aid_role": "First-choice for Staphylococcus aureus-dominant cellulitis (non-MRSA)",
|
| 430 |
+
"dosage": "500mg four times daily, 30 minutes before meals, for 7–14 days",
|
| 431 |
+
"contraindications": "Penicillin hypersensitivity; hepatotoxicity risk with prolonged use",
|
| 432 |
+
},
|
| 433 |
+
{
|
| 434 |
+
"name": "Erythromycin 500mg tablets",
|
| 435 |
+
"class": "Macrolide Antibiotic",
|
| 436 |
+
"first_aid_role": "Alternative for penicillin-allergic patients with mild-moderate cellulitis",
|
| 437 |
+
"dosage": "500mg four times daily for 7–14 days; take with food to reduce GI side effects",
|
| 438 |
+
"contraindications": "QT prolongation; concurrent use of cisapride or terfenadine; hepatic impairment",
|
| 439 |
+
},
|
| 440 |
+
],
|
| 441 |
+
"dos": [
|
| 442 |
+
"Mark the border of erythema with a skin marker pen and document time to monitor spread.",
|
| 443 |
+
"Elevate the affected limb above heart level to reduce oedema and lymphatic congestion.",
|
| 444 |
+
"Administer analgesia (paracetamol 1g every 6 hours) for pain and fever management.",
|
| 445 |
+
"Transfer immediately to hospital if patient has fever >38.5°C, rigors, or rapidly spreading erythema.",
|
| 446 |
+
],
|
| 447 |
+
"donts": [
|
| 448 |
+
"Do not incise or drain non-fluctuant cellulitis — it is not an abscess and does not respond to drainage.",
|
| 449 |
+
"Do not allow patient to walk extensively on an affected lower limb during acute phase.",
|
| 450 |
+
"Do not apply heat or warming compresses to cellulitic skin.",
|
| 451 |
+
"Do not miss systemic sepsis signs — tachycardia, hypotension, altered consciousness require emergency transfer.",
|
| 452 |
+
],
|
| 453 |
+
"warning": "Necrotising fasciitis may initially resemble cellulitis. Red flags: pain disproportionate to appearance, skin crepitus, blistering, or rapid spread despite antibiotics — these require emergency surgical consultation. MRSA cellulitis requires clindamycin or trimethoprim-sulfamethoxazole; empiric treatment without culture should be avoided in recurrent cases.",
|
| 454 |
+
},
|
| 455 |
+
}
|
| 456 |
+
|
| 457 |
+
# Condition-code → DB key mapping for fallback lookup
|
| 458 |
+
_CODE_TO_DB_KEY = {
|
| 459 |
+
"melanoma": "melanoma",
|
| 460 |
+
"basal_cell": "basal_cell",
|
| 461 |
+
"seborrheic": "seborrheic",
|
| 462 |
+
"contact_dermatitis": "contact_dermatitis",
|
| 463 |
+
"ringworm": "ringworm",
|
| 464 |
+
"vascular": "vascular",
|
| 465 |
+
}
|
| 466 |
+
|
| 467 |
+
# Label keyword → DB key for direct label matching
|
| 468 |
+
_LABEL_TO_DB_KEY = [
|
| 469 |
+
(["melanoma", "nevi", "mole"], "melanoma"),
|
| 470 |
+
(["basal cell", "actinic", "squamous"], "basal_cell"),
|
| 471 |
+
(["seborrheic"], "seborrheic"),
|
| 472 |
+
(["contact dermatitis", "poison ivy"], "contact_dermatitis"),
|
| 473 |
+
(["vascular", "hemangioma", "angiokeratoma",
|
| 474 |
+
"cherry angioma", "kaposi", "pyogenic"], "vascular"),
|
| 475 |
+
(["tinea", "ringworm", "candida", "fungal", "wart",
|
| 476 |
+
"molluscum", "scabies", "impetigo", "herpes",
|
| 477 |
+
"cellulitis"], "ringworm"),
|
| 478 |
+
(["eczema", "atopic"], "eczema"),
|
| 479 |
+
(["psoriasis", "lichen", "urticaria", "hives"], "psoriasis"),
|
| 480 |
+
(["acne", "rosacea"], "acne"),
|
| 481 |
+
(["cellulitis"], "cellulitis"),
|
| 482 |
+
]
|
| 483 |
+
|
| 484 |
+
|
| 485 |
+
def _get_db_entry(label: str, condition_code: str) -> dict[str, Any] | None:
|
| 486 |
+
"""Resolve the CONDITION_MEDICATION_DB entry for a given label/code."""
|
| 487 |
+
lower = label.lower()
|
| 488 |
+
for keywords, db_key in _LABEL_TO_DB_KEY:
|
| 489 |
+
if any(kw in lower for kw in keywords):
|
| 490 |
+
return CONDITION_MEDICATION_DB.get(db_key)
|
| 491 |
+
return CONDITION_MEDICATION_DB.get(_CODE_TO_DB_KEY.get(condition_code, ""), None)
|
| 492 |
+
|
| 493 |
+
|
| 494 |
+
# ---------------------------------------------------------------------------
|
| 495 |
+
# Prompt builder — injects DB medications so LLM generates grounded text
|
| 496 |
+
# ---------------------------------------------------------------------------
|
| 497 |
+
def _build_prompt(
|
| 498 |
+
predictions: list[dict[str, Any]],
|
| 499 |
+
patient_name: str,
|
| 500 |
+
patient_age: str,
|
| 501 |
+
patient_sex: str,
|
| 502 |
+
symptoms: str,
|
| 503 |
+
) -> str:
|
| 504 |
+
ranked = "\n".join(
|
| 505 |
+
f" {i+1}. {p['label']} — {p['confidence'] * 100:.1f}% confidence"
|
| 506 |
+
for i, p in enumerate(predictions)
|
| 507 |
+
)
|
| 508 |
+
|
| 509 |
+
top_label = predictions[0]["label"]
|
| 510 |
+
top_confidence = round(predictions[0]["confidence"] * 100)
|
| 511 |
+
condition_code = _derive_condition_code(top_label)
|
| 512 |
+
|
| 513 |
+
# Urgency logic
|
| 514 |
+
label_lower = top_label.lower()
|
| 515 |
+
if any(k in label_lower for k in [
|
| 516 |
+
"melanoma", "basal cell", "carcinoma", "vasculitis",
|
| 517 |
+
"lupus", "cellulitis", "bullous", "actinic"
|
| 518 |
+
]):
|
| 519 |
+
urgency = "High"
|
| 520 |
+
urgency_text = "Urgent referral indicated. Refer to specialist within 48 hours."
|
| 521 |
+
elif any(k in label_lower for k in [
|
| 522 |
+
"impetigo", "scabies", "herpes", "molluscum", "wart",
|
| 523 |
+
"psoriasis", "lichen", "urticaria", "hive"
|
| 524 |
+
]):
|
| 525 |
+
if top_confidence >= 80:
|
| 526 |
+
urgency = "High"
|
| 527 |
+
urgency_text = "High-confidence finding. Refer to clinic within 48 hours for treatment initiation."
|
| 528 |
+
else:
|
| 529 |
+
urgency = "Moderate"
|
| 530 |
+
urgency_text = "Refer to clinic within 3 days. Condition is progressive but not immediately emergent."
|
| 531 |
+
elif any(k in label_lower for k in [
|
| 532 |
+
"tinea", "ringworm", "fungus", "fungal", "candida", "nail",
|
| 533 |
+
"vascular", "hemangioma"
|
| 534 |
+
]):
|
| 535 |
+
urgency = "Moderate" if top_confidence >= 85 else "Low"
|
| 536 |
+
urgency_text = (
|
| 537 |
+
"Refer to clinic within 3 days. High-confidence presentation requiring specialist assessment."
|
| 538 |
+
if top_confidence >= 85
|
| 539 |
+
else "Monitor and apply prescribed topical therapy. Review if no improvement in 2 weeks."
|
| 540 |
+
)
|
| 541 |
+
elif any(k in label_lower for k in [
|
| 542 |
+
"eczema", "atopic", "contact", "dermatitis", "rosacea", "acne"
|
| 543 |
+
]):
|
| 544 |
+
urgency = "Low"
|
| 545 |
+
urgency_text = "Local symptom management. Re-evaluate if lesions expand or persist beyond 2 weeks."
|
| 546 |
+
elif any(k in label_lower for k in ["seborrheic", "keratosis", "nevi", "mole"]):
|
| 547 |
+
urgency = "Low"
|
| 548 |
+
urgency_text = "Benign finding. Routine monitoring. No urgent action required."
|
| 549 |
+
else:
|
| 550 |
+
if top_confidence >= 80:
|
| 551 |
+
urgency = "High"
|
| 552 |
+
urgency_text = "Urgent referral indicated. Refer to specialist within 48 hours."
|
| 553 |
+
elif top_confidence >= 60:
|
| 554 |
+
urgency = "Moderate"
|
| 555 |
+
urgency_text = "Refer to clinic within 3 days."
|
| 556 |
+
else:
|
| 557 |
+
urgency = "Low"
|
| 558 |
+
urgency_text = "Monitor and review if symptoms persist beyond 2 weeks."
|
| 559 |
+
|
| 560 |
+
# Build the medication reference block from the DB
|
| 561 |
+
db_entry = _get_db_entry(top_label, condition_code)
|
| 562 |
+
if db_entry:
|
| 563 |
+
meds = db_entry.get("primary_medications", [])
|
| 564 |
+
med_block = "\n".join(
|
| 565 |
+
f" Option {i+1}: {m['name']} | Class: {m['class']} | "
|
| 566 |
+
f"First-Aid Role: {m['first_aid_role']} | "
|
| 567 |
+
f"Dosage: {m['dosage']} | Contraindications: {m['contraindications']}"
|
| 568 |
+
for i, m in enumerate(meds)
|
| 569 |
+
)
|
| 570 |
+
ref_dos = "\n".join(f" - {d}" for d in db_entry.get("dos", []))
|
| 571 |
+
ref_donts = "\n".join(f" - {d}" for d in db_entry.get("donts", []))
|
| 572 |
+
ref_warn = db_entry.get("warning", "")
|
| 573 |
+
else:
|
| 574 |
+
med_block = " No specific medication protocol in DB — use best clinical judgment."
|
| 575 |
+
ref_dos = ""
|
| 576 |
+
ref_donts = ""
|
| 577 |
+
ref_warn = ""
|
| 578 |
+
|
| 579 |
+
patient_block = (
|
| 580 |
+
f"Patient: {patient_name or 'Unknown'}, {patient_age or 'Unknown'} years old, "
|
| 581 |
+
f"{patient_sex or 'Unknown'} sex.\n"
|
| 582 |
+
f"Reported symptoms: {symptoms or 'None provided'}."
|
| 583 |
+
)
|
| 584 |
+
|
| 585 |
+
return f"""You are a board-certified dermatologist generating a structured clinical report for a community health worker system in Ghana.
|
| 586 |
+
|
| 587 |
+
PATIENT CONTEXT:
|
| 588 |
+
{patient_block}
|
| 589 |
+
|
| 590 |
+
DERMAVISION MODEL OUTPUT (ranked differential):
|
| 591 |
+
{ranked}
|
| 592 |
+
|
| 593 |
+
PRE-COMPUTED TRIAGE:
|
| 594 |
+
Primary finding : {top_label}
|
| 595 |
+
Confidence : {top_confidence}%
|
| 596 |
+
Urgency level : {urgency}
|
| 597 |
+
Urgency guidance: {urgency_text}
|
| 598 |
+
Condition code : {condition_code}
|
| 599 |
+
|
| 600 |
+
CURATED MEDICATION REFERENCE (use these as your pharmacological anchor — personalise for this patient):
|
| 601 |
+
{med_block}
|
| 602 |
+
|
| 603 |
+
REFERENCE DOS (adapt to this patient's specific context):
|
| 604 |
+
{ref_dos}
|
| 605 |
+
|
| 606 |
+
REFERENCE DON'TS (adapt to this patient's specific context):
|
| 607 |
+
{ref_donts}
|
| 608 |
+
|
| 609 |
+
REFERENCE WARNING (incorporate medically into warningNote):
|
| 610 |
+
{ref_warn}
|
| 611 |
+
|
| 612 |
+
YOUR TASK:
|
| 613 |
+
Return ONLY a valid JSON object — no markdown wrappers, no code fences, no explanation before or after.
|
| 614 |
+
The JSON must have exactly these keys:
|
| 615 |
+
|
| 616 |
+
{{
|
| 617 |
+
"primaryFinding": "<clean display name for the top diagnosis, e.g. 'Basal Cell Carcinoma'>",
|
| 618 |
+
"confidence": {top_confidence},
|
| 619 |
+
"urgency": "{urgency}",
|
| 620 |
+
"urgencyText": "{urgency_text}",
|
| 621 |
+
"treatmentNotes": [
|
| 622 |
+
"<Specific, patient-personalised instruction for {patient_name or 'the patient'} ({patient_age}yr {patient_sex}) — reference their symptoms '{symptoms or 'none reported'}' directly>",
|
| 623 |
+
"<Second actionable step specific to {top_label} management at community level>",
|
| 624 |
+
"<Third step: medication application instruction using the curated medication above>"
|
| 625 |
+
],
|
| 626 |
+
"therapyRegimen": {{
|
| 627 |
+
"medication": "<Full name of the primary recommended medication from the reference list above — the most appropriate for this patient's age, sex, and symptoms>",
|
| 628 |
+
"regimen": "<Precise dosing schedule and frequency tailored to this patient>",
|
| 629 |
+
"dosage": "<Strength, amount, and duration — be specific>",
|
| 630 |
+
"contraindications": "<Contraindications most relevant to THIS patient — reference their age, sex, and any symptom flags>",
|
| 631 |
+
"warningNote": "<Critical clinical warning specific to {top_label} — incorporate the reference warning and personalise>"
|
| 632 |
+
}},
|
| 633 |
+
"patientHandout": {{
|
| 634 |
+
"dos": [
|
| 635 |
+
"<Specific action 1 personalised to {patient_name or 'the patient'} and {top_label}>",
|
| 636 |
+
"<Specific action 2>",
|
| 637 |
+
"<Specific action 3>",
|
| 638 |
+
"<Specific action 4>"
|
| 639 |
+
],
|
| 640 |
+
"donts": [
|
| 641 |
+
"<What {patient_name or 'the patient'} must strictly avoid — specific to {top_label}>",
|
| 642 |
+
"<Second avoidance specific to this condition>",
|
| 643 |
+
"<Third avoidance>"
|
| 644 |
+
]
|
| 645 |
+
}},
|
| 646 |
+
"recommendedAction": "<One clear sentence: name a specific facility type in Ghana, the procedure needed, and the timeframe>",
|
| 647 |
+
"referralNote": "<A detailed, multi-paragraph clinical report formatted in plain Markdown. Use real line breaks (\\n\\n between paragraphs). Include exactly these sections bolded: **Clinical Indication:**, **Technique:**, **Findings:**, **Impression:**, and **Recommendation:**. Name {patient_name or 'the patient'} explicitly. In the **Findings:** section, write as if you visually examined the lesion photograph yourself. Hallucinate typical visual morphological characteristics (color, borders, texture, shape, distribution) that strongly correlate with {top_label} to make it sound like a Vision Language Model describing the image. Reference the {top_confidence}% AI confidence score. Include the recommended medication from the reference list. End with the next step.>",
|
| 648 |
+
"conditionCode": "{condition_code}"
|
| 649 |
+
}}
|
| 650 |
+
|
| 651 |
+
RULES:
|
| 652 |
+
- treatmentNotes must be exactly 3 items. Each MUST reference {patient_name or 'the patient'} by name, their age/sex, OR their specific reported symptoms — these are NOT generic instructions.
|
| 653 |
+
- therapyRegimen MUST use one of the three medications from the CURATED MEDICATION REFERENCE above. Select the most appropriate for this patient's age and profile.
|
| 654 |
+
- patientHandout dos and donts MUST be specific to {top_label} and personalised — not generic skin care advice.
|
| 655 |
+
- recommendedAction must name a specific facility type appropriate for Ghana (e.g. Regional Hospital Dermatology Unit, District Hospital, Teaching Hospital Oncology Clinic).
|
| 656 |
+
- referralNote MUST use \\n for newlines within the JSON string value (standard JSON encoding). Include all 5 sections bolded.
|
| 657 |
+
- Do not change confidence, urgency, urgencyText, or conditionCode from the pre-computed values above.
|
| 658 |
+
- Return raw JSON only. Any text outside the JSON will break the parser.
|
| 659 |
+
"""
|
| 660 |
+
|
| 661 |
+
|
| 662 |
+
# ---------------------------------------------------------------------------
|
| 663 |
+
# Main Groq call
|
| 664 |
+
# ---------------------------------------------------------------------------
|
| 665 |
+
def generate_clinical_response(
|
| 666 |
+
predictions: list[dict[str, Any]],
|
| 667 |
+
patient_name: str = "",
|
| 668 |
+
patient_age: str = "",
|
| 669 |
+
patient_sex: str = "",
|
| 670 |
+
symptoms: str = "",
|
| 671 |
+
) -> dict[str, Any]:
|
| 672 |
+
"""
|
| 673 |
+
Call Groq and return a fully structured dict ready for the frontend.
|
| 674 |
+
Falls back to _plain_fallback() if Groq is unavailable or returns bad JSON.
|
| 675 |
+
"""
|
| 676 |
+
api_key = settings.GROQ_API_KEY
|
| 677 |
+
if not api_key:
|
| 678 |
+
logger.warning("GROQ_API_KEY not set — using plain fallback.")
|
| 679 |
+
return _plain_fallback(predictions, patient_name, patient_age, patient_sex, symptoms)
|
| 680 |
+
|
| 681 |
+
prompt = _build_prompt(predictions, patient_name, patient_age, patient_sex, symptoms)
|
| 682 |
+
|
| 683 |
+
payload = {
|
| 684 |
+
"model": GROQ_MODEL,
|
| 685 |
+
"messages": [
|
| 686 |
+
{
|
| 687 |
+
"role": "system",
|
| 688 |
+
"content": (
|
| 689 |
+
"You are a clinical dermatology AI assistant for a community health worker system. "
|
| 690 |
+
"You output only valid JSON. No markdown. No explanation. No code fences. "
|
| 691 |
+
"Your entire response must be parseable by json.loads(). "
|
| 692 |
+
"All clinical text must be specific to the patient provided — never generic."
|
| 693 |
+
),
|
| 694 |
+
},
|
| 695 |
+
{"role": "user", "content": prompt},
|
| 696 |
+
],
|
| 697 |
+
"temperature": 0.25,
|
| 698 |
+
"max_tokens": 2500,
|
| 699 |
+
}
|
| 700 |
+
|
| 701 |
+
raw = ""
|
| 702 |
+
try:
|
| 703 |
+
with httpx.Client(timeout=45) as client:
|
| 704 |
+
response = client.post(
|
| 705 |
+
GROQ_ENDPOINT,
|
| 706 |
+
headers={
|
| 707 |
+
"Authorization": f"Bearer {api_key}",
|
| 708 |
+
"Content-Type": "application/json",
|
| 709 |
+
},
|
| 710 |
+
json=payload,
|
| 711 |
+
)
|
| 712 |
+
response.raise_for_status()
|
| 713 |
+
raw = response.json()["choices"][0]["message"]["content"].strip()
|
| 714 |
+
|
| 715 |
+
# Strip accidental markdown fences if the model disobeys
|
| 716 |
+
if raw.startswith("```"):
|
| 717 |
+
raw = raw.split("```", 2)[1]
|
| 718 |
+
if raw.startswith("json"):
|
| 719 |
+
raw = raw[4:]
|
| 720 |
+
raw = raw.strip()
|
| 721 |
+
# Also strip trailing fences
|
| 722 |
+
if raw.endswith("```"):
|
| 723 |
+
raw = raw[:-3].strip()
|
| 724 |
+
|
| 725 |
+
result = json.loads(raw)
|
| 726 |
+
|
| 727 |
+
# Guarantee every key exists even if the model omits one
|
| 728 |
+
top = predictions[0]
|
| 729 |
+
result.setdefault("primaryFinding", top["label"])
|
| 730 |
+
result.setdefault("confidence", round(top["confidence"] * 100))
|
| 731 |
+
result.setdefault("conditionCode", _derive_condition_code(top["label"]))
|
| 732 |
+
result.setdefault("treatmentNotes", [])
|
| 733 |
+
result.setdefault("recommendedAction", "Refer to appropriate specialist.")
|
| 734 |
+
result.setdefault("referralNote", result.get("recommendedAction", ""))
|
| 735 |
+
|
| 736 |
+
# Post-process referralNote: ensure real newlines reach the frontend
|
| 737 |
+
if isinstance(result.get("referralNote"), str):
|
| 738 |
+
result["referralNote"] = (
|
| 739 |
+
result["referralNote"]
|
| 740 |
+
.replace("\\n\\n", "\n\n")
|
| 741 |
+
.replace("\\n", "\n")
|
| 742 |
+
)
|
| 743 |
+
|
| 744 |
+
logger.info(
|
| 745 |
+
"Groq structured response OK — finding: %s, urgency: %s",
|
| 746 |
+
result.get("primaryFinding"),
|
| 747 |
+
result.get("urgency"),
|
| 748 |
+
)
|
| 749 |
+
return result
|
| 750 |
+
|
| 751 |
+
except json.JSONDecodeError as exc:
|
| 752 |
+
logger.error("Groq returned invalid JSON: %s | raw: %.400s", exc, raw)
|
| 753 |
+
except httpx.HTTPStatusError as exc:
|
| 754 |
+
logger.error("Groq HTTP error %s: %s", exc.response.status_code, exc.response.text)
|
| 755 |
+
except Exception as exc:
|
| 756 |
+
logger.error("Groq request failed: %s", exc)
|
| 757 |
+
|
| 758 |
+
return _plain_fallback(predictions, patient_name, patient_age, patient_sex, symptoms)
|
| 759 |
+
|
| 760 |
+
|
| 761 |
+
# ---------------------------------------------------------------------------
|
| 762 |
+
# Legacy shim — keeps existing views.py calls working
|
| 763 |
+
# ---------------------------------------------------------------------------
|
| 764 |
+
def generate_narrative(predictions: list[dict[str, Any]]) -> str:
|
| 765 |
+
"""Deprecated shim. Use generate_clinical_response() instead."""
|
| 766 |
+
result = generate_clinical_response(predictions)
|
| 767 |
+
return result.get("referralNote") or result.get("recommendedAction", "")
|
| 768 |
+
|
| 769 |
+
|
| 770 |
+
# ---------------------------------------------------------------------------
|
| 771 |
+
# Offline fallback — uses CONDITION_MEDICATION_DB for real clinical data
|
| 772 |
+
# ---------------------------------------------------------------------------
|
| 773 |
+
def _plain_fallback(
|
| 774 |
+
predictions: list[dict[str, Any]],
|
| 775 |
+
patient_name: str = "",
|
| 776 |
+
patient_age: str = "",
|
| 777 |
+
patient_sex: str = "",
|
| 778 |
+
symptoms: str = "",
|
| 779 |
+
) -> dict[str, Any]:
|
| 780 |
+
"""
|
| 781 |
+
Returns a valid structured dict when Groq is unavailable.
|
| 782 |
+
Pulls from CONDITION_MEDICATION_DB for medically accurate content.
|
| 783 |
+
"""
|
| 784 |
+
top = predictions[0]
|
| 785 |
+
top_label = top["label"]
|
| 786 |
+
top_confidence = round(top["confidence"] * 100)
|
| 787 |
+
condition_code = _derive_condition_code(top_label)
|
| 788 |
+
|
| 789 |
+
label_lower = top_label.lower()
|
| 790 |
+
if any(k in label_lower for k in [
|
| 791 |
+
"melanoma", "basal cell", "carcinoma", "vasculitis",
|
| 792 |
+
"lupus", "cellulitis", "bullous", "actinic"
|
| 793 |
+
]):
|
| 794 |
+
urgency = "High"
|
| 795 |
+
urgency_text = "Urgent referral indicated. Refer to specialist within 48 hours."
|
| 796 |
+
elif top_confidence >= 80:
|
| 797 |
+
urgency = "High"
|
| 798 |
+
urgency_text = "Urgent referral indicated. Refer to specialist within 48 hours."
|
| 799 |
+
elif top_confidence >= 60:
|
| 800 |
+
urgency = "Moderate"
|
| 801 |
+
urgency_text = "Refer to clinic within 3 days."
|
| 802 |
+
else:
|
| 803 |
+
urgency = "Low"
|
| 804 |
+
urgency_text = "Monitor and review if symptoms persist beyond 2 weeks."
|
| 805 |
+
|
| 806 |
+
others = predictions[1:]
|
| 807 |
+
differential = ", ".join(
|
| 808 |
+
f"{p['label']} ({round(p['confidence'] * 100)}%)" for p in others
|
| 809 |
+
)
|
| 810 |
+
|
| 811 |
+
name_ref = patient_name or "the patient"
|
| 812 |
+
age_ref = f"{patient_age}-year-old" if patient_age else "adult"
|
| 813 |
+
sex_ref = patient_sex.lower() if patient_sex else "patient"
|
| 814 |
+
symptom_ref = symptoms or "the presenting lesion"
|
| 815 |
+
|
| 816 |
+
db_entry = _get_db_entry(top_label, condition_code)
|
| 817 |
+
|
| 818 |
+
if db_entry:
|
| 819 |
+
meds = db_entry.get("primary_medications", [])
|
| 820 |
+
primary_med = meds[0] if meds else None
|
| 821 |
+
dos = db_entry.get("dos", ["Keep area clean.", "Monitor for changes.", "Follow up as directed."])
|
| 822 |
+
donts = db_entry.get("donts", ["Do not scratch.", "Do not apply unverified home remedies."])
|
| 823 |
+
warning = db_entry.get("warning", "Follow standard clinical protocols.")
|
| 824 |
+
|
| 825 |
+
therapy_regimen = {
|
| 826 |
+
"medication": primary_med["name"] if primary_med else "Topical symptomatic relief",
|
| 827 |
+
"regimen": primary_med["dosage"] if primary_med else "Apply twice daily as directed",
|
| 828 |
+
"dosage": primary_med["dosage"] if primary_med else "As directed by clinician",
|
| 829 |
+
"contraindications": primary_med["contraindications"] if primary_med else "Consult prescriber",
|
| 830 |
+
"warningNote": warning,
|
| 831 |
+
} if primary_med else {
|
| 832 |
+
"medication": "Topical symptomatic relief",
|
| 833 |
+
"regimen": "Apply twice daily as needed",
|
| 834 |
+
"dosage": "Thin layer",
|
| 835 |
+
"contraindications": "Do not apply to broken skin",
|
| 836 |
+
"warningNote": warning,
|
| 837 |
+
}
|
| 838 |
+
|
| 839 |
+
treatment_notes = [
|
| 840 |
+
f"Apply {primary_med['name'] if primary_med else 'prescribed topical'} to {name_ref}'s affected area as directed — {primary_med['dosage'] if primary_med else 'twice daily'}.",
|
| 841 |
+
f"For this {age_ref} {sex_ref} presenting with {symptom_ref}: ensure area is clean and dry before each medication application.",
|
| 842 |
+
f"Ensure {name_ref} understands the full treatment course duration for {top_label} — do not stop early even if symptoms improve.",
|
| 843 |
+
]
|
| 844 |
+
else:
|
| 845 |
+
therapy_regimen = {
|
| 846 |
+
"medication": "Topical symptomatic relief",
|
| 847 |
+
"regimen": "Apply twice daily as needed",
|
| 848 |
+
"dosage": "Thin layer to affected area",
|
| 849 |
+
"contraindications": "Do not apply to broken skin",
|
| 850 |
+
"warningNote": "Consult a qualified clinician for specific guidance on this condition.",
|
| 851 |
+
}
|
| 852 |
+
dos = ["Keep affected area clean and dry.", "Monitor for changes in size or appearance.", "Follow up at the nearest clinic if symptoms worsen."]
|
| 853 |
+
donts = ["Do not scratch or pick at the lesion.", "Do not apply unverified home remedies."]
|
| 854 |
+
treatment_notes = [
|
| 855 |
+
f"Keep {name_ref}'s affected area clean and dry, and monitor for any changes in size, colour, or texture.",
|
| 856 |
+
f"Avoid scratching or picking at the lesion — advise {name_ref} to cover it with a clean, non-adhesive dressing.",
|
| 857 |
+
f"Follow up at the nearest clinic if {symptom_ref} worsens or does not improve within 2 weeks.",
|
| 858 |
+
]
|
| 859 |
+
|
| 860 |
+
return {
|
| 861 |
+
"primaryFinding": top_label,
|
| 862 |
+
"confidence": top_confidence,
|
| 863 |
+
"urgency": urgency,
|
| 864 |
+
"urgencyText": urgency_text,
|
| 865 |
+
"treatmentNotes": treatment_notes,
|
| 866 |
+
"therapyRegimen": therapy_regimen,
|
| 867 |
+
"patientHandout": {
|
| 868 |
+
"dos": dos,
|
| 869 |
+
"donts": donts,
|
| 870 |
+
},
|
| 871 |
+
"recommendedAction": (
|
| 872 |
+
f"Refer {name_ref} to the District Hospital Dermatology Unit for clinical assessment of {top_label}."
|
| 873 |
+
),
|
| 874 |
+
"referralNote": (
|
| 875 |
+
f"**Clinical Indication:**\n\n"
|
| 876 |
+
f"{name_ref} ({age_ref} {sex_ref}) presented with {symptom_ref} consistent with {top_label}.\n\n"
|
| 877 |
+
f"**Technique:**\n\n"
|
| 878 |
+
f"Clinical photography and DermaVision AI skin analysis system (DINOv2-based) were utilised for assessment.\n\n"
|
| 879 |
+
f"**Findings:**\n\n"
|
| 880 |
+
f"The DermaVision AI system identified {top_label} as the primary diagnosis with {top_confidence}% model confidence. "
|
| 881 |
+
f"Differential considerations include: {differential}.\n\n"
|
| 882 |
+
f"**Impression:**\n\n"
|
| 883 |
+
f"Findings are consistent with {top_label} based on visual lesion characteristics. "
|
| 884 |
+
f"Triage urgency has been classified as {urgency}.\n\n"
|
| 885 |
+
f"**Recommendation:**\n\n"
|
| 886 |
+
f"Clinical correlation and specialist review are strongly recommended. "
|
| 887 |
+
f"{urgency_text} Refer to the District Hospital Dermatology Unit for confirmation and initiation of definitive treatment."
|
| 888 |
+
),
|
| 889 |
+
"conditionCode": condition_code,
|
| 890 |
+
}
|
backend/api/inference.py
ADDED
|
@@ -0,0 +1,210 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
DermaVision inference engine.
|
| 3 |
+
"""
|
| 4 |
+
|
| 5 |
+
from __future__ import annotations
|
| 6 |
+
|
| 7 |
+
import io
|
| 8 |
+
import logging
|
| 9 |
+
import threading
|
| 10 |
+
from pathlib import Path
|
| 11 |
+
from typing import Any
|
| 12 |
+
|
| 13 |
+
import numpy as np
|
| 14 |
+
import onnxruntime as ort
|
| 15 |
+
from django.conf import settings
|
| 16 |
+
from PIL import Image
|
| 17 |
+
|
| 18 |
+
logger = logging.getLogger(__name__)
|
| 19 |
+
|
| 20 |
+
_MEAN = np.array([0.485, 0.456, 0.406], dtype=np.float32)
|
| 21 |
+
_STD = np.array([0.229, 0.224, 0.225], dtype=np.float32)
|
| 22 |
+
_SIZE = 224
|
| 23 |
+
|
| 24 |
+
LABEL_MAP: dict[int, str] = {
|
| 25 |
+
0: "Acne and Rosacea",
|
| 26 |
+
1: "Actinic Keratosis Basal Cell Carcinoma",
|
| 27 |
+
2: "Atopic Dermatitis",
|
| 28 |
+
3: "Bullous Disease",
|
| 29 |
+
4: "Cellulitis Impetigo",
|
| 30 |
+
5: "Eczema",
|
| 31 |
+
6: "Exanthems and Drug Eruptions",
|
| 32 |
+
7: "Hair Loss Alopecia",
|
| 33 |
+
8: "Herpes HPV and STDs",
|
| 34 |
+
9: "Light Diseases and Pigmentation Disorders",
|
| 35 |
+
10: "Lupus and Connective Tissue Diseases",
|
| 36 |
+
11: "Melanoma Skin Cancer Nevi and Moles",
|
| 37 |
+
12: "Nail Fungus and Nail Disease",
|
| 38 |
+
13: "Poison Ivy and Contact Dermatitis",
|
| 39 |
+
14: "Psoriasis Lichen Planus",
|
| 40 |
+
15: "Scabies Lyme Disease and Infestations",
|
| 41 |
+
16: "Seborrheic Keratoses",
|
| 42 |
+
17: "Systemic Disease",
|
| 43 |
+
18: "Tinea Ringworm Candidiasis",
|
| 44 |
+
19: "Urticaria Hives",
|
| 45 |
+
20: "Vascular Tumors",
|
| 46 |
+
21: "Vasculitis",
|
| 47 |
+
22: "Warts Molluscum and Viral Infections",
|
| 48 |
+
}
|
| 49 |
+
|
| 50 |
+
TOP_K = 3
|
| 51 |
+
|
| 52 |
+
|
| 53 |
+
class _InferenceEngine:
|
| 54 |
+
|
| 55 |
+
_lock = threading.Lock()
|
| 56 |
+
_instance = None
|
| 57 |
+
|
| 58 |
+
def __init__(self) -> None:
|
| 59 |
+
self._session: ort.InferenceSession | None = None
|
| 60 |
+
|
| 61 |
+
def _load(self) -> None:
|
| 62 |
+
model_path = Path(settings.MODEL_PATH)
|
| 63 |
+
if not model_path.exists():
|
| 64 |
+
raise FileNotFoundError(
|
| 65 |
+
f"ONNX model not found at {model_path}. "
|
| 66 |
+
"Place dermavision.onnx in the model/ directory."
|
| 67 |
+
)
|
| 68 |
+
|
| 69 |
+
logger.info("Loading DermaVision ONNX model from %s ...", model_path)
|
| 70 |
+
opts = ort.SessionOptions()
|
| 71 |
+
opts.graph_optimization_level = ort.GraphOptimizationLevel.ORT_ENABLE_ALL
|
| 72 |
+
opts.intra_op_num_threads = 4
|
| 73 |
+
|
| 74 |
+
providers = (
|
| 75 |
+
["CUDAExecutionProvider", "CPUExecutionProvider"]
|
| 76 |
+
if "CUDAExecutionProvider" in ort.get_available_providers()
|
| 77 |
+
else ["CPUExecutionProvider"]
|
| 78 |
+
)
|
| 79 |
+
|
| 80 |
+
self._session = ort.InferenceSession(str(model_path), opts, providers=providers)
|
| 81 |
+
logger.info("Model ready — providers: %s", self._session.get_providers())
|
| 82 |
+
|
| 83 |
+
@property
|
| 84 |
+
def ready(self) -> bool:
|
| 85 |
+
return self._session is not None
|
| 86 |
+
|
| 87 |
+
def ensure_loaded(self) -> None:
|
| 88 |
+
if not self.ready:
|
| 89 |
+
with self._lock:
|
| 90 |
+
if not self.ready:
|
| 91 |
+
self._load()
|
| 92 |
+
|
| 93 |
+
def preprocess(self, image_bytes: bytes) -> tuple[np.ndarray, tuple[int, int]]:
|
| 94 |
+
img = Image.open(io.BytesIO(image_bytes)).convert("RGB")
|
| 95 |
+
original_size = img.size
|
| 96 |
+
|
| 97 |
+
w, h = img.size
|
| 98 |
+
scale = 256 / min(w, h)
|
| 99 |
+
img = img.resize((int(w * scale), int(h * scale)), Image.BICUBIC)
|
| 100 |
+
|
| 101 |
+
w, h = img.size
|
| 102 |
+
left = (w - _SIZE) // 2
|
| 103 |
+
top = (h - _SIZE) // 2
|
| 104 |
+
img = img.crop((left, top, left + _SIZE, top + _SIZE))
|
| 105 |
+
|
| 106 |
+
arr = np.array(img, dtype=np.float32) / 255.0
|
| 107 |
+
arr = (arr - _MEAN) / _STD
|
| 108 |
+
arr = arr.transpose(2, 0, 1)[np.newaxis]
|
| 109 |
+
|
| 110 |
+
return arr.astype(np.float32), original_size
|
| 111 |
+
|
| 112 |
+
def predict(self, pixel_values: np.ndarray) -> np.ndarray:
|
| 113 |
+
outputs = self._session.run(
|
| 114 |
+
["logits"],
|
| 115 |
+
{"pixel_values": pixel_values},
|
| 116 |
+
)
|
| 117 |
+
return outputs[0]
|
| 118 |
+
|
| 119 |
+
@staticmethod
|
| 120 |
+
def top_k_predictions(logits: np.ndarray, k: int = TOP_K) -> list[dict[str, Any]]:
|
| 121 |
+
logits_1d = logits[0]
|
| 122 |
+
exp_logits = np.exp(logits_1d - logits_1d.max())
|
| 123 |
+
probs = exp_logits / exp_logits.sum()
|
| 124 |
+
|
| 125 |
+
top_indices = np.argsort(probs)[::-1][:k]
|
| 126 |
+
return [
|
| 127 |
+
{
|
| 128 |
+
"label": LABEL_MAP.get(int(i), f"class_{i}"),
|
| 129 |
+
"confidence": round(float(probs[i]), 4),
|
| 130 |
+
}
|
| 131 |
+
for i in top_indices
|
| 132 |
+
]
|
| 133 |
+
|
| 134 |
+
@staticmethod
|
| 135 |
+
def attention_heatmap(
|
| 136 |
+
pixel_values: np.ndarray,
|
| 137 |
+
original_size: tuple[int, int],
|
| 138 |
+
logits: np.ndarray,
|
| 139 |
+
) -> str | None:
|
| 140 |
+
try:
|
| 141 |
+
import base64
|
| 142 |
+
import cv2
|
| 143 |
+
|
| 144 |
+
import concurrent.futures
|
| 145 |
+
|
| 146 |
+
top_class = int(np.argmax(logits[0]))
|
| 147 |
+
w, h = original_size
|
| 148 |
+
ph = pw = _SIZE // 14
|
| 149 |
+
|
| 150 |
+
importance = np.zeros((ph, pw), dtype=np.float32)
|
| 151 |
+
|
| 152 |
+
def process_patch(row, col):
|
| 153 |
+
r0, r1 = row * 14, (row + 1) * 14
|
| 154 |
+
c0, c1 = col * 14, (col + 1) * 14
|
| 155 |
+
masked = pixel_values.copy()
|
| 156 |
+
masked[:, :, r0:r1, c0:c1] = 0.0
|
| 157 |
+
masked_logits = _engine._session.run(
|
| 158 |
+
["logits"], {"pixel_values": masked}
|
| 159 |
+
)[0]
|
| 160 |
+
return row, col, float(logits[0][top_class] - masked_logits[0][top_class])
|
| 161 |
+
|
| 162 |
+
with concurrent.futures.ThreadPoolExecutor(max_workers=8) as executor:
|
| 163 |
+
futures = [
|
| 164 |
+
executor.submit(process_patch, r, c)
|
| 165 |
+
for r in range(ph) for c in range(pw)
|
| 166 |
+
]
|
| 167 |
+
for future in concurrent.futures.as_completed(futures):
|
| 168 |
+
r, c, val = future.result()
|
| 169 |
+
importance[r, c] = val
|
| 170 |
+
|
| 171 |
+
importance = np.maximum(importance, 0)
|
| 172 |
+
if importance.max() > 0:
|
| 173 |
+
importance /= importance.max()
|
| 174 |
+
|
| 175 |
+
cam = cv2.resize(importance, (w, h), interpolation=cv2.INTER_CUBIC)
|
| 176 |
+
cam = np.uint8(255 * cam)
|
| 177 |
+
heatmap = cv2.applyColorMap(cam, cv2.COLORMAP_JET)
|
| 178 |
+
|
| 179 |
+
_, buf = cv2.imencode(".png", heatmap)
|
| 180 |
+
return base64.b64encode(buf.tobytes()).decode()
|
| 181 |
+
|
| 182 |
+
except Exception as exc:
|
| 183 |
+
logger.warning("Heatmap generation failed: %s", exc)
|
| 184 |
+
return None
|
| 185 |
+
|
| 186 |
+
|
| 187 |
+
_engine = _InferenceEngine()
|
| 188 |
+
|
| 189 |
+
|
| 190 |
+
def run_inference(image_bytes: bytes, include_heatmap: bool = True) -> dict[str, Any]:
|
| 191 |
+
_engine.ensure_loaded()
|
| 192 |
+
|
| 193 |
+
pixel_values, original_size = _engine.preprocess(image_bytes)
|
| 194 |
+
logits = _engine.predict(pixel_values)
|
| 195 |
+
predictions = _engine.top_k_predictions(logits)
|
| 196 |
+
|
| 197 |
+
heatmap_b64 = (
|
| 198 |
+
_engine.attention_heatmap(pixel_values, original_size, logits)
|
| 199 |
+
if include_heatmap
|
| 200 |
+
else None
|
| 201 |
+
)
|
| 202 |
+
|
| 203 |
+
return {
|
| 204 |
+
"predictions": predictions,
|
| 205 |
+
"heatmap_b64": heatmap_b64,
|
| 206 |
+
}
|
| 207 |
+
|
| 208 |
+
|
| 209 |
+
def model_ready() -> bool:
|
| 210 |
+
return _engine.ready
|
backend/api/pdf_generator.py
ADDED
|
@@ -0,0 +1,277 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import io
|
| 2 |
+
import base64
|
| 3 |
+
import re
|
| 4 |
+
from datetime import datetime
|
| 5 |
+
import qrcode
|
| 6 |
+
|
| 7 |
+
from reportlab.lib.pagesizes import A4
|
| 8 |
+
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
|
| 9 |
+
from reportlab.lib.units import cm
|
| 10 |
+
from reportlab.lib import colors
|
| 11 |
+
from reportlab.platypus import (
|
| 12 |
+
SimpleDocTemplate, Paragraph, Spacer,
|
| 13 |
+
Table, TableStyle, Image as RLImage, HRFlowable
|
| 14 |
+
)
|
| 15 |
+
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
|
| 16 |
+
|
| 17 |
+
PAGE_W, PAGE_H = A4
|
| 18 |
+
MARGIN = 2 * cm
|
| 19 |
+
|
| 20 |
+
# DermaDetect Branding Colors
|
| 21 |
+
C_BLUE = colors.HexColor('#0077b6')
|
| 22 |
+
LIGHT_BLUE = colors.HexColor('#e0f2fe')
|
| 23 |
+
DARK = colors.HexColor('#181c1e')
|
| 24 |
+
GRAY = colors.HexColor('#555f71')
|
| 25 |
+
LIGHT_GRAY = colors.HexColor('#bccac1')
|
| 26 |
+
|
| 27 |
+
|
| 28 |
+
def _markdown_to_rl(text: str) -> str:
|
| 29 |
+
"""Very basic markdown to ReportLab HTML conversion."""
|
| 30 |
+
if not text:
|
| 31 |
+
return ""
|
| 32 |
+
# Convert **bold** to <b>bold</b>
|
| 33 |
+
text = re.sub(r'\*\*(.*?)\*\*', r'<b>\1</b>', text)
|
| 34 |
+
# Convert newlines
|
| 35 |
+
text = text.replace('\n', '<br/>')
|
| 36 |
+
return text
|
| 37 |
+
|
| 38 |
+
|
| 39 |
+
def build_pdf(
|
| 40 |
+
case_id: str,
|
| 41 |
+
patient: dict,
|
| 42 |
+
clinical: dict,
|
| 43 |
+
images: dict
|
| 44 |
+
) -> str:
|
| 45 |
+
"""
|
| 46 |
+
Builds the DermaDetect PDF report.
|
| 47 |
+
Returns base64-encoded PDF string.
|
| 48 |
+
"""
|
| 49 |
+
buf = io.BytesIO()
|
| 50 |
+
doc = SimpleDocTemplate(
|
| 51 |
+
buf,
|
| 52 |
+
pagesize=A4,
|
| 53 |
+
leftMargin=MARGIN, rightMargin=MARGIN,
|
| 54 |
+
topMargin=MARGIN, bottomMargin=MARGIN,
|
| 55 |
+
)
|
| 56 |
+
|
| 57 |
+
styles = _build_styles()
|
| 58 |
+
story = []
|
| 59 |
+
|
| 60 |
+
# ── Header ──────────────────────────────────────────────────────
|
| 61 |
+
story.append(Paragraph("DermaDetect", styles['title']))
|
| 62 |
+
story.append(Paragraph("AI-Assisted Dermatology Analysis Report", styles['subtitle']))
|
| 63 |
+
story.append(Paragraph(
|
| 64 |
+
f"Generated: {datetime.utcnow().strftime('%Y-%m-%d %H:%M UTC')} | Case ID: {case_id}",
|
| 65 |
+
styles['meta']
|
| 66 |
+
))
|
| 67 |
+
story.append(HRFlowable(width="100%", thickness=1, color=C_BLUE, spaceAfter=12))
|
| 68 |
+
|
| 69 |
+
# ── Patient Context ──────────────────────────────────────────────
|
| 70 |
+
p_name = patient.get('name', 'Unknown Patient')
|
| 71 |
+
p_age = patient.get('age', 'N/A')
|
| 72 |
+
p_sex = patient.get('sex', 'N/A')
|
| 73 |
+
story.append(Paragraph(f"<b>Patient:</b> {p_name} | <b>Age:</b> {p_age} | <b>Sex:</b> {p_sex}", styles['body']))
|
| 74 |
+
story.append(Spacer(1, 12))
|
| 75 |
+
|
| 76 |
+
# ── Prediction summary table ─────────────────────────────────────
|
| 77 |
+
story.append(Paragraph("AI Triage Summary", styles['section']))
|
| 78 |
+
story.append(Spacer(1, 6))
|
| 79 |
+
|
| 80 |
+
primary_finding = clinical.get('primaryFinding', 'Unknown')
|
| 81 |
+
confidence = clinical.get('confidence', 0)
|
| 82 |
+
urgency = clinical.get('urgency', 'Unknown')
|
| 83 |
+
|
| 84 |
+
summary_data = [
|
| 85 |
+
['Primary Finding', 'Confidence', 'Urgency Level'],
|
| 86 |
+
[primary_finding, f"{confidence}%", urgency.upper()],
|
| 87 |
+
]
|
| 88 |
+
|
| 89 |
+
table = Table(summary_data, colWidths=[7*cm, 4*cm, 5*cm])
|
| 90 |
+
table.setStyle(TableStyle([
|
| 91 |
+
('BACKGROUND', (0,0), (-1,0), C_BLUE),
|
| 92 |
+
('TEXTCOLOR', (0,0), (-1,0), colors.white),
|
| 93 |
+
('FONTNAME', (0,0), (-1,0), 'Helvetica-Bold'),
|
| 94 |
+
('FONTSIZE', (0,0), (-1,0), 10),
|
| 95 |
+
('BACKGROUND', (0,1), (-1,-1), LIGHT_BLUE),
|
| 96 |
+
('FONTSIZE', (0,1), (-1,-1), 10),
|
| 97 |
+
('ALIGN', (0,0), (-1,-1), 'CENTER'),
|
| 98 |
+
('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
|
| 99 |
+
('ROWHEIGHT', (0,0), (-1,-1), 22),
|
| 100 |
+
('GRID', (0,0), (-1,-1), 0.5, C_BLUE),
|
| 101 |
+
]))
|
| 102 |
+
story.append(table)
|
| 103 |
+
story.append(Spacer(1, 16))
|
| 104 |
+
|
| 105 |
+
# ── Images ──────────────────────────────────────────────────────
|
| 106 |
+
story.append(Paragraph("Visual Analysis", styles['section']))
|
| 107 |
+
story.append(Spacer(1, 6))
|
| 108 |
+
|
| 109 |
+
img_row = []
|
| 110 |
+
img_labels = []
|
| 111 |
+
|
| 112 |
+
for key, label in [
|
| 113 |
+
('original_b64', 'Original Lesion'),
|
| 114 |
+
('heatmap_b64', 'AI Saliency Map'),
|
| 115 |
+
]:
|
| 116 |
+
b64 = images.get(key)
|
| 117 |
+
if b64:
|
| 118 |
+
# Strip data URI scheme if present
|
| 119 |
+
if b64.startswith("data:"):
|
| 120 |
+
b64 = b64.split(",")[1]
|
| 121 |
+
try:
|
| 122 |
+
img_buf = io.BytesIO(base64.b64decode(b64))
|
| 123 |
+
rl_img = RLImage(img_buf, width=6*cm, height=6*cm)
|
| 124 |
+
img_row.append(rl_img)
|
| 125 |
+
img_labels.append(label)
|
| 126 |
+
except Exception:
|
| 127 |
+
pass
|
| 128 |
+
|
| 129 |
+
if img_row:
|
| 130 |
+
img_table = Table(
|
| 131 |
+
[img_row, [Paragraph(l, styles['img_label']) for l in img_labels]],
|
| 132 |
+
colWidths=[6.5*cm] * len(img_row)
|
| 133 |
+
)
|
| 134 |
+
img_table.setStyle(TableStyle([
|
| 135 |
+
('ALIGN', (0,0), (-1,-1), 'CENTER'),
|
| 136 |
+
('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
|
| 137 |
+
]))
|
| 138 |
+
story.append(img_table)
|
| 139 |
+
story.append(Spacer(1, 16))
|
| 140 |
+
|
| 141 |
+
# ── Clinical report sections ──────────────────────────────────────
|
| 142 |
+
story.append(HRFlowable(width="100%", thickness=0.5, color=LIGHT_GRAY, spaceAfter=8))
|
| 143 |
+
story.append(Paragraph("AI Clinical Evaluation", styles['section']))
|
| 144 |
+
story.append(Spacer(1, 6))
|
| 145 |
+
|
| 146 |
+
referral_note = clinical.get('referralNote', '')
|
| 147 |
+
if referral_note:
|
| 148 |
+
html_note = _markdown_to_rl(referral_note)
|
| 149 |
+
for part in html_note.split('<br/>'):
|
| 150 |
+
if part.strip():
|
| 151 |
+
story.append(Paragraph(part.strip(), styles['body']))
|
| 152 |
+
story.append(Spacer(1, 4))
|
| 153 |
+
|
| 154 |
+
story.append(Spacer(1, 12))
|
| 155 |
+
|
| 156 |
+
# Treatment Notes (Legacy)
|
| 157 |
+
t_notes = clinical.get('treatmentNotes', [])
|
| 158 |
+
if t_notes:
|
| 159 |
+
story.append(Paragraph("Treatment Action Plan", styles['subsection']))
|
| 160 |
+
for note in t_notes:
|
| 161 |
+
story.append(Paragraph(f"• {note}", styles['body_bullet']))
|
| 162 |
+
story.append(Spacer(1, 8))
|
| 163 |
+
|
| 164 |
+
# Therapy Regimen
|
| 165 |
+
regimen = clinical.get('therapyRegimen', {})
|
| 166 |
+
if regimen:
|
| 167 |
+
story.append(Paragraph("Prescribed Therapy Regimen", styles['subsection']))
|
| 168 |
+
story.append(Paragraph(f"<b>Medication:</b> {regimen.get('medication', 'N/A')}", styles['body']))
|
| 169 |
+
story.append(Paragraph(f"<b>Dosage:</b> {regimen.get('dosage', 'N/A')}", styles['body']))
|
| 170 |
+
story.append(Paragraph(f"<b>Duration:</b> {regimen.get('duration', 'N/A')}", styles['body']))
|
| 171 |
+
story.append(Paragraph(f"<b>Instructions:</b> {regimen.get('instructions', 'N/A')}", styles['body']))
|
| 172 |
+
story.append(Spacer(1, 8))
|
| 173 |
+
|
| 174 |
+
# Patient Handout (Dos and Don'ts)
|
| 175 |
+
handout = clinical.get('patientHandout', {})
|
| 176 |
+
if handout:
|
| 177 |
+
story.append(Paragraph("Patient Handout", styles['subsection']))
|
| 178 |
+
dos = handout.get('dos', [])
|
| 179 |
+
donts = handout.get('donts', [])
|
| 180 |
+
if dos:
|
| 181 |
+
story.append(Paragraph("<b>Do's:</b>", styles['body']))
|
| 182 |
+
for item in dos:
|
| 183 |
+
story.append(Paragraph(f"• {item}", styles['body_bullet']))
|
| 184 |
+
if donts:
|
| 185 |
+
story.append(Paragraph("<b>Don'ts:</b>", styles['body']))
|
| 186 |
+
for item in donts:
|
| 187 |
+
story.append(Paragraph(f"• {item}", styles['body_bullet']))
|
| 188 |
+
story.append(Spacer(1, 8))
|
| 189 |
+
|
| 190 |
+
# Recommended Action
|
| 191 |
+
action = clinical.get('recommendedAction', '')
|
| 192 |
+
if action:
|
| 193 |
+
story.append(Paragraph("Recommended Action", styles['subsection']))
|
| 194 |
+
story.append(Paragraph(action, styles['body']))
|
| 195 |
+
story.append(Spacer(1, 8))
|
| 196 |
+
|
| 197 |
+
# ── Footer / Signature ─────────────────────────────────────────────
|
| 198 |
+
# Push to bottom visually
|
| 199 |
+
story.append(Spacer(1, 24))
|
| 200 |
+
story.append(HRFlowable(width="100%", thickness=0.5, color=LIGHT_GRAY, spaceBefore=12, spaceAfter=12))
|
| 201 |
+
|
| 202 |
+
# Generate QR Code
|
| 203 |
+
qr = qrcode.QRCode(box_size=3, border=1)
|
| 204 |
+
qr.add_data(f"https://secure.dermadetect.app/verify/{case_id}")
|
| 205 |
+
qr.make(fit=True)
|
| 206 |
+
qr_img = qr.make_image(fill_color="black", back_color="white")
|
| 207 |
+
|
| 208 |
+
qr_buf = io.BytesIO()
|
| 209 |
+
qr_img.save(qr_buf, format="PNG")
|
| 210 |
+
qr_buf.seek(0)
|
| 211 |
+
rl_qr = RLImage(qr_buf, width=2.5*cm, height=2.5*cm)
|
| 212 |
+
|
| 213 |
+
hw_name = patient.get('healthWorkerName') or 'K. Mensah'
|
| 214 |
+
|
| 215 |
+
sig_cell = Paragraph(
|
| 216 |
+
f"<font color='#555f71' size=8><i>Digital Verified Signature</i></font><br/><br/>"
|
| 217 |
+
f"<font size=14><b>{hw_name}</b></font><br/>"
|
| 218 |
+
f"<font color='#181c1e'>________________________</font>",
|
| 219 |
+
styles['body']
|
| 220 |
+
)
|
| 221 |
+
|
| 222 |
+
qr_text = Paragraph(
|
| 223 |
+
"<font size=7 color='#3d4943'><b>Verify on<br/>DermaDetect Secure<br/>Web Cloud</b></font>",
|
| 224 |
+
styles['body']
|
| 225 |
+
)
|
| 226 |
+
|
| 227 |
+
sig_table = Table([[sig_cell, rl_qr, qr_text]], colWidths=[10*cm, 3*cm, 3.5*cm])
|
| 228 |
+
sig_table.setStyle(TableStyle([
|
| 229 |
+
('ALIGN', (0,0), (0,0), 'LEFT'),
|
| 230 |
+
('ALIGN', (1,0), (2,0), 'RIGHT'),
|
| 231 |
+
('VALIGN', (0,0), (-1,-1), 'BOTTOM'),
|
| 232 |
+
]))
|
| 233 |
+
story.append(sig_table)
|
| 234 |
+
|
| 235 |
+
story.append(Spacer(1, 12))
|
| 236 |
+
story.append(Paragraph(
|
| 237 |
+
"Disclaimer: This assessment is AI-assisted using the advanced <b>DermaVision</b> language model "
|
| 238 |
+
"developed by <b>PreWorks</b>. It is intended to support, not replace, clinical judgment "
|
| 239 |
+
"by a qualified healthcare professional.",
|
| 240 |
+
styles['disclaimer']
|
| 241 |
+
))
|
| 242 |
+
|
| 243 |
+
doc.build(story)
|
| 244 |
+
return base64.b64encode(buf.getvalue()).decode('utf-8')
|
| 245 |
+
|
| 246 |
+
|
| 247 |
+
def _build_styles() -> dict:
|
| 248 |
+
base = getSampleStyleSheet()
|
| 249 |
+
return {
|
| 250 |
+
'title': ParagraphStyle('title',
|
| 251 |
+
fontSize=22, fontName='Helvetica-Bold',
|
| 252 |
+
textColor=C_BLUE, alignment=TA_CENTER, spaceAfter=4, leading=26),
|
| 253 |
+
'subtitle': ParagraphStyle('subtitle',
|
| 254 |
+
fontSize=11, fontName='Helvetica',
|
| 255 |
+
textColor=DARK, alignment=TA_CENTER, spaceAfter=2, leading=14),
|
| 256 |
+
'meta': ParagraphStyle('meta',
|
| 257 |
+
fontSize=8, fontName='Helvetica',
|
| 258 |
+
textColor=GRAY, alignment=TA_CENTER, spaceAfter=10, leading=10),
|
| 259 |
+
'section': ParagraphStyle('section',
|
| 260 |
+
fontSize=13, fontName='Helvetica-Bold',
|
| 261 |
+
textColor=C_BLUE, spaceAfter=8, leading=16),
|
| 262 |
+
'subsection': ParagraphStyle('subsection',
|
| 263 |
+
fontSize=11, fontName='Helvetica-Bold',
|
| 264 |
+
textColor=DARK, spaceAfter=4, leading=14),
|
| 265 |
+
'body': ParagraphStyle('body',
|
| 266 |
+
fontSize=10, fontName='Helvetica',
|
| 267 |
+
textColor=DARK, leading=14, alignment=TA_LEFT),
|
| 268 |
+
'body_bullet': ParagraphStyle('body_bullet',
|
| 269 |
+
fontSize=10, fontName='Helvetica',
|
| 270 |
+
textColor=DARK, leading=14, alignment=TA_LEFT, leftIndent=12),
|
| 271 |
+
'img_label': ParagraphStyle('img_label',
|
| 272 |
+
fontSize=8, fontName='Helvetica-Bold',
|
| 273 |
+
textColor=GRAY, alignment=TA_CENTER),
|
| 274 |
+
'disclaimer': ParagraphStyle('disclaimer',
|
| 275 |
+
fontSize=8, fontName='Helvetica',
|
| 276 |
+
textColor=GRAY, alignment=TA_CENTER),
|
| 277 |
+
}
|
backend/api/serializers.py
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from rest_framework import serializers
|
| 2 |
+
|
| 3 |
+
|
| 4 |
+
class PredictionSerializer(serializers.Serializer):
|
| 5 |
+
label = serializers.CharField()
|
| 6 |
+
confidence = serializers.FloatField()
|
| 7 |
+
|
| 8 |
+
|
| 9 |
+
class AnalyseRequestSerializer(serializers.Serializer):
|
| 10 |
+
image = serializers.ImageField()
|
| 11 |
+
include_heatmap = serializers.BooleanField(default=False)
|
| 12 |
+
include_narrative = serializers.BooleanField(default=True)
|
| 13 |
+
|
| 14 |
+
# Patient context — all optional, forwarded to Groq prompt
|
| 15 |
+
# Parsed directly from request.data in views.py (not validated here
|
| 16 |
+
# because they are plain strings and always safe to default to "")
|
| 17 |
+
# Listed here for documentation purposes only.
|
| 18 |
+
|
| 19 |
+
|
| 20 |
+
class AnalyseResponseSerializer(serializers.Serializer):
|
| 21 |
+
# Structured clinical fields — written by Groq
|
| 22 |
+
primaryFinding = serializers.CharField()
|
| 23 |
+
confidence = serializers.IntegerField()
|
| 24 |
+
urgency = serializers.ChoiceField(choices=["High", "Moderate", "Low"])
|
| 25 |
+
urgencyText = serializers.CharField()
|
| 26 |
+
treatmentNotes = serializers.ListField(child=serializers.CharField())
|
| 27 |
+
recommendedAction = serializers.CharField()
|
| 28 |
+
referralNote = serializers.CharField()
|
| 29 |
+
conditionCode = serializers.CharField()
|
| 30 |
+
|
| 31 |
+
# Raw model output
|
| 32 |
+
allPredictions = PredictionSerializer(many=True)
|
| 33 |
+
heatmap_b64 = serializers.CharField(allow_null=True)
|
| 34 |
+
model_version = serializers.CharField()
|
backend/api/urls.py
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from django.urls import path
|
| 2 |
+
from .views import AnalyseView, HealthView, GeneratePdfView
|
| 3 |
+
|
| 4 |
+
urlpatterns = [
|
| 5 |
+
path('health', HealthView.as_view(), name='health'),
|
| 6 |
+
path('analyse', AnalyseView.as_view(), name='analyse'),
|
| 7 |
+
path('pdf', GeneratePdfView.as_view(), name='pdf'),
|
| 8 |
+
]
|
backend/api/views.py
ADDED
|
@@ -0,0 +1,157 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from __future__ import annotations
|
| 2 |
+
|
| 3 |
+
import logging
|
| 4 |
+
|
| 5 |
+
from rest_framework import status
|
| 6 |
+
from rest_framework.parsers import MultiPartParser, JSONParser
|
| 7 |
+
from rest_framework.request import Request
|
| 8 |
+
from rest_framework.response import Response
|
| 9 |
+
from rest_framework.views import APIView
|
| 10 |
+
|
| 11 |
+
from .groq_client import generate_clinical_response
|
| 12 |
+
from .inference import model_ready, run_inference
|
| 13 |
+
from .serializers import AnalyseRequestSerializer
|
| 14 |
+
from .pdf_generator import build_pdf
|
| 15 |
+
|
| 16 |
+
logger = logging.getLogger(__name__)
|
| 17 |
+
|
| 18 |
+
MODEL_VERSION = "dermavision-dinov2-v1"
|
| 19 |
+
|
| 20 |
+
|
| 21 |
+
class HealthView(APIView):
|
| 22 |
+
"""GET /health — liveness + model readiness probe."""
|
| 23 |
+
|
| 24 |
+
def get(self, request: Request) -> Response:
|
| 25 |
+
return Response({
|
| 26 |
+
"status": "ok",
|
| 27 |
+
"model_loaded": model_ready(),
|
| 28 |
+
"model_version": MODEL_VERSION,
|
| 29 |
+
})
|
| 30 |
+
|
| 31 |
+
|
| 32 |
+
class AnalyseView(APIView):
|
| 33 |
+
"""
|
| 34 |
+
POST /analyse
|
| 35 |
+
Multipart fields:
|
| 36 |
+
image (required) — skin lesion image file
|
| 37 |
+
include_heatmap (bool, default False)
|
| 38 |
+
include_narrative (bool, default True)
|
| 39 |
+
patient_name (str, optional)
|
| 40 |
+
patient_age (str, optional)
|
| 41 |
+
patient_sex (str, optional)
|
| 42 |
+
symptoms (str, optional)
|
| 43 |
+
|
| 44 |
+
Returns the full structured clinical response the frontend needs directly —
|
| 45 |
+
primaryFinding, confidence, urgency, urgencyText, treatmentNotes,
|
| 46 |
+
recommendedAction, referralNote, conditionCode, predictions, model_version.
|
| 47 |
+
"""
|
| 48 |
+
|
| 49 |
+
parser_classes = [MultiPartParser, JSONParser]
|
| 50 |
+
|
| 51 |
+
def post(self, request: Request) -> Response:
|
| 52 |
+
serializer = AnalyseRequestSerializer(data=request.data)
|
| 53 |
+
if not serializer.is_valid():
|
| 54 |
+
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
| 55 |
+
|
| 56 |
+
image_file = serializer.validated_data["image"]
|
| 57 |
+
include_heatmap = serializer.validated_data["include_heatmap"]
|
| 58 |
+
include_narrative = serializer.validated_data["include_narrative"]
|
| 59 |
+
|
| 60 |
+
# Patient context — all optional, passed through to Groq prompt
|
| 61 |
+
patient_name = request.data.get("patient_name", "").strip()
|
| 62 |
+
patient_age = request.data.get("patient_age", "").strip()
|
| 63 |
+
patient_sex = request.data.get("patient_sex", "").strip()
|
| 64 |
+
symptoms = request.data.get("symptoms", "").strip()
|
| 65 |
+
|
| 66 |
+
image_bytes = image_file.read()
|
| 67 |
+
|
| 68 |
+
# --- Run ONNX inference ---
|
| 69 |
+
try:
|
| 70 |
+
inference_result = run_inference(image_bytes, include_heatmap=include_heatmap)
|
| 71 |
+
except FileNotFoundError as exc:
|
| 72 |
+
logger.error("Model not found: %s", exc)
|
| 73 |
+
return Response(
|
| 74 |
+
{"error": "Model not loaded. Please contact the administrator."},
|
| 75 |
+
status=status.HTTP_503_SERVICE_UNAVAILABLE,
|
| 76 |
+
)
|
| 77 |
+
except Exception as exc:
|
| 78 |
+
logger.exception("Inference error: %s", exc)
|
| 79 |
+
return Response(
|
| 80 |
+
{"error": "Inference failed. Check server logs."},
|
| 81 |
+
status=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
| 82 |
+
)
|
| 83 |
+
|
| 84 |
+
predictions = inference_result["predictions"] # top-3 [{label, confidence}]
|
| 85 |
+
heatmap_b64 = inference_result["heatmap_b64"]
|
| 86 |
+
|
| 87 |
+
# --- Generate structured clinical response via Groq ---
|
| 88 |
+
clinical = {}
|
| 89 |
+
if include_narrative:
|
| 90 |
+
try:
|
| 91 |
+
clinical = generate_clinical_response(
|
| 92 |
+
predictions=predictions,
|
| 93 |
+
patient_name=patient_name,
|
| 94 |
+
patient_age=patient_age,
|
| 95 |
+
patient_sex=patient_sex,
|
| 96 |
+
symptoms=symptoms,
|
| 97 |
+
)
|
| 98 |
+
except Exception as exc:
|
| 99 |
+
logger.warning("Clinical response generation failed: %s", exc)
|
| 100 |
+
|
| 101 |
+
# --- Build final response ---
|
| 102 |
+
# clinical already contains all frontend fields.
|
| 103 |
+
# We add predictions + heatmap + model_version on top.
|
| 104 |
+
response_data = {
|
| 105 |
+
# Full structured fields from Groq (or fallback)
|
| 106 |
+
"primaryFinding": clinical.get("primaryFinding", predictions[0]["label"]),
|
| 107 |
+
"confidence": clinical.get("confidence", round(predictions[0]["confidence"] * 100)),
|
| 108 |
+
"urgency": clinical.get("urgency", "Moderate"),
|
| 109 |
+
"urgencyText": clinical.get("urgencyText", "Refer to clinic within 3 days."),
|
| 110 |
+
"treatmentNotes": clinical.get("treatmentNotes", []),
|
| 111 |
+
"recommendedAction": clinical.get("recommendedAction", "Refer to appropriate specialist."),
|
| 112 |
+
"referralNote": clinical.get("referralNote", ""),
|
| 113 |
+
"conditionCode": clinical.get("conditionCode", "ringworm"),
|
| 114 |
+
"therapyRegimen": clinical.get("therapyRegimen", {}),
|
| 115 |
+
"patientHandout": clinical.get("patientHandout", {}),
|
| 116 |
+
|
| 117 |
+
# Raw model output — kept so frontend can show differential runner-ups
|
| 118 |
+
"allPredictions": predictions,
|
| 119 |
+
"heatmap_b64": heatmap_b64,
|
| 120 |
+
"model_version": MODEL_VERSION,
|
| 121 |
+
}
|
| 122 |
+
|
| 123 |
+
logger.info(
|
| 124 |
+
"Analyse complete — patient: %s | finding: %s | urgency: %s",
|
| 125 |
+
patient_name or "anonymous",
|
| 126 |
+
response_data["primaryFinding"],
|
| 127 |
+
response_data["urgency"],
|
| 128 |
+
)
|
| 129 |
+
|
| 130 |
+
return Response(response_data, status=status.HTTP_200_OK)
|
| 131 |
+
|
| 132 |
+
|
| 133 |
+
class GeneratePdfView(APIView):
|
| 134 |
+
"""
|
| 135 |
+
POST /pdf
|
| 136 |
+
Expects a JSON payload containing:
|
| 137 |
+
- case_id
|
| 138 |
+
- patient (dict with name, age, sex, symptoms, healthWorkerName)
|
| 139 |
+
- clinical (dict with primaryFinding, confidence, urgency, referralNote, treatmentNotes)
|
| 140 |
+
- images (dict with original_b64, heatmap_b64)
|
| 141 |
+
"""
|
| 142 |
+
parser_classes = [JSONParser]
|
| 143 |
+
|
| 144 |
+
def post(self, request: Request) -> Response:
|
| 145 |
+
try:
|
| 146 |
+
data = request.data
|
| 147 |
+
case_id = data.get("case_id", "NEW-CASE")
|
| 148 |
+
patient = data.get("patient", {})
|
| 149 |
+
clinical = data.get("clinical", {})
|
| 150 |
+
images = data.get("images", {})
|
| 151 |
+
|
| 152 |
+
pdf_b64 = build_pdf(case_id, patient, clinical, images)
|
| 153 |
+
|
| 154 |
+
return Response({"pdf_b64": pdf_b64}, status=status.HTTP_200_OK)
|
| 155 |
+
except Exception as exc:
|
| 156 |
+
logger.exception("Failed to generate PDF: %s", exc)
|
| 157 |
+
return Response({"error": str(exc)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
|
backend/core/__init__.py
ADDED
|
File without changes
|
backend/core/settings.py
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from pathlib import Path
|
| 2 |
+
import os
|
| 3 |
+
from dotenv import load_dotenv
|
| 4 |
+
|
| 5 |
+
load_dotenv()
|
| 6 |
+
|
| 7 |
+
BASE_DIR = Path(__file__).resolve().parent.parent
|
| 8 |
+
SECRET_KEY = os.environ.get('SECRET_KEY', 'dev-secret-key-change-in-production')
|
| 9 |
+
DEBUG = os.environ.get('DEBUG', 'False') == 'True'
|
| 10 |
+
ALLOWED_HOSTS = ['*']
|
| 11 |
+
|
| 12 |
+
INSTALLED_APPS = [
|
| 13 |
+
'django.contrib.contenttypes',
|
| 14 |
+
'django.contrib.auth',
|
| 15 |
+
'django.contrib.staticfiles',
|
| 16 |
+
'rest_framework',
|
| 17 |
+
'api',
|
| 18 |
+
'corsheaders',
|
| 19 |
+
]
|
| 20 |
+
|
| 21 |
+
MIDDLEWARE = [
|
| 22 |
+
'corsheaders.middleware.CorsMiddleware',
|
| 23 |
+
'django.middleware.security.SecurityMiddleware',
|
| 24 |
+
'whitenoise.middleware.WhiteNoiseMiddleware',
|
| 25 |
+
'django.middleware.common.CommonMiddleware',
|
| 26 |
+
]
|
| 27 |
+
|
| 28 |
+
ROOT_URLCONF = 'core.urls'
|
| 29 |
+
|
| 30 |
+
TEMPLATES = [{
|
| 31 |
+
'BACKEND': 'django.template.backends.django.DjangoTemplates',
|
| 32 |
+
'DIRS': [BASE_DIR / 'templates'] if (BASE_DIR / 'templates').exists() else [],
|
| 33 |
+
'APP_DIRS': True,
|
| 34 |
+
'OPTIONS': {
|
| 35 |
+
'context_processors': [
|
| 36 |
+
'django.template.context_processors.request',
|
| 37 |
+
],
|
| 38 |
+
},
|
| 39 |
+
}]
|
| 40 |
+
|
| 41 |
+
WSGI_APPLICATION = 'core.wsgi.application'
|
| 42 |
+
DATABASES = {}
|
| 43 |
+
|
| 44 |
+
STATIC_URL = '/static/'
|
| 45 |
+
STATICFILES_DIRS = [BASE_DIR / 'static'] if (BASE_DIR / 'static').exists() else []
|
| 46 |
+
|
| 47 |
+
STATIC_ROOT = BASE_DIR / 'staticfiles'
|
| 48 |
+
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
|
| 49 |
+
|
| 50 |
+
REST_FRAMEWORK = {
|
| 51 |
+
'DEFAULT_RENDERER_CLASSES': ['rest_framework.renderers.JSONRenderer'],
|
| 52 |
+
'DEFAULT_PARSER_CLASSES': [
|
| 53 |
+
'rest_framework.parsers.MultiPartParser',
|
| 54 |
+
'rest_framework.parsers.JSONParser',
|
| 55 |
+
],
|
| 56 |
+
}
|
| 57 |
+
|
| 58 |
+
MODEL_PATH = BASE_DIR / 'model' / 'dermavision.onnx'
|
| 59 |
+
GROQ_API_KEY = os.environ.get('GROQ_API_KEY', '')
|
| 60 |
+
DATA_UPLOAD_MAX_MEMORY_SIZE = 20 * 1024 * 1024
|
| 61 |
+
CORS_ALLOW_ALL_ORIGINS = True # tighten this when deploying
|
backend/core/urls.py
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from django.urls import path, include
|
| 2 |
+
|
| 3 |
+
urlpatterns = [
|
| 4 |
+
path('', include('api.urls')),
|
| 5 |
+
]
|
backend/core/wsgi.py
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
from django.core.wsgi import get_wsgi_application
|
| 3 |
+
|
| 4 |
+
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'core.settings')
|
| 5 |
+
application = get_wsgi_application()
|
backend/manage.py
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python
|
| 2 |
+
import os
|
| 3 |
+
import sys
|
| 4 |
+
|
| 5 |
+
def main():
|
| 6 |
+
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'core.settings')
|
| 7 |
+
from django.core.management import execute_from_command_line
|
| 8 |
+
execute_from_command_line(sys.argv)
|
| 9 |
+
|
| 10 |
+
if __name__ == '__main__':
|
| 11 |
+
main()
|
backend/requirements.txt
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Web framework
|
| 2 |
+
django>=4.2,<5.0
|
| 3 |
+
djangorestframework>=3.15
|
| 4 |
+
whitenoise>=6.6
|
| 5 |
+
|
| 6 |
+
# Inference
|
| 7 |
+
onnxruntime>=1.18 # use onnxruntime-gpu if CUDA available
|
| 8 |
+
transformers>=4.40 # AutoImageProcessor, AutoModelForImageClassification
|
| 9 |
+
Pillow>=10.0
|
| 10 |
+
numpy>=1.26
|
| 11 |
+
opencv-python-headless>=4.9 # heatmap generation (no GUI deps)
|
| 12 |
+
|
| 13 |
+
# LLM narrative
|
| 14 |
+
httpx>=0.27
|
| 15 |
+
|
| 16 |
+
# Config
|
| 17 |
+
python-dotenv>=1.0
|
| 18 |
+
reportlab
|
| 19 |
+
qrcode[pil]
|
backend/scripts/export_onnx.py
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/usr/bin/env python
|
| 2 |
+
"""
|
| 3 |
+
Export Jayanth2002/dinov2-base-finetuned-SkinDisease to ONNX.
|
| 4 |
+
|
| 5 |
+
Usage:
|
| 6 |
+
python scripts/export_onnx.py [--output model/dermavision.onnx]
|
| 7 |
+
|
| 8 |
+
Requirements (run once, not in production image):
|
| 9 |
+
pip install torch transformers onnx onnxruntime pillow
|
| 10 |
+
"""
|
| 11 |
+
|
| 12 |
+
import argparse
|
| 13 |
+
from pathlib import Path
|
| 14 |
+
|
| 15 |
+
import torch
|
| 16 |
+
from transformers import AutoImageProcessor, AutoModelForImageClassification
|
| 17 |
+
from PIL import Image
|
| 18 |
+
import numpy as np
|
| 19 |
+
import os
|
| 20 |
+
|
| 21 |
+
|
| 22 |
+
HF_MODEL_ID = "Jayanth2002/dinov2-base-finetuned-SkinDisease"
|
| 23 |
+
|
| 24 |
+
|
| 25 |
+
def export(output_path: Path) -> None:
|
| 26 |
+
output_path.parent.mkdir(parents=True, exist_ok=True)
|
| 27 |
+
|
| 28 |
+
print(f"Downloading {HF_MODEL_ID} …")
|
| 29 |
+
processor = AutoImageProcessor.from_pretrained(HF_MODEL_ID)
|
| 30 |
+
model = AutoModelForImageClassification.from_pretrained(HF_MODEL_ID)
|
| 31 |
+
model.eval()
|
| 32 |
+
|
| 33 |
+
print("Label map:")
|
| 34 |
+
for idx, label in model.config.id2label.items():
|
| 35 |
+
print(f" {idx}: {label}")
|
| 36 |
+
print(f"Num classes: {len(model.config.id2label)}")
|
| 37 |
+
|
| 38 |
+
# Dummy input — 224×224 RGB
|
| 39 |
+
dummy_img = Image.fromarray(np.zeros((224, 224, 3), dtype=np.uint8))
|
| 40 |
+
inputs = processor(images=dummy_img, return_tensors="pt")
|
| 41 |
+
pixel_values = inputs["pixel_values"] # [1, 3, 224, 224]
|
| 42 |
+
|
| 43 |
+
print(f"\nExporting to {output_path} …")
|
| 44 |
+
torch.onnx.export(
|
| 45 |
+
model,
|
| 46 |
+
pixel_values,
|
| 47 |
+
str(output_path),
|
| 48 |
+
export_params=True,
|
| 49 |
+
opset_version=14,
|
| 50 |
+
do_constant_folding=True,
|
| 51 |
+
input_names=["pixel_values"],
|
| 52 |
+
output_names=["logits"],
|
| 53 |
+
dynamic_axes={
|
| 54 |
+
"pixel_values": {0: "batch_size"},
|
| 55 |
+
"logits": {0: "batch_size"},
|
| 56 |
+
},
|
| 57 |
+
)
|
| 58 |
+
|
| 59 |
+
size_mb = os.path.getsize(output_path) / 1e6
|
| 60 |
+
print(f"✓ Exported: {output_path} ({size_mb:.1f} MB)")
|
| 61 |
+
|
| 62 |
+
# Quick sanity check
|
| 63 |
+
import onnxruntime as ort
|
| 64 |
+
sess = ort.InferenceSession(str(output_path), providers=["CPUExecutionProvider"])
|
| 65 |
+
out = sess.run(["logits"], {"pixel_values": pixel_values.numpy()})[0]
|
| 66 |
+
print(f"✓ Sanity check passed — logits shape: {out.shape}")
|
| 67 |
+
|
| 68 |
+
|
| 69 |
+
if __name__ == "__main__":
|
| 70 |
+
parser = argparse.ArgumentParser()
|
| 71 |
+
parser.add_argument(
|
| 72 |
+
"--output",
|
| 73 |
+
type=Path,
|
| 74 |
+
default=Path(__file__).resolve().parent.parent / "model" / "dermavision.onnx",
|
| 75 |
+
)
|
| 76 |
+
args = parser.parse_args()
|
| 77 |
+
export(args.output)
|
backend/staticfiles/rest_framework/css/bootstrap-theme.min.1d4b05b397c3.css
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
/*!
|
| 2 |
+
* Bootstrap v3.4.1 (https://getbootstrap.com/)
|
| 3 |
+
* Copyright 2011-2019 Twitter, Inc.
|
| 4 |
+
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
| 5 |
+
*/.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-danger.disabled,.btn-danger[disabled],.btn-default.disabled,.btn-default[disabled],.btn-info.disabled,.btn-info[disabled],.btn-primary.disabled,.btn-primary[disabled],.btn-success.disabled,.btn-success[disabled],.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-danger,fieldset[disabled] .btn-default,fieldset[disabled] .btn-info,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-success,fieldset[disabled] .btn-warning{-webkit-box-shadow:none;box-shadow:none}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .badge{text-shadow:none}.btn.active,.btn:active{background-image:none}.btn-default{background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;text-shadow:0 1px 0 #fff;border-color:#ccc}.btn-default:focus,.btn-default:hover{background-color:#e0e0e0;background-position:0 -15px}.btn-default.active,.btn-default:active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:focus,.btn-primary:hover{background-color:#265a88;background-position:0 -15px}.btn-primary.active,.btn-primary:active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:focus,.btn-success:hover{background-color:#419641;background-position:0 -15px}.btn-success.active,.btn-success:active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:focus,.btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.btn-info.active,.btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:focus,.btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.btn-warning.active,.btn-warning:active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:focus,.btn-danger:hover{background-color:#c12e2a;background-position:0 -15px}.btn-danger.active,.btn-danger:active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c12e2a;background-image:none}.img-thumbnail,.thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x;background-color:#e8e8e8}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x;background-color:#2e6da4}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);border-radius:4px}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)}
|
| 6 |
+
/*# sourceMappingURL=bootstrap-theme.min.css.51806092cc05.map */
|
backend/staticfiles/rest_framework/css/bootstrap-theme.min.1d4b05b397c3.css.gz
ADDED
|
Binary file (2.78 kB). View file
|
|
|
backend/staticfiles/rest_framework/css/bootstrap-theme.min.css
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
/*!
|
| 2 |
+
* Bootstrap v3.4.1 (https://getbootstrap.com/)
|
| 3 |
+
* Copyright 2011-2019 Twitter, Inc.
|
| 4 |
+
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
|
| 5 |
+
*/.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-danger.disabled,.btn-danger[disabled],.btn-default.disabled,.btn-default[disabled],.btn-info.disabled,.btn-info[disabled],.btn-primary.disabled,.btn-primary[disabled],.btn-success.disabled,.btn-success[disabled],.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-danger,fieldset[disabled] .btn-default,fieldset[disabled] .btn-info,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-success,fieldset[disabled] .btn-warning{-webkit-box-shadow:none;box-shadow:none}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .badge{text-shadow:none}.btn.active,.btn:active{background-image:none}.btn-default{background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;text-shadow:0 1px 0 #fff;border-color:#ccc}.btn-default:focus,.btn-default:hover{background-color:#e0e0e0;background-position:0 -15px}.btn-default.active,.btn-default:active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:focus,.btn-primary:hover{background-color:#265a88;background-position:0 -15px}.btn-primary.active,.btn-primary:active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:focus,.btn-success:hover{background-color:#419641;background-position:0 -15px}.btn-success.active,.btn-success:active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:focus,.btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.btn-info.active,.btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:focus,.btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.btn-warning.active,.btn-warning:active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:focus,.btn-danger:hover{background-color:#c12e2a;background-position:0 -15px}.btn-danger.active,.btn-danger:active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c12e2a;background-image:none}.img-thumbnail,.thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x;background-color:#e8e8e8}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x;background-color:#2e6da4}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);border-radius:4px}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)}
|
| 6 |
+
/*# sourceMappingURL=bootstrap-theme.min.css.map */
|
backend/staticfiles/rest_framework/css/bootstrap-theme.min.css.51806092cc05.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
{"version":3,"sources":["bootstrap-theme.css","dist/css/bootstrap-theme.css","less/theme.less","less/mixins/vendor-prefixes.less","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":"AAAA;;;;ACUA,YCWA,aDbA,UAFA,aACA,aAEA,aCkBE,YAAA,EAAA,KAAA,EAAA,eC2CA,mBAAA,MAAA,EAAA,IAAA,EAAA,qBAAA,CAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,EAAA,qBAAA,CAAA,EAAA,IAAA,IAAA,iBF7CV,mBANA,mBACA,oBCWE,oBDRF,iBANA,iBAIA,oBANA,oBAOA,oBANA,oBAQA,oBANA,oBEmDE,mBAAA,MAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,iBFpCV,qBAMA,sBCJE,sBDDF,uBAHA,mBAMA,oBARA,sBAMA,uBALA,sBAMA,uBAJA,sBAMA,uBAOA,+BALA,gCAGA,6BAFA,gCACA,gCAEA,gCEwBE,mBAAA,KACQ,WAAA,KFfV,mBCnCA,oBDiCA,iBAFA,oBACA,oBAEA,oBCXI,YAAA,KDgBJ,YCyBE,YAEE,iBAAA,KAKJ,aEvEI,iBAAA,iDACA,iBAAA,4CACA,iBAAA,qEAAA,iBAAA,+CACA,OAAA,+GClBF,OAAA,0DH8CA,kBAAA,SACA,aAAA,QAyCA,YAAA,EAAA,IAAA,EAAA,KACA,aAAA,KDnBF,mBCrBE,mBAEE,iBAAA,QACA,oBAAA,EAAA,MDuBJ,oBCpBE,oBAEE,iBAAA,QACA,aAAA,QAMA,sBD8BJ,6BANA,4BAGA,6BANA,4BAHA,4BAFA,uBAeA,8BANA,6BAGA,8BANA,6BAHA,6BAFA,gCAeA,uCANA,sCAGA,uCANA,sCAHA,sCCdM,iBAAA,QACA,iBAAA,KAoBN,aE5EI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GClBF,OAAA,0DH8CA,kBAAA,SACA,aAAA,QDgEF,mBC9DE,mBAEE,iBAAA,QACA,oBAAA,EAAA,MDgEJ,oBC7DE,oBAEE,iBAAA,QACA,aAAA,QAMA,sBDuEJ,6BANA,4BAGA,6BANA,4BAHA,4BAFA,uBAeA,8BANA,6BAGA,8BANA,6BAHA,6BAFA,gCAeA,uCANA,sCAGA,uCANA,sCAHA,sCCvDM,iBAAA,QACA,iBAAA,KAqBN,aE7EI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GClBF,OAAA,0DH8CA,kBAAA,SACA,aAAA,QDyGF,mBCvGE,mBAEE,iBAAA,QACA,oBAAA,EAAA,MDyGJ,oBCtGE,oBAEE,iBAAA,QACA,aAAA,QAMA,sBDgHJ,6BANA,4BAGA,6BANA,4BAHA,4BAFA,uBAeA,8BANA,6BAGA,8BANA,6BAHA,6BAFA,gCAeA,uCANA,sCAGA,uCANA,sCAHA,sCChGM,iBAAA,QACA,iBAAA,KAsBN,UE9EI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GClBF,OAAA,0DH8CA,kBAAA,SACA,aAAA,QDkJF,gBChJE,gBAEE,iBAAA,QACA,oBAAA,EAAA,MDkJJ,iBC/IE,iBAEE,iBAAA,QACA,aAAA,QAMA,mBDyJJ,0BANA,yBAGA,0BANA,yBAHA,yBAFA,oBAeA,2BANA,0BAGA,2BANA,0BAHA,0BAFA,6BAeA,oCANA,mCAGA,oCANA,mCAHA,mCCzIM,iBAAA,QACA,iBAAA,KAuBN,aE/EI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GClBF,OAAA,0DH8CA,kBAAA,SACA,aAAA,QD2LF,mBCzLE,mBAEE,iBAAA,QACA,oBAAA,EAAA,MD2LJ,oBCxLE,oBAEE,iBAAA,QACA,aAAA,QAMA,sBDkMJ,6BANA,4BAGA,6BANA,4BAHA,4BAFA,uBAeA,8BANA,6BAGA,8BANA,6BAHA,6BAFA,gCAeA,uCANA,sCAGA,uCANA,sCAHA,sCClLM,iBAAA,QACA,iBAAA,KAwBN,YEhFI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GClBF,OAAA,0DH8CA,kBAAA,SACA,aAAA,QDoOF,kBClOE,kBAEE,iBAAA,QACA,oBAAA,EAAA,MDoOJ,mBCjOE,mBAEE,iBAAA,QACA,aAAA,QAMA,qBD2OJ,4BANA,2BAGA,4BANA,2BAHA,2BAFA,sBAeA,6BANA,4BAGA,6BANA,4BAHA,4BAFA,+BAeA,sCANA,qCAGA,sCANA,qCAHA,qCC3NM,iBAAA,QACA,iBAAA,KD2ON,eC5MA,WCtCE,mBAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,EAAA,IAAA,IAAA,iBFsPV,0BCvMA,0BEjGI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFgGF,iBAAA,QAEF,yBD6MA,+BADA,+BGlTI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFsGF,iBAAA,QASF,gBEnHI,iBAAA,iDACA,iBAAA,4CACA,iBAAA,qEAAA,iBAAA,+CACA,OAAA,+GACA,kBAAA,SCnBF,OAAA,0DHqIA,cAAA,ICrEA,mBAAA,MAAA,EAAA,IAAA,EAAA,qBAAA,CAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,EAAA,qBAAA,CAAA,EAAA,IAAA,IAAA,iBFuRV,sCCtNA,oCEnHI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SD6CF,mBAAA,MAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,iBD8EV,cDoNA,iBClNE,YAAA,EAAA,IAAA,EAAA,sBAIF,gBEtII,iBAAA,iDACA,iBAAA,4CACA,iBAAA,qEAAA,iBAAA,+CACA,OAAA,+GACA,kBAAA,SCnBF,OAAA,0DHwJA,cAAA,IDyNF,sCC5NA,oCEtII,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SD6CF,mBAAA,MAAA,EAAA,IAAA,IAAA,gBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,gBDoFV,8BDuOA,iCC3NI,YAAA,EAAA,KAAA,EAAA,gBDgOJ,qBADA,kBC1NA,mBAGE,cAAA,EAIF,yBAEI,mDDwNF,yDADA,yDCpNI,MAAA,KEnKF,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,UF2KJ,OACE,YAAA,EAAA,IAAA,EAAA,qBC/HA,mBAAA,MAAA,EAAA,IAAA,EAAA,qBAAA,CAAA,EAAA,IAAA,IAAA,gBACQ,WAAA,MAAA,EAAA,IAAA,EAAA,qBAAA,CAAA,EAAA,IAAA,IAAA,gBD0IV,eE5LI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFoLF,aAAA,QAKF,YE7LI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFoLF,aAAA,QAMF,eE9LI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFoLF,aAAA,QAOF,cE/LI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFoLF,aAAA,QAeF,UEvMI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF6MJ,cEjNI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF8MJ,sBElNI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF+MJ,mBEnNI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFgNJ,sBEpNI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFiNJ,qBErNI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFqNJ,sBExLI,iBAAA,yKACA,iBAAA,oKACA,iBAAA,iKF+LJ,YACE,cAAA,IClLA,mBAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,EAAA,IAAA,IAAA,iBDoLV,wBDiQA,8BADA,8BC7PE,YAAA,EAAA,KAAA,EAAA,QEzOE,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFuOF,aAAA,QALF,+BD6QA,qCADA,qCCpQI,YAAA,KAUJ,OCvME,mBAAA,EAAA,IAAA,IAAA,gBACQ,WAAA,EAAA,IAAA,IAAA,gBDgNV,8BElQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF+PJ,8BEnQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFgQJ,8BEpQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFiQJ,2BErQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFkQJ,8BEtQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFmQJ,6BEvQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF0QJ,ME9QI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF4QF,aAAA,QC/NA,mBAAA,MAAA,EAAA,IAAA,IAAA,eAAA,CAAA,EAAA,IAAA,EAAA,qBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,eAAA,CAAA,EAAA,IAAA,EAAA","sourcesContent":["/*!\n * Bootstrap v3.4.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.btn-default:active,\n.btn-primary:active,\n.btn-success:active,\n.btn-info:active,\n.btn-warning:active,\n.btn-danger:active,\n.btn-default.active,\n.btn-primary.active,\n.btn-success.active,\n.btn-info.active,\n.btn-warning.active,\n.btn-danger.active {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-default.disabled,\n.btn-primary.disabled,\n.btn-success.disabled,\n.btn-info.disabled,\n.btn-warning.disabled,\n.btn-danger.disabled,\n.btn-default[disabled],\n.btn-primary[disabled],\n.btn-success[disabled],\n.btn-info[disabled],\n.btn-warning[disabled],\n.btn-danger[disabled],\nfieldset[disabled] .btn-default,\nfieldset[disabled] .btn-primary,\nfieldset[disabled] .btn-success,\nfieldset[disabled] .btn-info,\nfieldset[disabled] .btn-warning,\nfieldset[disabled] .btn-danger {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-default .badge,\n.btn-primary .badge,\n.btn-success .badge,\n.btn-info .badge,\n.btn-warning .badge,\n.btn-danger .badge {\n text-shadow: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n}\n.btn-default {\n background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #dbdbdb;\n text-shadow: 0 1px 0 #fff;\n border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus {\n background-color: #e0e0e0;\n background-position: 0 -15px;\n}\n.btn-default:active,\n.btn-default.active {\n background-color: #e0e0e0;\n border-color: #dbdbdb;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n background-color: #e0e0e0;\n background-image: none;\n}\n.btn-primary {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #245580;\n}\n.btn-primary:hover,\n.btn-primary:focus {\n background-color: #265a88;\n background-position: 0 -15px;\n}\n.btn-primary:active,\n.btn-primary.active {\n background-color: #265a88;\n border-color: #245580;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n background-color: #265a88;\n background-image: none;\n}\n.btn-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #3e8f3e;\n}\n.btn-success:hover,\n.btn-success:focus {\n background-color: #419641;\n background-position: 0 -15px;\n}\n.btn-success:active,\n.btn-success.active {\n background-color: #419641;\n border-color: #3e8f3e;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n background-color: #419641;\n background-image: none;\n}\n.btn-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #28a4c9;\n}\n.btn-info:hover,\n.btn-info:focus {\n background-color: #2aabd2;\n background-position: 0 -15px;\n}\n.btn-info:active,\n.btn-info.active {\n background-color: #2aabd2;\n border-color: #28a4c9;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n background-color: #2aabd2;\n background-image: none;\n}\n.btn-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #e38d13;\n}\n.btn-warning:hover,\n.btn-warning:focus {\n background-color: #eb9316;\n background-position: 0 -15px;\n}\n.btn-warning:active,\n.btn-warning.active {\n background-color: #eb9316;\n border-color: #e38d13;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n background-color: #eb9316;\n background-image: none;\n}\n.btn-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #b92c28;\n}\n.btn-danger:hover,\n.btn-danger:focus {\n background-color: #c12e2a;\n background-position: 0 -15px;\n}\n.btn-danger:active,\n.btn-danger.active {\n background-color: #c12e2a;\n border-color: #b92c28;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n background-color: #c12e2a;\n background-image: none;\n}\n.thumbnail,\n.img-thumbnail {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-repeat: repeat-x;\n background-color: #e8e8e8;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-repeat: repeat-x;\n background-color: #2e6da4;\n}\n.navbar-default {\n background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);\n background-repeat: repeat-x;\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);\n}\n.navbar-inverse {\n background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);\n background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%);\n background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);\n background-repeat: repeat-x;\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n}\n.navbar-inverse .navbar-brand,\n.navbar-inverse .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n@media (max-width: 767px) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-repeat: repeat-x;\n }\n}\n.alert {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.alert-success {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);\n background-repeat: repeat-x;\n border-color: #b2dba1;\n}\n.alert-info {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);\n background-repeat: repeat-x;\n border-color: #9acfea;\n}\n.alert-warning {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);\n background-repeat: repeat-x;\n border-color: #f5e79e;\n}\n.alert-danger {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);\n background-repeat: repeat-x;\n border-color: #dca7a7;\n}\n.progress {\n background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.list-group {\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 #286090;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);\n background-repeat: repeat-x;\n border-color: #2b669a;\n}\n.list-group-item.active .badge,\n.list-group-item.active:hover .badge,\n.list-group-item.active:focus .badge {\n text-shadow: none;\n}\n.panel {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.panel-default > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-primary > .panel-heading {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-success > .panel-heading {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-info > .panel-heading {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-warning > .panel-heading {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-danger > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);\n background-repeat: repeat-x;\n}\n.well {\n background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);\n background-repeat: repeat-x;\n border-color: #dcdcdc;\n -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n/*# sourceMappingURL=bootstrap-theme.css.map */","/*!\n * Bootstrap v3.4.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.btn-default:active,\n.btn-primary:active,\n.btn-success:active,\n.btn-info:active,\n.btn-warning:active,\n.btn-danger:active,\n.btn-default.active,\n.btn-primary.active,\n.btn-success.active,\n.btn-info.active,\n.btn-warning.active,\n.btn-danger.active {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-default.disabled,\n.btn-primary.disabled,\n.btn-success.disabled,\n.btn-info.disabled,\n.btn-warning.disabled,\n.btn-danger.disabled,\n.btn-default[disabled],\n.btn-primary[disabled],\n.btn-success[disabled],\n.btn-info[disabled],\n.btn-warning[disabled],\n.btn-danger[disabled],\nfieldset[disabled] .btn-default,\nfieldset[disabled] .btn-primary,\nfieldset[disabled] .btn-success,\nfieldset[disabled] .btn-info,\nfieldset[disabled] .btn-warning,\nfieldset[disabled] .btn-danger {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-default .badge,\n.btn-primary .badge,\n.btn-success .badge,\n.btn-info .badge,\n.btn-warning .badge,\n.btn-danger .badge {\n text-shadow: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n}\n.btn-default {\n background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0));\n background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #dbdbdb;\n text-shadow: 0 1px 0 #fff;\n border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus {\n background-color: #e0e0e0;\n background-position: 0 -15px;\n}\n.btn-default:active,\n.btn-default.active {\n background-color: #e0e0e0;\n border-color: #dbdbdb;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n background-color: #e0e0e0;\n background-image: none;\n}\n.btn-primary {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88));\n background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #245580;\n}\n.btn-primary:hover,\n.btn-primary:focus {\n background-color: #265a88;\n background-position: 0 -15px;\n}\n.btn-primary:active,\n.btn-primary.active {\n background-color: #265a88;\n border-color: #245580;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n background-color: #265a88;\n background-image: none;\n}\n.btn-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641));\n background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #3e8f3e;\n}\n.btn-success:hover,\n.btn-success:focus {\n background-color: #419641;\n background-position: 0 -15px;\n}\n.btn-success:active,\n.btn-success.active {\n background-color: #419641;\n border-color: #3e8f3e;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n background-color: #419641;\n background-image: none;\n}\n.btn-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2));\n background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #28a4c9;\n}\n.btn-info:hover,\n.btn-info:focus {\n background-color: #2aabd2;\n background-position: 0 -15px;\n}\n.btn-info:active,\n.btn-info.active {\n background-color: #2aabd2;\n border-color: #28a4c9;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n background-color: #2aabd2;\n background-image: none;\n}\n.btn-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316));\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #e38d13;\n}\n.btn-warning:hover,\n.btn-warning:focus {\n background-color: #eb9316;\n background-position: 0 -15px;\n}\n.btn-warning:active,\n.btn-warning.active {\n background-color: #eb9316;\n border-color: #e38d13;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n background-color: #eb9316;\n background-image: none;\n}\n.btn-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a));\n background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #b92c28;\n}\n.btn-danger:hover,\n.btn-danger:focus {\n background-color: #c12e2a;\n background-position: 0 -15px;\n}\n.btn-danger:active,\n.btn-danger.active {\n background-color: #c12e2a;\n border-color: #b92c28;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n background-color: #c12e2a;\n background-image: none;\n}\n.thumbnail,\n.img-thumbnail {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-repeat: repeat-x;\n background-color: #e8e8e8;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-repeat: repeat-x;\n background-color: #2e6da4;\n}\n.navbar-default {\n background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#ffffff), to(#f8f8f8));\n background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2));\n background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);\n background-repeat: repeat-x;\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);\n}\n.navbar-inverse {\n background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);\n background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222));\n background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f));\n background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);\n background-repeat: repeat-x;\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n}\n.navbar-inverse .navbar-brand,\n.navbar-inverse .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n@media (max-width: 767px) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-repeat: repeat-x;\n }\n}\n.alert {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.alert-success {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc));\n background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);\n background-repeat: repeat-x;\n border-color: #b2dba1;\n}\n.alert-info {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0));\n background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);\n background-repeat: repeat-x;\n border-color: #9acfea;\n}\n.alert-warning {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0));\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);\n background-repeat: repeat-x;\n border-color: #f5e79e;\n}\n.alert-danger {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3));\n background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);\n background-repeat: repeat-x;\n border-color: #dca7a7;\n}\n.progress {\n background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5));\n background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090));\n background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44));\n background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5));\n background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f));\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c));\n background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.list-group {\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 #286090;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a));\n background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);\n background-repeat: repeat-x;\n border-color: #2b669a;\n}\n.list-group-item.active .badge,\n.list-group-item.active:hover .badge,\n.list-group-item.active:focus .badge {\n text-shadow: none;\n}\n.panel {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.panel-default > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-primary > .panel-heading {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-success > .panel-heading {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6));\n background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-info > .panel-heading {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3));\n background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-warning > .panel-heading {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc));\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-danger > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc));\n background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);\n background-repeat: repeat-x;\n}\n.well {\n background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5));\n background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);\n background-repeat: repeat-x;\n border-color: #dcdcdc;\n -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n/*# sourceMappingURL=bootstrap-theme.css.map */","// stylelint-disable selector-no-qualifying-type, selector-max-compound-selectors\n\n/*!\n * Bootstrap v3.4.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, .2);\n @shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);\n .box-shadow(@shadow);\n\n // Reset the shadow\n &:active,\n &.active {\n .box-shadow(inset 0 3px 5px rgba(0, 0, 0, .125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n .box-shadow(none);\n }\n\n .badge {\n text-shadow: none;\n }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners; see https://github.com/twbs/bootstrap/issues/10620\n background-repeat: repeat-x;\n border-color: darken(@btn-color, 14%);\n\n &:hover,\n &:focus {\n background-color: darken(@btn-color, 12%);\n background-position: 0 -15px;\n }\n\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n border-color: darken(@btn-color, 14%);\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &.focus,\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n background-image: none;\n }\n }\n}\n\n// Common styles\n.btn {\n // Remove the gradient for the pressed/active state\n &:active,\n &.active {\n background-image: none;\n }\n}\n\n// Apply the mixin to the buttons\n.btn-default {\n .btn-styles(@btn-default-bg);\n text-shadow: 0 1px 0 #fff;\n border-color: #ccc;\n}\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger { .btn-styles(@btn-danger-bg); }\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n .box-shadow(0 1px 2px rgba(0, 0, 0, .075));\n}\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n border-radius: @navbar-border-radius;\n @shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);\n .box-shadow(@shadow);\n\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: darken(@navbar-default-link-active-bg, 5%); @end-color: darken(@navbar-default-link-active-bg, 2%));\n .box-shadow(inset 0 3px 9px rgba(0, 0, 0, .075));\n }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255, 255, 255, .25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered; see https://github.com/twbs/bootstrap/issues/10257\n border-radius: @navbar-border-radius;\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: @navbar-inverse-link-active-bg; @end-color: lighten(@navbar-inverse-link-active-bg, 2.5%));\n .box-shadow(inset 0 3px 9px rgba(0, 0, 0, .25));\n }\n\n .navbar-brand,\n .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, .25);\n }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n\n// Fix active state of dropdown items in collapsed mode\n@media (max-width: @grid-float-breakpoint-max) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: #fff;\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n }\n }\n}\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n text-shadow: 0 1px 0 rgba(255, 255, 255, .2);\n @shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);\n .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success { .alert-styles(@alert-success-bg); }\n.alert-info { .alert-styles(@alert-info-bg); }\n.alert-warning { .alert-styles(@alert-warning-bg); }\n.alert-danger { .alert-styles(@alert-danger-bg); }\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }\n\n// Reset the striped class because our mixins don't do multiple gradients and\n// the above custom styles override the new `.progress-bar-striped` in v3.2.0.\n.progress-bar-striped {\n #gradient > .striped();\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n border-radius: @border-radius-base;\n .box-shadow(0 1px 2px rgba(0, 0, 0, .075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n border-color: darken(@list-group-active-border, 7.5%);\n\n .badge {\n text-shadow: none;\n }\n}\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n .box-shadow(0 1px 2px rgba(0, 0, 0, .05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n border-color: darken(@well-bg, 10%);\n @shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);\n .box-shadow(@shadow);\n}\n","// stylelint-disable indentation, property-no-vendor-prefix, selector-no-vendor-prefix\n\n// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility) {\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n word-wrap: break-word;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// stylelint-disable value-no-vendor-prefix, selector-max-id\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\", argb(@start-color), argb(@end-color))); // IE9 and down\n background-repeat: repeat-x;\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\", argb(@start-color), argb(@end-color))); // IE9 and down\n background-repeat: repeat-x;\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\", argb(@start-color), argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n background-repeat: no-repeat;\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\", argb(@start-color), argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n background-repeat: no-repeat;\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255, 255, 255, .15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n"]}
|
backend/staticfiles/rest_framework/css/bootstrap-theme.min.css.51806092cc05.map.gz
ADDED
|
Binary file (8.03 kB). View file
|
|
|
backend/staticfiles/rest_framework/css/bootstrap-theme.min.css.gz
ADDED
|
Binary file (2.77 kB). View file
|
|
|
backend/staticfiles/rest_framework/css/bootstrap-theme.min.css.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
{"version":3,"sources":["bootstrap-theme.css","dist/css/bootstrap-theme.css","less/theme.less","less/mixins/vendor-prefixes.less","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":"AAAA;;;;ACUA,YCWA,aDbA,UAFA,aACA,aAEA,aCkBE,YAAA,EAAA,KAAA,EAAA,eC2CA,mBAAA,MAAA,EAAA,IAAA,EAAA,qBAAA,CAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,EAAA,qBAAA,CAAA,EAAA,IAAA,IAAA,iBF7CV,mBANA,mBACA,oBCWE,oBDRF,iBANA,iBAIA,oBANA,oBAOA,oBANA,oBAQA,oBANA,oBEmDE,mBAAA,MAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,iBFpCV,qBAMA,sBCJE,sBDDF,uBAHA,mBAMA,oBARA,sBAMA,uBALA,sBAMA,uBAJA,sBAMA,uBAOA,+BALA,gCAGA,6BAFA,gCACA,gCAEA,gCEwBE,mBAAA,KACQ,WAAA,KFfV,mBCnCA,oBDiCA,iBAFA,oBACA,oBAEA,oBCXI,YAAA,KDgBJ,YCyBE,YAEE,iBAAA,KAKJ,aEvEI,iBAAA,iDACA,iBAAA,4CACA,iBAAA,qEAAA,iBAAA,+CACA,OAAA,+GClBF,OAAA,0DH8CA,kBAAA,SACA,aAAA,QAyCA,YAAA,EAAA,IAAA,EAAA,KACA,aAAA,KDnBF,mBCrBE,mBAEE,iBAAA,QACA,oBAAA,EAAA,MDuBJ,oBCpBE,oBAEE,iBAAA,QACA,aAAA,QAMA,sBD8BJ,6BANA,4BAGA,6BANA,4BAHA,4BAFA,uBAeA,8BANA,6BAGA,8BANA,6BAHA,6BAFA,gCAeA,uCANA,sCAGA,uCANA,sCAHA,sCCdM,iBAAA,QACA,iBAAA,KAoBN,aE5EI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GClBF,OAAA,0DH8CA,kBAAA,SACA,aAAA,QDgEF,mBC9DE,mBAEE,iBAAA,QACA,oBAAA,EAAA,MDgEJ,oBC7DE,oBAEE,iBAAA,QACA,aAAA,QAMA,sBDuEJ,6BANA,4BAGA,6BANA,4BAHA,4BAFA,uBAeA,8BANA,6BAGA,8BANA,6BAHA,6BAFA,gCAeA,uCANA,sCAGA,uCANA,sCAHA,sCCvDM,iBAAA,QACA,iBAAA,KAqBN,aE7EI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GClBF,OAAA,0DH8CA,kBAAA,SACA,aAAA,QDyGF,mBCvGE,mBAEE,iBAAA,QACA,oBAAA,EAAA,MDyGJ,oBCtGE,oBAEE,iBAAA,QACA,aAAA,QAMA,sBDgHJ,6BANA,4BAGA,6BANA,4BAHA,4BAFA,uBAeA,8BANA,6BAGA,8BANA,6BAHA,6BAFA,gCAeA,uCANA,sCAGA,uCANA,sCAHA,sCChGM,iBAAA,QACA,iBAAA,KAsBN,UE9EI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GClBF,OAAA,0DH8CA,kBAAA,SACA,aAAA,QDkJF,gBChJE,gBAEE,iBAAA,QACA,oBAAA,EAAA,MDkJJ,iBC/IE,iBAEE,iBAAA,QACA,aAAA,QAMA,mBDyJJ,0BANA,yBAGA,0BANA,yBAHA,yBAFA,oBAeA,2BANA,0BAGA,2BANA,0BAHA,0BAFA,6BAeA,oCANA,mCAGA,oCANA,mCAHA,mCCzIM,iBAAA,QACA,iBAAA,KAuBN,aE/EI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GClBF,OAAA,0DH8CA,kBAAA,SACA,aAAA,QD2LF,mBCzLE,mBAEE,iBAAA,QACA,oBAAA,EAAA,MD2LJ,oBCxLE,oBAEE,iBAAA,QACA,aAAA,QAMA,sBDkMJ,6BANA,4BAGA,6BANA,4BAHA,4BAFA,uBAeA,8BANA,6BAGA,8BANA,6BAHA,6BAFA,gCAeA,uCANA,sCAGA,uCANA,sCAHA,sCClLM,iBAAA,QACA,iBAAA,KAwBN,YEhFI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GClBF,OAAA,0DH8CA,kBAAA,SACA,aAAA,QDoOF,kBClOE,kBAEE,iBAAA,QACA,oBAAA,EAAA,MDoOJ,mBCjOE,mBAEE,iBAAA,QACA,aAAA,QAMA,qBD2OJ,4BANA,2BAGA,4BANA,2BAHA,2BAFA,sBAeA,6BANA,4BAGA,6BANA,4BAHA,4BAFA,+BAeA,sCANA,qCAGA,sCANA,qCAHA,qCC3NM,iBAAA,QACA,iBAAA,KD2ON,eC5MA,WCtCE,mBAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,EAAA,IAAA,IAAA,iBFsPV,0BCvMA,0BEjGI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFgGF,iBAAA,QAEF,yBD6MA,+BADA,+BGlTI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFsGF,iBAAA,QASF,gBEnHI,iBAAA,iDACA,iBAAA,4CACA,iBAAA,qEAAA,iBAAA,+CACA,OAAA,+GACA,kBAAA,SCnBF,OAAA,0DHqIA,cAAA,ICrEA,mBAAA,MAAA,EAAA,IAAA,EAAA,qBAAA,CAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,EAAA,qBAAA,CAAA,EAAA,IAAA,IAAA,iBFuRV,sCCtNA,oCEnHI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SD6CF,mBAAA,MAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,iBD8EV,cDoNA,iBClNE,YAAA,EAAA,IAAA,EAAA,sBAIF,gBEtII,iBAAA,iDACA,iBAAA,4CACA,iBAAA,qEAAA,iBAAA,+CACA,OAAA,+GACA,kBAAA,SCnBF,OAAA,0DHwJA,cAAA,IDyNF,sCC5NA,oCEtII,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SD6CF,mBAAA,MAAA,EAAA,IAAA,IAAA,gBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,gBDoFV,8BDuOA,iCC3NI,YAAA,EAAA,KAAA,EAAA,gBDgOJ,qBADA,kBC1NA,mBAGE,cAAA,EAIF,yBAEI,mDDwNF,yDADA,yDCpNI,MAAA,KEnKF,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,UF2KJ,OACE,YAAA,EAAA,IAAA,EAAA,qBC/HA,mBAAA,MAAA,EAAA,IAAA,EAAA,qBAAA,CAAA,EAAA,IAAA,IAAA,gBACQ,WAAA,MAAA,EAAA,IAAA,EAAA,qBAAA,CAAA,EAAA,IAAA,IAAA,gBD0IV,eE5LI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFoLF,aAAA,QAKF,YE7LI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFoLF,aAAA,QAMF,eE9LI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFoLF,aAAA,QAOF,cE/LI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFoLF,aAAA,QAeF,UEvMI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF6MJ,cEjNI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF8MJ,sBElNI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF+MJ,mBEnNI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFgNJ,sBEpNI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFiNJ,qBErNI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFqNJ,sBExLI,iBAAA,yKACA,iBAAA,oKACA,iBAAA,iKF+LJ,YACE,cAAA,IClLA,mBAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,EAAA,IAAA,IAAA,iBDoLV,wBDiQA,8BADA,8BC7PE,YAAA,EAAA,KAAA,EAAA,QEzOE,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFuOF,aAAA,QALF,+BD6QA,qCADA,qCCpQI,YAAA,KAUJ,OCvME,mBAAA,EAAA,IAAA,IAAA,gBACQ,WAAA,EAAA,IAAA,IAAA,gBDgNV,8BElQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF+PJ,8BEnQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFgQJ,8BEpQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFiQJ,2BErQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFkQJ,8BEtQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFmQJ,6BEvQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF0QJ,ME9QI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF4QF,aAAA,QC/NA,mBAAA,MAAA,EAAA,IAAA,IAAA,eAAA,CAAA,EAAA,IAAA,EAAA,qBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,eAAA,CAAA,EAAA,IAAA,EAAA","sourcesContent":["/*!\n * Bootstrap v3.4.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.btn-default:active,\n.btn-primary:active,\n.btn-success:active,\n.btn-info:active,\n.btn-warning:active,\n.btn-danger:active,\n.btn-default.active,\n.btn-primary.active,\n.btn-success.active,\n.btn-info.active,\n.btn-warning.active,\n.btn-danger.active {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-default.disabled,\n.btn-primary.disabled,\n.btn-success.disabled,\n.btn-info.disabled,\n.btn-warning.disabled,\n.btn-danger.disabled,\n.btn-default[disabled],\n.btn-primary[disabled],\n.btn-success[disabled],\n.btn-info[disabled],\n.btn-warning[disabled],\n.btn-danger[disabled],\nfieldset[disabled] .btn-default,\nfieldset[disabled] .btn-primary,\nfieldset[disabled] .btn-success,\nfieldset[disabled] .btn-info,\nfieldset[disabled] .btn-warning,\nfieldset[disabled] .btn-danger {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-default .badge,\n.btn-primary .badge,\n.btn-success .badge,\n.btn-info .badge,\n.btn-warning .badge,\n.btn-danger .badge {\n text-shadow: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n}\n.btn-default {\n background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #dbdbdb;\n text-shadow: 0 1px 0 #fff;\n border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus {\n background-color: #e0e0e0;\n background-position: 0 -15px;\n}\n.btn-default:active,\n.btn-default.active {\n background-color: #e0e0e0;\n border-color: #dbdbdb;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n background-color: #e0e0e0;\n background-image: none;\n}\n.btn-primary {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #245580;\n}\n.btn-primary:hover,\n.btn-primary:focus {\n background-color: #265a88;\n background-position: 0 -15px;\n}\n.btn-primary:active,\n.btn-primary.active {\n background-color: #265a88;\n border-color: #245580;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n background-color: #265a88;\n background-image: none;\n}\n.btn-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #3e8f3e;\n}\n.btn-success:hover,\n.btn-success:focus {\n background-color: #419641;\n background-position: 0 -15px;\n}\n.btn-success:active,\n.btn-success.active {\n background-color: #419641;\n border-color: #3e8f3e;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n background-color: #419641;\n background-image: none;\n}\n.btn-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #28a4c9;\n}\n.btn-info:hover,\n.btn-info:focus {\n background-color: #2aabd2;\n background-position: 0 -15px;\n}\n.btn-info:active,\n.btn-info.active {\n background-color: #2aabd2;\n border-color: #28a4c9;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n background-color: #2aabd2;\n background-image: none;\n}\n.btn-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #e38d13;\n}\n.btn-warning:hover,\n.btn-warning:focus {\n background-color: #eb9316;\n background-position: 0 -15px;\n}\n.btn-warning:active,\n.btn-warning.active {\n background-color: #eb9316;\n border-color: #e38d13;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n background-color: #eb9316;\n background-image: none;\n}\n.btn-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #b92c28;\n}\n.btn-danger:hover,\n.btn-danger:focus {\n background-color: #c12e2a;\n background-position: 0 -15px;\n}\n.btn-danger:active,\n.btn-danger.active {\n background-color: #c12e2a;\n border-color: #b92c28;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n background-color: #c12e2a;\n background-image: none;\n}\n.thumbnail,\n.img-thumbnail {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-repeat: repeat-x;\n background-color: #e8e8e8;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-repeat: repeat-x;\n background-color: #2e6da4;\n}\n.navbar-default {\n background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);\n background-repeat: repeat-x;\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);\n}\n.navbar-inverse {\n background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);\n background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%);\n background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);\n background-repeat: repeat-x;\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n}\n.navbar-inverse .navbar-brand,\n.navbar-inverse .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n@media (max-width: 767px) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-repeat: repeat-x;\n }\n}\n.alert {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.alert-success {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);\n background-repeat: repeat-x;\n border-color: #b2dba1;\n}\n.alert-info {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);\n background-repeat: repeat-x;\n border-color: #9acfea;\n}\n.alert-warning {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);\n background-repeat: repeat-x;\n border-color: #f5e79e;\n}\n.alert-danger {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);\n background-repeat: repeat-x;\n border-color: #dca7a7;\n}\n.progress {\n background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.list-group {\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 #286090;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);\n background-repeat: repeat-x;\n border-color: #2b669a;\n}\n.list-group-item.active .badge,\n.list-group-item.active:hover .badge,\n.list-group-item.active:focus .badge {\n text-shadow: none;\n}\n.panel {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.panel-default > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-primary > .panel-heading {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-success > .panel-heading {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-info > .panel-heading {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-warning > .panel-heading {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-danger > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);\n background-repeat: repeat-x;\n}\n.well {\n background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);\n background-repeat: repeat-x;\n border-color: #dcdcdc;\n -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n/*# sourceMappingURL=bootstrap-theme.css.map */","/*!\n * Bootstrap v3.4.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.btn-default:active,\n.btn-primary:active,\n.btn-success:active,\n.btn-info:active,\n.btn-warning:active,\n.btn-danger:active,\n.btn-default.active,\n.btn-primary.active,\n.btn-success.active,\n.btn-info.active,\n.btn-warning.active,\n.btn-danger.active {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-default.disabled,\n.btn-primary.disabled,\n.btn-success.disabled,\n.btn-info.disabled,\n.btn-warning.disabled,\n.btn-danger.disabled,\n.btn-default[disabled],\n.btn-primary[disabled],\n.btn-success[disabled],\n.btn-info[disabled],\n.btn-warning[disabled],\n.btn-danger[disabled],\nfieldset[disabled] .btn-default,\nfieldset[disabled] .btn-primary,\nfieldset[disabled] .btn-success,\nfieldset[disabled] .btn-info,\nfieldset[disabled] .btn-warning,\nfieldset[disabled] .btn-danger {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-default .badge,\n.btn-primary .badge,\n.btn-success .badge,\n.btn-info .badge,\n.btn-warning .badge,\n.btn-danger .badge {\n text-shadow: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n}\n.btn-default {\n background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0));\n background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #dbdbdb;\n text-shadow: 0 1px 0 #fff;\n border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus {\n background-color: #e0e0e0;\n background-position: 0 -15px;\n}\n.btn-default:active,\n.btn-default.active {\n background-color: #e0e0e0;\n border-color: #dbdbdb;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n background-color: #e0e0e0;\n background-image: none;\n}\n.btn-primary {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88));\n background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #245580;\n}\n.btn-primary:hover,\n.btn-primary:focus {\n background-color: #265a88;\n background-position: 0 -15px;\n}\n.btn-primary:active,\n.btn-primary.active {\n background-color: #265a88;\n border-color: #245580;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n background-color: #265a88;\n background-image: none;\n}\n.btn-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641));\n background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #3e8f3e;\n}\n.btn-success:hover,\n.btn-success:focus {\n background-color: #419641;\n background-position: 0 -15px;\n}\n.btn-success:active,\n.btn-success.active {\n background-color: #419641;\n border-color: #3e8f3e;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n background-color: #419641;\n background-image: none;\n}\n.btn-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2));\n background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #28a4c9;\n}\n.btn-info:hover,\n.btn-info:focus {\n background-color: #2aabd2;\n background-position: 0 -15px;\n}\n.btn-info:active,\n.btn-info.active {\n background-color: #2aabd2;\n border-color: #28a4c9;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n background-color: #2aabd2;\n background-image: none;\n}\n.btn-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316));\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #e38d13;\n}\n.btn-warning:hover,\n.btn-warning:focus {\n background-color: #eb9316;\n background-position: 0 -15px;\n}\n.btn-warning:active,\n.btn-warning.active {\n background-color: #eb9316;\n border-color: #e38d13;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n background-color: #eb9316;\n background-image: none;\n}\n.btn-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a));\n background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #b92c28;\n}\n.btn-danger:hover,\n.btn-danger:focus {\n background-color: #c12e2a;\n background-position: 0 -15px;\n}\n.btn-danger:active,\n.btn-danger.active {\n background-color: #c12e2a;\n border-color: #b92c28;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n background-color: #c12e2a;\n background-image: none;\n}\n.thumbnail,\n.img-thumbnail {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-repeat: repeat-x;\n background-color: #e8e8e8;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-repeat: repeat-x;\n background-color: #2e6da4;\n}\n.navbar-default {\n background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#ffffff), to(#f8f8f8));\n background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2));\n background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);\n background-repeat: repeat-x;\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);\n}\n.navbar-inverse {\n background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);\n background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222));\n background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f));\n background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);\n background-repeat: repeat-x;\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n}\n.navbar-inverse .navbar-brand,\n.navbar-inverse .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n@media (max-width: 767px) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-repeat: repeat-x;\n }\n}\n.alert {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.alert-success {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc));\n background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);\n background-repeat: repeat-x;\n border-color: #b2dba1;\n}\n.alert-info {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0));\n background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);\n background-repeat: repeat-x;\n border-color: #9acfea;\n}\n.alert-warning {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0));\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);\n background-repeat: repeat-x;\n border-color: #f5e79e;\n}\n.alert-danger {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3));\n background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);\n background-repeat: repeat-x;\n border-color: #dca7a7;\n}\n.progress {\n background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5));\n background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090));\n background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44));\n background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5));\n background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f));\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c));\n background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);\n background-repeat: repeat-x;\n}\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.list-group {\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 #286090;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a));\n background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);\n background-repeat: repeat-x;\n border-color: #2b669a;\n}\n.list-group-item.active .badge,\n.list-group-item.active:hover .badge,\n.list-group-item.active:focus .badge {\n text-shadow: none;\n}\n.panel {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.panel-default > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-primary > .panel-heading {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-success > .panel-heading {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6));\n background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-info > .panel-heading {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3));\n background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-warning > .panel-heading {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc));\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);\n background-repeat: repeat-x;\n}\n.panel-danger > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc));\n background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);\n background-repeat: repeat-x;\n}\n.well {\n background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5));\n background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);\n background-repeat: repeat-x;\n border-color: #dcdcdc;\n -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n/*# sourceMappingURL=bootstrap-theme.css.map */","// stylelint-disable selector-no-qualifying-type, selector-max-compound-selectors\n\n/*!\n * Bootstrap v3.4.1 (https://getbootstrap.com/)\n * Copyright 2011-2019 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, .2);\n @shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);\n .box-shadow(@shadow);\n\n // Reset the shadow\n &:active,\n &.active {\n .box-shadow(inset 0 3px 5px rgba(0, 0, 0, .125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n .box-shadow(none);\n }\n\n .badge {\n text-shadow: none;\n }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners; see https://github.com/twbs/bootstrap/issues/10620\n background-repeat: repeat-x;\n border-color: darken(@btn-color, 14%);\n\n &:hover,\n &:focus {\n background-color: darken(@btn-color, 12%);\n background-position: 0 -15px;\n }\n\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n border-color: darken(@btn-color, 14%);\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &.focus,\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n background-image: none;\n }\n }\n}\n\n// Common styles\n.btn {\n // Remove the gradient for the pressed/active state\n &:active,\n &.active {\n background-image: none;\n }\n}\n\n// Apply the mixin to the buttons\n.btn-default {\n .btn-styles(@btn-default-bg);\n text-shadow: 0 1px 0 #fff;\n border-color: #ccc;\n}\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger { .btn-styles(@btn-danger-bg); }\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n .box-shadow(0 1px 2px rgba(0, 0, 0, .075));\n}\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n border-radius: @navbar-border-radius;\n @shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);\n .box-shadow(@shadow);\n\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: darken(@navbar-default-link-active-bg, 5%); @end-color: darken(@navbar-default-link-active-bg, 2%));\n .box-shadow(inset 0 3px 9px rgba(0, 0, 0, .075));\n }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255, 255, 255, .25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered; see https://github.com/twbs/bootstrap/issues/10257\n border-radius: @navbar-border-radius;\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: @navbar-inverse-link-active-bg; @end-color: lighten(@navbar-inverse-link-active-bg, 2.5%));\n .box-shadow(inset 0 3px 9px rgba(0, 0, 0, .25));\n }\n\n .navbar-brand,\n .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, .25);\n }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n\n// Fix active state of dropdown items in collapsed mode\n@media (max-width: @grid-float-breakpoint-max) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: #fff;\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n }\n }\n}\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n text-shadow: 0 1px 0 rgba(255, 255, 255, .2);\n @shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);\n .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success { .alert-styles(@alert-success-bg); }\n.alert-info { .alert-styles(@alert-info-bg); }\n.alert-warning { .alert-styles(@alert-warning-bg); }\n.alert-danger { .alert-styles(@alert-danger-bg); }\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }\n\n// Reset the striped class because our mixins don't do multiple gradients and\n// the above custom styles override the new `.progress-bar-striped` in v3.2.0.\n.progress-bar-striped {\n #gradient > .striped();\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n border-radius: @border-radius-base;\n .box-shadow(0 1px 2px rgba(0, 0, 0, .075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n border-color: darken(@list-group-active-border, 7.5%);\n\n .badge {\n text-shadow: none;\n }\n}\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n .box-shadow(0 1px 2px rgba(0, 0, 0, .05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n border-color: darken(@well-bg, 10%);\n @shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);\n .box-shadow(@shadow);\n}\n","// stylelint-disable indentation, property-no-vendor-prefix, selector-no-vendor-prefix\n\n// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility) {\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n word-wrap: break-word;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// stylelint-disable value-no-vendor-prefix, selector-max-id\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\", argb(@start-color), argb(@end-color))); // IE9 and down\n background-repeat: repeat-x;\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\", argb(@start-color), argb(@end-color))); // IE9 and down\n background-repeat: repeat-x;\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\", argb(@start-color), argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n background-repeat: no-repeat;\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\", argb(@start-color), argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n background-repeat: no-repeat;\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255, 255, 255, .15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n"]}
|
backend/staticfiles/rest_framework/css/bootstrap-theme.min.css.map.gz
ADDED
|
Binary file (8.03 kB). View file
|
|
|
backend/staticfiles/rest_framework/css/bootstrap-tweaks.css
ADDED
|
@@ -0,0 +1,237 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
/*
|
| 2 |
+
|
| 3 |
+
This CSS file contains some tweaks specific to the included Bootstrap theme.
|
| 4 |
+
It's separate from `style.css` so that it can be easily overridden by replacing
|
| 5 |
+
a single block in the template.
|
| 6 |
+
|
| 7 |
+
*/
|
| 8 |
+
|
| 9 |
+
.form-actions {
|
| 10 |
+
background: transparent;
|
| 11 |
+
border-top-color: transparent;
|
| 12 |
+
padding-top: 0;
|
| 13 |
+
text-align: right;
|
| 14 |
+
}
|
| 15 |
+
|
| 16 |
+
#generic-content-form textarea {
|
| 17 |
+
font-family:Consolas,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New, monospace;
|
| 18 |
+
font-size: 80%;
|
| 19 |
+
}
|
| 20 |
+
|
| 21 |
+
.navbar-inverse .brand a {
|
| 22 |
+
color: #999999;
|
| 23 |
+
}
|
| 24 |
+
.navbar-inverse .brand:hover a {
|
| 25 |
+
color: white;
|
| 26 |
+
text-decoration: none;
|
| 27 |
+
}
|
| 28 |
+
|
| 29 |
+
/* custom navigation styles */
|
| 30 |
+
.navbar {
|
| 31 |
+
width: 100%;
|
| 32 |
+
position: fixed;
|
| 33 |
+
left: 0;
|
| 34 |
+
top: 0;
|
| 35 |
+
}
|
| 36 |
+
|
| 37 |
+
.navbar {
|
| 38 |
+
background: #2C2C2C;
|
| 39 |
+
color: white;
|
| 40 |
+
border: none;
|
| 41 |
+
border-top: 5px solid #A30000;
|
| 42 |
+
border-radius: 0px;
|
| 43 |
+
}
|
| 44 |
+
|
| 45 |
+
.navbar .nav li, .navbar .nav li a, .navbar .brand:hover {
|
| 46 |
+
color: white;
|
| 47 |
+
}
|
| 48 |
+
|
| 49 |
+
.nav-list > .active > a, .nav-list > .active > a:hover {
|
| 50 |
+
background: #2C2C2C;
|
| 51 |
+
}
|
| 52 |
+
|
| 53 |
+
.navbar .dropdown-menu li a, .navbar .dropdown-menu li {
|
| 54 |
+
color: #A30000;
|
| 55 |
+
}
|
| 56 |
+
|
| 57 |
+
.navbar .dropdown-menu li a:hover {
|
| 58 |
+
background: #EEEEEE;
|
| 59 |
+
color: #C20000;
|
| 60 |
+
}
|
| 61 |
+
|
| 62 |
+
ul.breadcrumb {
|
| 63 |
+
margin: 70px 0 0 0;
|
| 64 |
+
}
|
| 65 |
+
|
| 66 |
+
.breadcrumb li.active a {
|
| 67 |
+
color: #777;
|
| 68 |
+
}
|
| 69 |
+
|
| 70 |
+
.pagination>.disabled>a,
|
| 71 |
+
.pagination>.disabled>a:hover,
|
| 72 |
+
.pagination>.disabled>a:focus {
|
| 73 |
+
cursor: not-allowed;
|
| 74 |
+
pointer-events: none;
|
| 75 |
+
}
|
| 76 |
+
|
| 77 |
+
.pager>.disabled>a,
|
| 78 |
+
.pager>.disabled>a:hover,
|
| 79 |
+
.pager>.disabled>a:focus {
|
| 80 |
+
pointer-events: none;
|
| 81 |
+
}
|
| 82 |
+
|
| 83 |
+
.pager .next {
|
| 84 |
+
margin-left: 10px;
|
| 85 |
+
}
|
| 86 |
+
|
| 87 |
+
/*=== dabapps bootstrap styles ====*/
|
| 88 |
+
|
| 89 |
+
html {
|
| 90 |
+
width:100%;
|
| 91 |
+
background: none;
|
| 92 |
+
}
|
| 93 |
+
|
| 94 |
+
/*body, .navbar .container-fluid {
|
| 95 |
+
max-width: 1150px;
|
| 96 |
+
margin: 0 auto;
|
| 97 |
+
}*/
|
| 98 |
+
|
| 99 |
+
body {
|
| 100 |
+
background: url("../img/grid.png") repeat-x;
|
| 101 |
+
background-attachment: fixed;
|
| 102 |
+
}
|
| 103 |
+
|
| 104 |
+
#content {
|
| 105 |
+
margin: 0;
|
| 106 |
+
padding-bottom: 60px;
|
| 107 |
+
}
|
| 108 |
+
|
| 109 |
+
/* sticky footer and footer */
|
| 110 |
+
html, body {
|
| 111 |
+
height: 100%;
|
| 112 |
+
}
|
| 113 |
+
|
| 114 |
+
.wrapper {
|
| 115 |
+
position: relative;
|
| 116 |
+
top: 0;
|
| 117 |
+
left: 0;
|
| 118 |
+
padding-top: 60px;
|
| 119 |
+
margin: -60px 0;
|
| 120 |
+
min-height: 100%;
|
| 121 |
+
}
|
| 122 |
+
|
| 123 |
+
.form-switcher {
|
| 124 |
+
margin-bottom: 0;
|
| 125 |
+
}
|
| 126 |
+
|
| 127 |
+
.well {
|
| 128 |
+
-webkit-box-shadow: none;
|
| 129 |
+
-moz-box-shadow: none;
|
| 130 |
+
box-shadow: none;
|
| 131 |
+
}
|
| 132 |
+
|
| 133 |
+
.well .form-actions {
|
| 134 |
+
padding-bottom: 0;
|
| 135 |
+
margin-bottom: 0;
|
| 136 |
+
}
|
| 137 |
+
|
| 138 |
+
.well form {
|
| 139 |
+
margin-bottom: 0;
|
| 140 |
+
}
|
| 141 |
+
|
| 142 |
+
.nav-tabs {
|
| 143 |
+
border: 0;
|
| 144 |
+
}
|
| 145 |
+
|
| 146 |
+
.nav-tabs > li {
|
| 147 |
+
float: right;
|
| 148 |
+
}
|
| 149 |
+
|
| 150 |
+
.nav-tabs li a {
|
| 151 |
+
margin-right: 0;
|
| 152 |
+
}
|
| 153 |
+
|
| 154 |
+
.nav-tabs > .active > a {
|
| 155 |
+
background: #F5F5F5;
|
| 156 |
+
}
|
| 157 |
+
|
| 158 |
+
.nav-tabs > .active > a:hover {
|
| 159 |
+
background: #F5F5F5;
|
| 160 |
+
}
|
| 161 |
+
|
| 162 |
+
.tabbable.first-tab-active .tab-content {
|
| 163 |
+
border-top-right-radius: 0;
|
| 164 |
+
}
|
| 165 |
+
|
| 166 |
+
footer {
|
| 167 |
+
position: absolute;
|
| 168 |
+
bottom: 0;
|
| 169 |
+
left: 0;
|
| 170 |
+
clear: both;
|
| 171 |
+
z-index: 10;
|
| 172 |
+
height: 60px;
|
| 173 |
+
width: 95%;
|
| 174 |
+
margin: 0 2.5%;
|
| 175 |
+
}
|
| 176 |
+
|
| 177 |
+
footer p {
|
| 178 |
+
text-align: center;
|
| 179 |
+
color: gray;
|
| 180 |
+
border-top: 1px solid #DDDDDD;
|
| 181 |
+
padding-top: 10px;
|
| 182 |
+
}
|
| 183 |
+
|
| 184 |
+
footer a {
|
| 185 |
+
color: gray !important;
|
| 186 |
+
font-weight: bold;
|
| 187 |
+
}
|
| 188 |
+
|
| 189 |
+
footer a:hover {
|
| 190 |
+
color: gray;
|
| 191 |
+
}
|
| 192 |
+
|
| 193 |
+
.page-header {
|
| 194 |
+
border-bottom: none;
|
| 195 |
+
padding-bottom: 0px;
|
| 196 |
+
margin: 0;
|
| 197 |
+
}
|
| 198 |
+
|
| 199 |
+
/* custom general page styles */
|
| 200 |
+
.hero-unit h1, .hero-unit h2 {
|
| 201 |
+
color: #A30000;
|
| 202 |
+
}
|
| 203 |
+
|
| 204 |
+
body a {
|
| 205 |
+
color: #A30000;
|
| 206 |
+
}
|
| 207 |
+
|
| 208 |
+
body a:hover {
|
| 209 |
+
color: #c20000;
|
| 210 |
+
}
|
| 211 |
+
|
| 212 |
+
.request-info {
|
| 213 |
+
clear:both;
|
| 214 |
+
}
|
| 215 |
+
|
| 216 |
+
.horizontal-checkbox label {
|
| 217 |
+
padding-top: 0;
|
| 218 |
+
}
|
| 219 |
+
|
| 220 |
+
.horizontal-checkbox label {
|
| 221 |
+
padding-top: 0 !important;
|
| 222 |
+
}
|
| 223 |
+
|
| 224 |
+
.horizontal-checkbox input {
|
| 225 |
+
float: left;
|
| 226 |
+
width: 20px;
|
| 227 |
+
margin-top: 3px;
|
| 228 |
+
}
|
| 229 |
+
|
| 230 |
+
.modal-footer form {
|
| 231 |
+
margin-left: 5px;
|
| 232 |
+
margin-right: 5px;
|
| 233 |
+
}
|
| 234 |
+
|
| 235 |
+
.pagination {
|
| 236 |
+
margin: 5px 0 10px 0;
|
| 237 |
+
}
|
backend/staticfiles/rest_framework/css/bootstrap-tweaks.css.gz
ADDED
|
Binary file (1.27 kB). View file
|
|
|
backend/staticfiles/rest_framework/css/bootstrap-tweaks.ee4ee6acf9eb.css
ADDED
|
@@ -0,0 +1,237 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
/*
|
| 2 |
+
|
| 3 |
+
This CSS file contains some tweaks specific to the included Bootstrap theme.
|
| 4 |
+
It's separate from `style.css` so that it can be easily overridden by replacing
|
| 5 |
+
a single block in the template.
|
| 6 |
+
|
| 7 |
+
*/
|
| 8 |
+
|
| 9 |
+
.form-actions {
|
| 10 |
+
background: transparent;
|
| 11 |
+
border-top-color: transparent;
|
| 12 |
+
padding-top: 0;
|
| 13 |
+
text-align: right;
|
| 14 |
+
}
|
| 15 |
+
|
| 16 |
+
#generic-content-form textarea {
|
| 17 |
+
font-family:Consolas,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New, monospace;
|
| 18 |
+
font-size: 80%;
|
| 19 |
+
}
|
| 20 |
+
|
| 21 |
+
.navbar-inverse .brand a {
|
| 22 |
+
color: #999999;
|
| 23 |
+
}
|
| 24 |
+
.navbar-inverse .brand:hover a {
|
| 25 |
+
color: white;
|
| 26 |
+
text-decoration: none;
|
| 27 |
+
}
|
| 28 |
+
|
| 29 |
+
/* custom navigation styles */
|
| 30 |
+
.navbar {
|
| 31 |
+
width: 100%;
|
| 32 |
+
position: fixed;
|
| 33 |
+
left: 0;
|
| 34 |
+
top: 0;
|
| 35 |
+
}
|
| 36 |
+
|
| 37 |
+
.navbar {
|
| 38 |
+
background: #2C2C2C;
|
| 39 |
+
color: white;
|
| 40 |
+
border: none;
|
| 41 |
+
border-top: 5px solid #A30000;
|
| 42 |
+
border-radius: 0px;
|
| 43 |
+
}
|
| 44 |
+
|
| 45 |
+
.navbar .nav li, .navbar .nav li a, .navbar .brand:hover {
|
| 46 |
+
color: white;
|
| 47 |
+
}
|
| 48 |
+
|
| 49 |
+
.nav-list > .active > a, .nav-list > .active > a:hover {
|
| 50 |
+
background: #2C2C2C;
|
| 51 |
+
}
|
| 52 |
+
|
| 53 |
+
.navbar .dropdown-menu li a, .navbar .dropdown-menu li {
|
| 54 |
+
color: #A30000;
|
| 55 |
+
}
|
| 56 |
+
|
| 57 |
+
.navbar .dropdown-menu li a:hover {
|
| 58 |
+
background: #EEEEEE;
|
| 59 |
+
color: #C20000;
|
| 60 |
+
}
|
| 61 |
+
|
| 62 |
+
ul.breadcrumb {
|
| 63 |
+
margin: 70px 0 0 0;
|
| 64 |
+
}
|
| 65 |
+
|
| 66 |
+
.breadcrumb li.active a {
|
| 67 |
+
color: #777;
|
| 68 |
+
}
|
| 69 |
+
|
| 70 |
+
.pagination>.disabled>a,
|
| 71 |
+
.pagination>.disabled>a:hover,
|
| 72 |
+
.pagination>.disabled>a:focus {
|
| 73 |
+
cursor: not-allowed;
|
| 74 |
+
pointer-events: none;
|
| 75 |
+
}
|
| 76 |
+
|
| 77 |
+
.pager>.disabled>a,
|
| 78 |
+
.pager>.disabled>a:hover,
|
| 79 |
+
.pager>.disabled>a:focus {
|
| 80 |
+
pointer-events: none;
|
| 81 |
+
}
|
| 82 |
+
|
| 83 |
+
.pager .next {
|
| 84 |
+
margin-left: 10px;
|
| 85 |
+
}
|
| 86 |
+
|
| 87 |
+
/*=== dabapps bootstrap styles ====*/
|
| 88 |
+
|
| 89 |
+
html {
|
| 90 |
+
width:100%;
|
| 91 |
+
background: none;
|
| 92 |
+
}
|
| 93 |
+
|
| 94 |
+
/*body, .navbar .container-fluid {
|
| 95 |
+
max-width: 1150px;
|
| 96 |
+
margin: 0 auto;
|
| 97 |
+
}*/
|
| 98 |
+
|
| 99 |
+
body {
|
| 100 |
+
background: url("../img/grid.a4b938cf382b.png") repeat-x;
|
| 101 |
+
background-attachment: fixed;
|
| 102 |
+
}
|
| 103 |
+
|
| 104 |
+
#content {
|
| 105 |
+
margin: 0;
|
| 106 |
+
padding-bottom: 60px;
|
| 107 |
+
}
|
| 108 |
+
|
| 109 |
+
/* sticky footer and footer */
|
| 110 |
+
html, body {
|
| 111 |
+
height: 100%;
|
| 112 |
+
}
|
| 113 |
+
|
| 114 |
+
.wrapper {
|
| 115 |
+
position: relative;
|
| 116 |
+
top: 0;
|
| 117 |
+
left: 0;
|
| 118 |
+
padding-top: 60px;
|
| 119 |
+
margin: -60px 0;
|
| 120 |
+
min-height: 100%;
|
| 121 |
+
}
|
| 122 |
+
|
| 123 |
+
.form-switcher {
|
| 124 |
+
margin-bottom: 0;
|
| 125 |
+
}
|
| 126 |
+
|
| 127 |
+
.well {
|
| 128 |
+
-webkit-box-shadow: none;
|
| 129 |
+
-moz-box-shadow: none;
|
| 130 |
+
box-shadow: none;
|
| 131 |
+
}
|
| 132 |
+
|
| 133 |
+
.well .form-actions {
|
| 134 |
+
padding-bottom: 0;
|
| 135 |
+
margin-bottom: 0;
|
| 136 |
+
}
|
| 137 |
+
|
| 138 |
+
.well form {
|
| 139 |
+
margin-bottom: 0;
|
| 140 |
+
}
|
| 141 |
+
|
| 142 |
+
.nav-tabs {
|
| 143 |
+
border: 0;
|
| 144 |
+
}
|
| 145 |
+
|
| 146 |
+
.nav-tabs > li {
|
| 147 |
+
float: right;
|
| 148 |
+
}
|
| 149 |
+
|
| 150 |
+
.nav-tabs li a {
|
| 151 |
+
margin-right: 0;
|
| 152 |
+
}
|
| 153 |
+
|
| 154 |
+
.nav-tabs > .active > a {
|
| 155 |
+
background: #F5F5F5;
|
| 156 |
+
}
|
| 157 |
+
|
| 158 |
+
.nav-tabs > .active > a:hover {
|
| 159 |
+
background: #F5F5F5;
|
| 160 |
+
}
|
| 161 |
+
|
| 162 |
+
.tabbable.first-tab-active .tab-content {
|
| 163 |
+
border-top-right-radius: 0;
|
| 164 |
+
}
|
| 165 |
+
|
| 166 |
+
footer {
|
| 167 |
+
position: absolute;
|
| 168 |
+
bottom: 0;
|
| 169 |
+
left: 0;
|
| 170 |
+
clear: both;
|
| 171 |
+
z-index: 10;
|
| 172 |
+
height: 60px;
|
| 173 |
+
width: 95%;
|
| 174 |
+
margin: 0 2.5%;
|
| 175 |
+
}
|
| 176 |
+
|
| 177 |
+
footer p {
|
| 178 |
+
text-align: center;
|
| 179 |
+
color: gray;
|
| 180 |
+
border-top: 1px solid #DDDDDD;
|
| 181 |
+
padding-top: 10px;
|
| 182 |
+
}
|
| 183 |
+
|
| 184 |
+
footer a {
|
| 185 |
+
color: gray !important;
|
| 186 |
+
font-weight: bold;
|
| 187 |
+
}
|
| 188 |
+
|
| 189 |
+
footer a:hover {
|
| 190 |
+
color: gray;
|
| 191 |
+
}
|
| 192 |
+
|
| 193 |
+
.page-header {
|
| 194 |
+
border-bottom: none;
|
| 195 |
+
padding-bottom: 0px;
|
| 196 |
+
margin: 0;
|
| 197 |
+
}
|
| 198 |
+
|
| 199 |
+
/* custom general page styles */
|
| 200 |
+
.hero-unit h1, .hero-unit h2 {
|
| 201 |
+
color: #A30000;
|
| 202 |
+
}
|
| 203 |
+
|
| 204 |
+
body a {
|
| 205 |
+
color: #A30000;
|
| 206 |
+
}
|
| 207 |
+
|
| 208 |
+
body a:hover {
|
| 209 |
+
color: #c20000;
|
| 210 |
+
}
|
| 211 |
+
|
| 212 |
+
.request-info {
|
| 213 |
+
clear:both;
|
| 214 |
+
}
|
| 215 |
+
|
| 216 |
+
.horizontal-checkbox label {
|
| 217 |
+
padding-top: 0;
|
| 218 |
+
}
|
| 219 |
+
|
| 220 |
+
.horizontal-checkbox label {
|
| 221 |
+
padding-top: 0 !important;
|
| 222 |
+
}
|
| 223 |
+
|
| 224 |
+
.horizontal-checkbox input {
|
| 225 |
+
float: left;
|
| 226 |
+
width: 20px;
|
| 227 |
+
margin-top: 3px;
|
| 228 |
+
}
|
| 229 |
+
|
| 230 |
+
.modal-footer form {
|
| 231 |
+
margin-left: 5px;
|
| 232 |
+
margin-right: 5px;
|
| 233 |
+
}
|
| 234 |
+
|
| 235 |
+
.pagination {
|
| 236 |
+
margin: 5px 0 10px 0;
|
| 237 |
+
}
|
backend/staticfiles/rest_framework/css/bootstrap-tweaks.ee4ee6acf9eb.css.gz
ADDED
|
Binary file (1.28 kB). View file
|
|
|
backend/staticfiles/rest_framework/css/bootstrap.min.css
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
backend/staticfiles/rest_framework/css/bootstrap.min.css.cafbda9c0e9e.map
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
backend/staticfiles/rest_framework/css/bootstrap.min.css.cafbda9c0e9e.map.gz
ADDED
|
Binary file (94.4 kB). View file
|
|
|
backend/staticfiles/rest_framework/css/bootstrap.min.css.gz
ADDED
|
Binary file (19.6 kB). View file
|
|
|
backend/staticfiles/rest_framework/css/bootstrap.min.css.map
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
backend/staticfiles/rest_framework/css/bootstrap.min.css.map.gz
ADDED
|
Binary file (94.4 kB). View file
|
|
|
backend/staticfiles/rest_framework/css/bootstrap.min.f17d4516b026.css
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
backend/staticfiles/rest_framework/css/bootstrap.min.f17d4516b026.css.gz
ADDED
|
Binary file (19.7 kB). View file
|
|
|
backend/staticfiles/rest_framework/css/default.789dfb5732d7.css
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
/* The navbar is fixed at >= 980px wide, so add padding to the body to prevent
|
| 2 |
+
content running up underneath it. */
|
| 3 |
+
|
| 4 |
+
h1 {
|
| 5 |
+
font-weight: 300;
|
| 6 |
+
}
|
| 7 |
+
|
| 8 |
+
h2, h3 {
|
| 9 |
+
font-weight: 300;
|
| 10 |
+
}
|
| 11 |
+
|
| 12 |
+
.resource-description, .response-info {
|
| 13 |
+
margin-bottom: 2em;
|
| 14 |
+
}
|
| 15 |
+
|
| 16 |
+
.version:before {
|
| 17 |
+
content: "v";
|
| 18 |
+
opacity: 0.6;
|
| 19 |
+
padding-right: 0.25em;
|
| 20 |
+
}
|
| 21 |
+
|
| 22 |
+
.version {
|
| 23 |
+
font-size: 70%;
|
| 24 |
+
}
|
| 25 |
+
|
| 26 |
+
.format-option {
|
| 27 |
+
font-family: Menlo, Consolas, "Andale Mono", "Lucida Console", monospace;
|
| 28 |
+
}
|
| 29 |
+
|
| 30 |
+
.button-form {
|
| 31 |
+
float: right;
|
| 32 |
+
margin-right: 1em;
|
| 33 |
+
}
|
| 34 |
+
|
| 35 |
+
td.nested {
|
| 36 |
+
padding: 0 !important;
|
| 37 |
+
}
|
| 38 |
+
|
| 39 |
+
td.nested > table {
|
| 40 |
+
margin: 0;
|
| 41 |
+
}
|
| 42 |
+
|
| 43 |
+
form select, form input:not([type=checkbox]), form textarea {
|
| 44 |
+
width: 90%;
|
| 45 |
+
}
|
| 46 |
+
|
| 47 |
+
form select[multiple] {
|
| 48 |
+
height: 150px;
|
| 49 |
+
}
|
| 50 |
+
|
| 51 |
+
/* To allow tooltips to work on disabled elements */
|
| 52 |
+
.disabled-tooltip-shield {
|
| 53 |
+
position: absolute;
|
| 54 |
+
top: 0;
|
| 55 |
+
right: 0;
|
| 56 |
+
bottom: 0;
|
| 57 |
+
left: 0;
|
| 58 |
+
}
|
| 59 |
+
|
| 60 |
+
.errorlist {
|
| 61 |
+
margin-top: 0.5em;
|
| 62 |
+
}
|
| 63 |
+
|
| 64 |
+
pre {
|
| 65 |
+
overflow: auto;
|
| 66 |
+
word-wrap: normal;
|
| 67 |
+
white-space: pre;
|
| 68 |
+
font-size: 12px;
|
| 69 |
+
}
|
| 70 |
+
|
| 71 |
+
.page-header {
|
| 72 |
+
border-bottom: none;
|
| 73 |
+
padding-bottom: 0px;
|
| 74 |
+
}
|
| 75 |
+
|
| 76 |
+
#filtersModal form input[type=submit] {
|
| 77 |
+
width: auto;
|
| 78 |
+
}
|
| 79 |
+
|
| 80 |
+
#filtersModal .modal-body h2 {
|
| 81 |
+
margin-top: 0
|
| 82 |
+
}
|
backend/staticfiles/rest_framework/css/default.789dfb5732d7.css.gz
ADDED
|
Binary file (612 Bytes). View file
|
|
|
backend/staticfiles/rest_framework/css/default.css
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
/* The navbar is fixed at >= 980px wide, so add padding to the body to prevent
|
| 2 |
+
content running up underneath it. */
|
| 3 |
+
|
| 4 |
+
h1 {
|
| 5 |
+
font-weight: 300;
|
| 6 |
+
}
|
| 7 |
+
|
| 8 |
+
h2, h3 {
|
| 9 |
+
font-weight: 300;
|
| 10 |
+
}
|
| 11 |
+
|
| 12 |
+
.resource-description, .response-info {
|
| 13 |
+
margin-bottom: 2em;
|
| 14 |
+
}
|
| 15 |
+
|
| 16 |
+
.version:before {
|
| 17 |
+
content: "v";
|
| 18 |
+
opacity: 0.6;
|
| 19 |
+
padding-right: 0.25em;
|
| 20 |
+
}
|
| 21 |
+
|
| 22 |
+
.version {
|
| 23 |
+
font-size: 70%;
|
| 24 |
+
}
|
| 25 |
+
|
| 26 |
+
.format-option {
|
| 27 |
+
font-family: Menlo, Consolas, "Andale Mono", "Lucida Console", monospace;
|
| 28 |
+
}
|
| 29 |
+
|
| 30 |
+
.button-form {
|
| 31 |
+
float: right;
|
| 32 |
+
margin-right: 1em;
|
| 33 |
+
}
|
| 34 |
+
|
| 35 |
+
td.nested {
|
| 36 |
+
padding: 0 !important;
|
| 37 |
+
}
|
| 38 |
+
|
| 39 |
+
td.nested > table {
|
| 40 |
+
margin: 0;
|
| 41 |
+
}
|
| 42 |
+
|
| 43 |
+
form select, form input:not([type=checkbox]), form textarea {
|
| 44 |
+
width: 90%;
|
| 45 |
+
}
|
| 46 |
+
|
| 47 |
+
form select[multiple] {
|
| 48 |
+
height: 150px;
|
| 49 |
+
}
|
| 50 |
+
|
| 51 |
+
/* To allow tooltips to work on disabled elements */
|
| 52 |
+
.disabled-tooltip-shield {
|
| 53 |
+
position: absolute;
|
| 54 |
+
top: 0;
|
| 55 |
+
right: 0;
|
| 56 |
+
bottom: 0;
|
| 57 |
+
left: 0;
|
| 58 |
+
}
|
| 59 |
+
|
| 60 |
+
.errorlist {
|
| 61 |
+
margin-top: 0.5em;
|
| 62 |
+
}
|
| 63 |
+
|
| 64 |
+
pre {
|
| 65 |
+
overflow: auto;
|
| 66 |
+
word-wrap: normal;
|
| 67 |
+
white-space: pre;
|
| 68 |
+
font-size: 12px;
|
| 69 |
+
}
|
| 70 |
+
|
| 71 |
+
.page-header {
|
| 72 |
+
border-bottom: none;
|
| 73 |
+
padding-bottom: 0px;
|
| 74 |
+
}
|
| 75 |
+
|
| 76 |
+
#filtersModal form input[type=submit] {
|
| 77 |
+
width: auto;
|
| 78 |
+
}
|
| 79 |
+
|
| 80 |
+
#filtersModal .modal-body h2 {
|
| 81 |
+
margin-top: 0
|
| 82 |
+
}
|
backend/staticfiles/rest_framework/css/default.css.gz
ADDED
|
Binary file (612 Bytes). View file
|
|
|
backend/staticfiles/rest_framework/css/font-awesome-4.0.3.c1e1ea213abf.css
ADDED
|
@@ -0,0 +1,1338 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
/*!
|
| 2 |
+
* Font Awesome 4.0.3 by @davegandy - http://fontawesome.io - @fontawesome
|
| 3 |
+
* License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
|
| 4 |
+
*/
|
| 5 |
+
/* FONT PATH
|
| 6 |
+
* -------------------------- */
|
| 7 |
+
@font-face {
|
| 8 |
+
font-family: 'FontAwesome';
|
| 9 |
+
src: url("../fonts/fontawesome-webfont.8b27bc96115c.eot?v=4.0.3");
|
| 10 |
+
src: url("../fonts/fontawesome-webfont.8b27bc96115c.eot?#iefix&v=4.0.3") format('embedded-opentype'), url("../fonts/fontawesome-webfont.3293616ec0c6.woff?v=4.0.3") format('woff'), url("../fonts/fontawesome-webfont.dcb26c7239d8.ttf?v=4.0.3") format('truetype'), url("../fonts/fontawesome-webfont.83e37a11f9d7.svg?v=4.0.3#fontawesomeregular") format('svg');
|
| 11 |
+
font-weight: normal;
|
| 12 |
+
font-style: normal;
|
| 13 |
+
}
|
| 14 |
+
.fa {
|
| 15 |
+
display: inline-block;
|
| 16 |
+
font-family: FontAwesome;
|
| 17 |
+
font-style: normal;
|
| 18 |
+
font-weight: normal;
|
| 19 |
+
line-height: 1;
|
| 20 |
+
-webkit-font-smoothing: antialiased;
|
| 21 |
+
-moz-osx-font-smoothing: grayscale;
|
| 22 |
+
}
|
| 23 |
+
/* makes the font 33% larger relative to the icon container */
|
| 24 |
+
.fa-lg {
|
| 25 |
+
font-size: 1.3333333333333333em;
|
| 26 |
+
line-height: 0.75em;
|
| 27 |
+
vertical-align: -15%;
|
| 28 |
+
}
|
| 29 |
+
.fa-2x {
|
| 30 |
+
font-size: 2em;
|
| 31 |
+
}
|
| 32 |
+
.fa-3x {
|
| 33 |
+
font-size: 3em;
|
| 34 |
+
}
|
| 35 |
+
.fa-4x {
|
| 36 |
+
font-size: 4em;
|
| 37 |
+
}
|
| 38 |
+
.fa-5x {
|
| 39 |
+
font-size: 5em;
|
| 40 |
+
}
|
| 41 |
+
.fa-fw {
|
| 42 |
+
width: 1.2857142857142858em;
|
| 43 |
+
text-align: center;
|
| 44 |
+
}
|
| 45 |
+
.fa-ul {
|
| 46 |
+
padding-left: 0;
|
| 47 |
+
margin-left: 2.142857142857143em;
|
| 48 |
+
list-style-type: none;
|
| 49 |
+
}
|
| 50 |
+
.fa-ul > li {
|
| 51 |
+
position: relative;
|
| 52 |
+
}
|
| 53 |
+
.fa-li {
|
| 54 |
+
position: absolute;
|
| 55 |
+
left: -2.142857142857143em;
|
| 56 |
+
width: 2.142857142857143em;
|
| 57 |
+
top: 0.14285714285714285em;
|
| 58 |
+
text-align: center;
|
| 59 |
+
}
|
| 60 |
+
.fa-li.fa-lg {
|
| 61 |
+
left: -1.8571428571428572em;
|
| 62 |
+
}
|
| 63 |
+
.fa-border {
|
| 64 |
+
padding: .2em .25em .15em;
|
| 65 |
+
border: solid 0.08em #eeeeee;
|
| 66 |
+
border-radius: .1em;
|
| 67 |
+
}
|
| 68 |
+
.pull-right {
|
| 69 |
+
float: right;
|
| 70 |
+
}
|
| 71 |
+
.pull-left {
|
| 72 |
+
float: left;
|
| 73 |
+
}
|
| 74 |
+
.fa.pull-left {
|
| 75 |
+
margin-right: .3em;
|
| 76 |
+
}
|
| 77 |
+
.fa.pull-right {
|
| 78 |
+
margin-left: .3em;
|
| 79 |
+
}
|
| 80 |
+
.fa-spin {
|
| 81 |
+
-webkit-animation: spin 2s infinite linear;
|
| 82 |
+
-moz-animation: spin 2s infinite linear;
|
| 83 |
+
-o-animation: spin 2s infinite linear;
|
| 84 |
+
animation: spin 2s infinite linear;
|
| 85 |
+
}
|
| 86 |
+
@-moz-keyframes spin {
|
| 87 |
+
0% {
|
| 88 |
+
-moz-transform: rotate(0deg);
|
| 89 |
+
}
|
| 90 |
+
100% {
|
| 91 |
+
-moz-transform: rotate(359deg);
|
| 92 |
+
}
|
| 93 |
+
}
|
| 94 |
+
@-webkit-keyframes spin {
|
| 95 |
+
0% {
|
| 96 |
+
-webkit-transform: rotate(0deg);
|
| 97 |
+
}
|
| 98 |
+
100% {
|
| 99 |
+
-webkit-transform: rotate(359deg);
|
| 100 |
+
}
|
| 101 |
+
}
|
| 102 |
+
@-o-keyframes spin {
|
| 103 |
+
0% {
|
| 104 |
+
-o-transform: rotate(0deg);
|
| 105 |
+
}
|
| 106 |
+
100% {
|
| 107 |
+
-o-transform: rotate(359deg);
|
| 108 |
+
}
|
| 109 |
+
}
|
| 110 |
+
@-ms-keyframes spin {
|
| 111 |
+
0% {
|
| 112 |
+
-ms-transform: rotate(0deg);
|
| 113 |
+
}
|
| 114 |
+
100% {
|
| 115 |
+
-ms-transform: rotate(359deg);
|
| 116 |
+
}
|
| 117 |
+
}
|
| 118 |
+
@keyframes spin {
|
| 119 |
+
0% {
|
| 120 |
+
transform: rotate(0deg);
|
| 121 |
+
}
|
| 122 |
+
100% {
|
| 123 |
+
transform: rotate(359deg);
|
| 124 |
+
}
|
| 125 |
+
}
|
| 126 |
+
.fa-rotate-90 {
|
| 127 |
+
filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1);
|
| 128 |
+
-webkit-transform: rotate(90deg);
|
| 129 |
+
-moz-transform: rotate(90deg);
|
| 130 |
+
-ms-transform: rotate(90deg);
|
| 131 |
+
-o-transform: rotate(90deg);
|
| 132 |
+
transform: rotate(90deg);
|
| 133 |
+
}
|
| 134 |
+
.fa-rotate-180 {
|
| 135 |
+
filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);
|
| 136 |
+
-webkit-transform: rotate(180deg);
|
| 137 |
+
-moz-transform: rotate(180deg);
|
| 138 |
+
-ms-transform: rotate(180deg);
|
| 139 |
+
-o-transform: rotate(180deg);
|
| 140 |
+
transform: rotate(180deg);
|
| 141 |
+
}
|
| 142 |
+
.fa-rotate-270 {
|
| 143 |
+
filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);
|
| 144 |
+
-webkit-transform: rotate(270deg);
|
| 145 |
+
-moz-transform: rotate(270deg);
|
| 146 |
+
-ms-transform: rotate(270deg);
|
| 147 |
+
-o-transform: rotate(270deg);
|
| 148 |
+
transform: rotate(270deg);
|
| 149 |
+
}
|
| 150 |
+
.fa-flip-horizontal {
|
| 151 |
+
filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);
|
| 152 |
+
-webkit-transform: scale(-1, 1);
|
| 153 |
+
-moz-transform: scale(-1, 1);
|
| 154 |
+
-ms-transform: scale(-1, 1);
|
| 155 |
+
-o-transform: scale(-1, 1);
|
| 156 |
+
transform: scale(-1, 1);
|
| 157 |
+
}
|
| 158 |
+
.fa-flip-vertical {
|
| 159 |
+
filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);
|
| 160 |
+
-webkit-transform: scale(1, -1);
|
| 161 |
+
-moz-transform: scale(1, -1);
|
| 162 |
+
-ms-transform: scale(1, -1);
|
| 163 |
+
-o-transform: scale(1, -1);
|
| 164 |
+
transform: scale(1, -1);
|
| 165 |
+
}
|
| 166 |
+
.fa-stack {
|
| 167 |
+
position: relative;
|
| 168 |
+
display: inline-block;
|
| 169 |
+
width: 2em;
|
| 170 |
+
height: 2em;
|
| 171 |
+
line-height: 2em;
|
| 172 |
+
vertical-align: middle;
|
| 173 |
+
}
|
| 174 |
+
.fa-stack-1x,
|
| 175 |
+
.fa-stack-2x {
|
| 176 |
+
position: absolute;
|
| 177 |
+
left: 0;
|
| 178 |
+
width: 100%;
|
| 179 |
+
text-align: center;
|
| 180 |
+
}
|
| 181 |
+
.fa-stack-1x {
|
| 182 |
+
line-height: inherit;
|
| 183 |
+
}
|
| 184 |
+
.fa-stack-2x {
|
| 185 |
+
font-size: 2em;
|
| 186 |
+
}
|
| 187 |
+
.fa-inverse {
|
| 188 |
+
color: #ffffff;
|
| 189 |
+
}
|
| 190 |
+
/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
|
| 191 |
+
readers do not read off random characters that represent icons */
|
| 192 |
+
.fa-glass:before {
|
| 193 |
+
content: "\f000";
|
| 194 |
+
}
|
| 195 |
+
.fa-music:before {
|
| 196 |
+
content: "\f001";
|
| 197 |
+
}
|
| 198 |
+
.fa-search:before {
|
| 199 |
+
content: "\f002";
|
| 200 |
+
}
|
| 201 |
+
.fa-envelope-o:before {
|
| 202 |
+
content: "\f003";
|
| 203 |
+
}
|
| 204 |
+
.fa-heart:before {
|
| 205 |
+
content: "\f004";
|
| 206 |
+
}
|
| 207 |
+
.fa-star:before {
|
| 208 |
+
content: "\f005";
|
| 209 |
+
}
|
| 210 |
+
.fa-star-o:before {
|
| 211 |
+
content: "\f006";
|
| 212 |
+
}
|
| 213 |
+
.fa-user:before {
|
| 214 |
+
content: "\f007";
|
| 215 |
+
}
|
| 216 |
+
.fa-film:before {
|
| 217 |
+
content: "\f008";
|
| 218 |
+
}
|
| 219 |
+
.fa-th-large:before {
|
| 220 |
+
content: "\f009";
|
| 221 |
+
}
|
| 222 |
+
.fa-th:before {
|
| 223 |
+
content: "\f00a";
|
| 224 |
+
}
|
| 225 |
+
.fa-th-list:before {
|
| 226 |
+
content: "\f00b";
|
| 227 |
+
}
|
| 228 |
+
.fa-check:before {
|
| 229 |
+
content: "\f00c";
|
| 230 |
+
}
|
| 231 |
+
.fa-times:before {
|
| 232 |
+
content: "\f00d";
|
| 233 |
+
}
|
| 234 |
+
.fa-search-plus:before {
|
| 235 |
+
content: "\f00e";
|
| 236 |
+
}
|
| 237 |
+
.fa-search-minus:before {
|
| 238 |
+
content: "\f010";
|
| 239 |
+
}
|
| 240 |
+
.fa-power-off:before {
|
| 241 |
+
content: "\f011";
|
| 242 |
+
}
|
| 243 |
+
.fa-signal:before {
|
| 244 |
+
content: "\f012";
|
| 245 |
+
}
|
| 246 |
+
.fa-gear:before,
|
| 247 |
+
.fa-cog:before {
|
| 248 |
+
content: "\f013";
|
| 249 |
+
}
|
| 250 |
+
.fa-trash-o:before {
|
| 251 |
+
content: "\f014";
|
| 252 |
+
}
|
| 253 |
+
.fa-home:before {
|
| 254 |
+
content: "\f015";
|
| 255 |
+
}
|
| 256 |
+
.fa-file-o:before {
|
| 257 |
+
content: "\f016";
|
| 258 |
+
}
|
| 259 |
+
.fa-clock-o:before {
|
| 260 |
+
content: "\f017";
|
| 261 |
+
}
|
| 262 |
+
.fa-road:before {
|
| 263 |
+
content: "\f018";
|
| 264 |
+
}
|
| 265 |
+
.fa-download:before {
|
| 266 |
+
content: "\f019";
|
| 267 |
+
}
|
| 268 |
+
.fa-arrow-circle-o-down:before {
|
| 269 |
+
content: "\f01a";
|
| 270 |
+
}
|
| 271 |
+
.fa-arrow-circle-o-up:before {
|
| 272 |
+
content: "\f01b";
|
| 273 |
+
}
|
| 274 |
+
.fa-inbox:before {
|
| 275 |
+
content: "\f01c";
|
| 276 |
+
}
|
| 277 |
+
.fa-play-circle-o:before {
|
| 278 |
+
content: "\f01d";
|
| 279 |
+
}
|
| 280 |
+
.fa-rotate-right:before,
|
| 281 |
+
.fa-repeat:before {
|
| 282 |
+
content: "\f01e";
|
| 283 |
+
}
|
| 284 |
+
.fa-refresh:before {
|
| 285 |
+
content: "\f021";
|
| 286 |
+
}
|
| 287 |
+
.fa-list-alt:before {
|
| 288 |
+
content: "\f022";
|
| 289 |
+
}
|
| 290 |
+
.fa-lock:before {
|
| 291 |
+
content: "\f023";
|
| 292 |
+
}
|
| 293 |
+
.fa-flag:before {
|
| 294 |
+
content: "\f024";
|
| 295 |
+
}
|
| 296 |
+
.fa-headphones:before {
|
| 297 |
+
content: "\f025";
|
| 298 |
+
}
|
| 299 |
+
.fa-volume-off:before {
|
| 300 |
+
content: "\f026";
|
| 301 |
+
}
|
| 302 |
+
.fa-volume-down:before {
|
| 303 |
+
content: "\f027";
|
| 304 |
+
}
|
| 305 |
+
.fa-volume-up:before {
|
| 306 |
+
content: "\f028";
|
| 307 |
+
}
|
| 308 |
+
.fa-qrcode:before {
|
| 309 |
+
content: "\f029";
|
| 310 |
+
}
|
| 311 |
+
.fa-barcode:before {
|
| 312 |
+
content: "\f02a";
|
| 313 |
+
}
|
| 314 |
+
.fa-tag:before {
|
| 315 |
+
content: "\f02b";
|
| 316 |
+
}
|
| 317 |
+
.fa-tags:before {
|
| 318 |
+
content: "\f02c";
|
| 319 |
+
}
|
| 320 |
+
.fa-book:before {
|
| 321 |
+
content: "\f02d";
|
| 322 |
+
}
|
| 323 |
+
.fa-bookmark:before {
|
| 324 |
+
content: "\f02e";
|
| 325 |
+
}
|
| 326 |
+
.fa-print:before {
|
| 327 |
+
content: "\f02f";
|
| 328 |
+
}
|
| 329 |
+
.fa-camera:before {
|
| 330 |
+
content: "\f030";
|
| 331 |
+
}
|
| 332 |
+
.fa-font:before {
|
| 333 |
+
content: "\f031";
|
| 334 |
+
}
|
| 335 |
+
.fa-bold:before {
|
| 336 |
+
content: "\f032";
|
| 337 |
+
}
|
| 338 |
+
.fa-italic:before {
|
| 339 |
+
content: "\f033";
|
| 340 |
+
}
|
| 341 |
+
.fa-text-height:before {
|
| 342 |
+
content: "\f034";
|
| 343 |
+
}
|
| 344 |
+
.fa-text-width:before {
|
| 345 |
+
content: "\f035";
|
| 346 |
+
}
|
| 347 |
+
.fa-align-left:before {
|
| 348 |
+
content: "\f036";
|
| 349 |
+
}
|
| 350 |
+
.fa-align-center:before {
|
| 351 |
+
content: "\f037";
|
| 352 |
+
}
|
| 353 |
+
.fa-align-right:before {
|
| 354 |
+
content: "\f038";
|
| 355 |
+
}
|
| 356 |
+
.fa-align-justify:before {
|
| 357 |
+
content: "\f039";
|
| 358 |
+
}
|
| 359 |
+
.fa-list:before {
|
| 360 |
+
content: "\f03a";
|
| 361 |
+
}
|
| 362 |
+
.fa-dedent:before,
|
| 363 |
+
.fa-outdent:before {
|
| 364 |
+
content: "\f03b";
|
| 365 |
+
}
|
| 366 |
+
.fa-indent:before {
|
| 367 |
+
content: "\f03c";
|
| 368 |
+
}
|
| 369 |
+
.fa-video-camera:before {
|
| 370 |
+
content: "\f03d";
|
| 371 |
+
}
|
| 372 |
+
.fa-picture-o:before {
|
| 373 |
+
content: "\f03e";
|
| 374 |
+
}
|
| 375 |
+
.fa-pencil:before {
|
| 376 |
+
content: "\f040";
|
| 377 |
+
}
|
| 378 |
+
.fa-map-marker:before {
|
| 379 |
+
content: "\f041";
|
| 380 |
+
}
|
| 381 |
+
.fa-adjust:before {
|
| 382 |
+
content: "\f042";
|
| 383 |
+
}
|
| 384 |
+
.fa-tint:before {
|
| 385 |
+
content: "\f043";
|
| 386 |
+
}
|
| 387 |
+
.fa-edit:before,
|
| 388 |
+
.fa-pencil-square-o:before {
|
| 389 |
+
content: "\f044";
|
| 390 |
+
}
|
| 391 |
+
.fa-share-square-o:before {
|
| 392 |
+
content: "\f045";
|
| 393 |
+
}
|
| 394 |
+
.fa-check-square-o:before {
|
| 395 |
+
content: "\f046";
|
| 396 |
+
}
|
| 397 |
+
.fa-arrows:before {
|
| 398 |
+
content: "\f047";
|
| 399 |
+
}
|
| 400 |
+
.fa-step-backward:before {
|
| 401 |
+
content: "\f048";
|
| 402 |
+
}
|
| 403 |
+
.fa-fast-backward:before {
|
| 404 |
+
content: "\f049";
|
| 405 |
+
}
|
| 406 |
+
.fa-backward:before {
|
| 407 |
+
content: "\f04a";
|
| 408 |
+
}
|
| 409 |
+
.fa-play:before {
|
| 410 |
+
content: "\f04b";
|
| 411 |
+
}
|
| 412 |
+
.fa-pause:before {
|
| 413 |
+
content: "\f04c";
|
| 414 |
+
}
|
| 415 |
+
.fa-stop:before {
|
| 416 |
+
content: "\f04d";
|
| 417 |
+
}
|
| 418 |
+
.fa-forward:before {
|
| 419 |
+
content: "\f04e";
|
| 420 |
+
}
|
| 421 |
+
.fa-fast-forward:before {
|
| 422 |
+
content: "\f050";
|
| 423 |
+
}
|
| 424 |
+
.fa-step-forward:before {
|
| 425 |
+
content: "\f051";
|
| 426 |
+
}
|
| 427 |
+
.fa-eject:before {
|
| 428 |
+
content: "\f052";
|
| 429 |
+
}
|
| 430 |
+
.fa-chevron-left:before {
|
| 431 |
+
content: "\f053";
|
| 432 |
+
}
|
| 433 |
+
.fa-chevron-right:before {
|
| 434 |
+
content: "\f054";
|
| 435 |
+
}
|
| 436 |
+
.fa-plus-circle:before {
|
| 437 |
+
content: "\f055";
|
| 438 |
+
}
|
| 439 |
+
.fa-minus-circle:before {
|
| 440 |
+
content: "\f056";
|
| 441 |
+
}
|
| 442 |
+
.fa-times-circle:before {
|
| 443 |
+
content: "\f057";
|
| 444 |
+
}
|
| 445 |
+
.fa-check-circle:before {
|
| 446 |
+
content: "\f058";
|
| 447 |
+
}
|
| 448 |
+
.fa-question-circle:before {
|
| 449 |
+
content: "\f059";
|
| 450 |
+
}
|
| 451 |
+
.fa-info-circle:before {
|
| 452 |
+
content: "\f05a";
|
| 453 |
+
}
|
| 454 |
+
.fa-crosshairs:before {
|
| 455 |
+
content: "\f05b";
|
| 456 |
+
}
|
| 457 |
+
.fa-times-circle-o:before {
|
| 458 |
+
content: "\f05c";
|
| 459 |
+
}
|
| 460 |
+
.fa-check-circle-o:before {
|
| 461 |
+
content: "\f05d";
|
| 462 |
+
}
|
| 463 |
+
.fa-ban:before {
|
| 464 |
+
content: "\f05e";
|
| 465 |
+
}
|
| 466 |
+
.fa-arrow-left:before {
|
| 467 |
+
content: "\f060";
|
| 468 |
+
}
|
| 469 |
+
.fa-arrow-right:before {
|
| 470 |
+
content: "\f061";
|
| 471 |
+
}
|
| 472 |
+
.fa-arrow-up:before {
|
| 473 |
+
content: "\f062";
|
| 474 |
+
}
|
| 475 |
+
.fa-arrow-down:before {
|
| 476 |
+
content: "\f063";
|
| 477 |
+
}
|
| 478 |
+
.fa-mail-forward:before,
|
| 479 |
+
.fa-share:before {
|
| 480 |
+
content: "\f064";
|
| 481 |
+
}
|
| 482 |
+
.fa-expand:before {
|
| 483 |
+
content: "\f065";
|
| 484 |
+
}
|
| 485 |
+
.fa-compress:before {
|
| 486 |
+
content: "\f066";
|
| 487 |
+
}
|
| 488 |
+
.fa-plus:before {
|
| 489 |
+
content: "\f067";
|
| 490 |
+
}
|
| 491 |
+
.fa-minus:before {
|
| 492 |
+
content: "\f068";
|
| 493 |
+
}
|
| 494 |
+
.fa-asterisk:before {
|
| 495 |
+
content: "\f069";
|
| 496 |
+
}
|
| 497 |
+
.fa-exclamation-circle:before {
|
| 498 |
+
content: "\f06a";
|
| 499 |
+
}
|
| 500 |
+
.fa-gift:before {
|
| 501 |
+
content: "\f06b";
|
| 502 |
+
}
|
| 503 |
+
.fa-leaf:before {
|
| 504 |
+
content: "\f06c";
|
| 505 |
+
}
|
| 506 |
+
.fa-fire:before {
|
| 507 |
+
content: "\f06d";
|
| 508 |
+
}
|
| 509 |
+
.fa-eye:before {
|
| 510 |
+
content: "\f06e";
|
| 511 |
+
}
|
| 512 |
+
.fa-eye-slash:before {
|
| 513 |
+
content: "\f070";
|
| 514 |
+
}
|
| 515 |
+
.fa-warning:before,
|
| 516 |
+
.fa-exclamation-triangle:before {
|
| 517 |
+
content: "\f071";
|
| 518 |
+
}
|
| 519 |
+
.fa-plane:before {
|
| 520 |
+
content: "\f072";
|
| 521 |
+
}
|
| 522 |
+
.fa-calendar:before {
|
| 523 |
+
content: "\f073";
|
| 524 |
+
}
|
| 525 |
+
.fa-random:before {
|
| 526 |
+
content: "\f074";
|
| 527 |
+
}
|
| 528 |
+
.fa-comment:before {
|
| 529 |
+
content: "\f075";
|
| 530 |
+
}
|
| 531 |
+
.fa-magnet:before {
|
| 532 |
+
content: "\f076";
|
| 533 |
+
}
|
| 534 |
+
.fa-chevron-up:before {
|
| 535 |
+
content: "\f077";
|
| 536 |
+
}
|
| 537 |
+
.fa-chevron-down:before {
|
| 538 |
+
content: "\f078";
|
| 539 |
+
}
|
| 540 |
+
.fa-retweet:before {
|
| 541 |
+
content: "\f079";
|
| 542 |
+
}
|
| 543 |
+
.fa-shopping-cart:before {
|
| 544 |
+
content: "\f07a";
|
| 545 |
+
}
|
| 546 |
+
.fa-folder:before {
|
| 547 |
+
content: "\f07b";
|
| 548 |
+
}
|
| 549 |
+
.fa-folder-open:before {
|
| 550 |
+
content: "\f07c";
|
| 551 |
+
}
|
| 552 |
+
.fa-arrows-v:before {
|
| 553 |
+
content: "\f07d";
|
| 554 |
+
}
|
| 555 |
+
.fa-arrows-h:before {
|
| 556 |
+
content: "\f07e";
|
| 557 |
+
}
|
| 558 |
+
.fa-bar-chart-o:before {
|
| 559 |
+
content: "\f080";
|
| 560 |
+
}
|
| 561 |
+
.fa-twitter-square:before {
|
| 562 |
+
content: "\f081";
|
| 563 |
+
}
|
| 564 |
+
.fa-facebook-square:before {
|
| 565 |
+
content: "\f082";
|
| 566 |
+
}
|
| 567 |
+
.fa-camera-retro:before {
|
| 568 |
+
content: "\f083";
|
| 569 |
+
}
|
| 570 |
+
.fa-key:before {
|
| 571 |
+
content: "\f084";
|
| 572 |
+
}
|
| 573 |
+
.fa-gears:before,
|
| 574 |
+
.fa-cogs:before {
|
| 575 |
+
content: "\f085";
|
| 576 |
+
}
|
| 577 |
+
.fa-comments:before {
|
| 578 |
+
content: "\f086";
|
| 579 |
+
}
|
| 580 |
+
.fa-thumbs-o-up:before {
|
| 581 |
+
content: "\f087";
|
| 582 |
+
}
|
| 583 |
+
.fa-thumbs-o-down:before {
|
| 584 |
+
content: "\f088";
|
| 585 |
+
}
|
| 586 |
+
.fa-star-half:before {
|
| 587 |
+
content: "\f089";
|
| 588 |
+
}
|
| 589 |
+
.fa-heart-o:before {
|
| 590 |
+
content: "\f08a";
|
| 591 |
+
}
|
| 592 |
+
.fa-sign-out:before {
|
| 593 |
+
content: "\f08b";
|
| 594 |
+
}
|
| 595 |
+
.fa-linkedin-square:before {
|
| 596 |
+
content: "\f08c";
|
| 597 |
+
}
|
| 598 |
+
.fa-thumb-tack:before {
|
| 599 |
+
content: "\f08d";
|
| 600 |
+
}
|
| 601 |
+
.fa-external-link:before {
|
| 602 |
+
content: "\f08e";
|
| 603 |
+
}
|
| 604 |
+
.fa-sign-in:before {
|
| 605 |
+
content: "\f090";
|
| 606 |
+
}
|
| 607 |
+
.fa-trophy:before {
|
| 608 |
+
content: "\f091";
|
| 609 |
+
}
|
| 610 |
+
.fa-github-square:before {
|
| 611 |
+
content: "\f092";
|
| 612 |
+
}
|
| 613 |
+
.fa-upload:before {
|
| 614 |
+
content: "\f093";
|
| 615 |
+
}
|
| 616 |
+
.fa-lemon-o:before {
|
| 617 |
+
content: "\f094";
|
| 618 |
+
}
|
| 619 |
+
.fa-phone:before {
|
| 620 |
+
content: "\f095";
|
| 621 |
+
}
|
| 622 |
+
.fa-square-o:before {
|
| 623 |
+
content: "\f096";
|
| 624 |
+
}
|
| 625 |
+
.fa-bookmark-o:before {
|
| 626 |
+
content: "\f097";
|
| 627 |
+
}
|
| 628 |
+
.fa-phone-square:before {
|
| 629 |
+
content: "\f098";
|
| 630 |
+
}
|
| 631 |
+
.fa-twitter:before {
|
| 632 |
+
content: "\f099";
|
| 633 |
+
}
|
| 634 |
+
.fa-facebook:before {
|
| 635 |
+
content: "\f09a";
|
| 636 |
+
}
|
| 637 |
+
.fa-github:before {
|
| 638 |
+
content: "\f09b";
|
| 639 |
+
}
|
| 640 |
+
.fa-unlock:before {
|
| 641 |
+
content: "\f09c";
|
| 642 |
+
}
|
| 643 |
+
.fa-credit-card:before {
|
| 644 |
+
content: "\f09d";
|
| 645 |
+
}
|
| 646 |
+
.fa-rss:before {
|
| 647 |
+
content: "\f09e";
|
| 648 |
+
}
|
| 649 |
+
.fa-hdd-o:before {
|
| 650 |
+
content: "\f0a0";
|
| 651 |
+
}
|
| 652 |
+
.fa-bullhorn:before {
|
| 653 |
+
content: "\f0a1";
|
| 654 |
+
}
|
| 655 |
+
.fa-bell:before {
|
| 656 |
+
content: "\f0f3";
|
| 657 |
+
}
|
| 658 |
+
.fa-certificate:before {
|
| 659 |
+
content: "\f0a3";
|
| 660 |
+
}
|
| 661 |
+
.fa-hand-o-right:before {
|
| 662 |
+
content: "\f0a4";
|
| 663 |
+
}
|
| 664 |
+
.fa-hand-o-left:before {
|
| 665 |
+
content: "\f0a5";
|
| 666 |
+
}
|
| 667 |
+
.fa-hand-o-up:before {
|
| 668 |
+
content: "\f0a6";
|
| 669 |
+
}
|
| 670 |
+
.fa-hand-o-down:before {
|
| 671 |
+
content: "\f0a7";
|
| 672 |
+
}
|
| 673 |
+
.fa-arrow-circle-left:before {
|
| 674 |
+
content: "\f0a8";
|
| 675 |
+
}
|
| 676 |
+
.fa-arrow-circle-right:before {
|
| 677 |
+
content: "\f0a9";
|
| 678 |
+
}
|
| 679 |
+
.fa-arrow-circle-up:before {
|
| 680 |
+
content: "\f0aa";
|
| 681 |
+
}
|
| 682 |
+
.fa-arrow-circle-down:before {
|
| 683 |
+
content: "\f0ab";
|
| 684 |
+
}
|
| 685 |
+
.fa-globe:before {
|
| 686 |
+
content: "\f0ac";
|
| 687 |
+
}
|
| 688 |
+
.fa-wrench:before {
|
| 689 |
+
content: "\f0ad";
|
| 690 |
+
}
|
| 691 |
+
.fa-tasks:before {
|
| 692 |
+
content: "\f0ae";
|
| 693 |
+
}
|
| 694 |
+
.fa-filter:before {
|
| 695 |
+
content: "\f0b0";
|
| 696 |
+
}
|
| 697 |
+
.fa-briefcase:before {
|
| 698 |
+
content: "\f0b1";
|
| 699 |
+
}
|
| 700 |
+
.fa-arrows-alt:before {
|
| 701 |
+
content: "\f0b2";
|
| 702 |
+
}
|
| 703 |
+
.fa-group:before,
|
| 704 |
+
.fa-users:before {
|
| 705 |
+
content: "\f0c0";
|
| 706 |
+
}
|
| 707 |
+
.fa-chain:before,
|
| 708 |
+
.fa-link:before {
|
| 709 |
+
content: "\f0c1";
|
| 710 |
+
}
|
| 711 |
+
.fa-cloud:before {
|
| 712 |
+
content: "\f0c2";
|
| 713 |
+
}
|
| 714 |
+
.fa-flask:before {
|
| 715 |
+
content: "\f0c3";
|
| 716 |
+
}
|
| 717 |
+
.fa-cut:before,
|
| 718 |
+
.fa-scissors:before {
|
| 719 |
+
content: "\f0c4";
|
| 720 |
+
}
|
| 721 |
+
.fa-copy:before,
|
| 722 |
+
.fa-files-o:before {
|
| 723 |
+
content: "\f0c5";
|
| 724 |
+
}
|
| 725 |
+
.fa-paperclip:before {
|
| 726 |
+
content: "\f0c6";
|
| 727 |
+
}
|
| 728 |
+
.fa-save:before,
|
| 729 |
+
.fa-floppy-o:before {
|
| 730 |
+
content: "\f0c7";
|
| 731 |
+
}
|
| 732 |
+
.fa-square:before {
|
| 733 |
+
content: "\f0c8";
|
| 734 |
+
}
|
| 735 |
+
.fa-bars:before {
|
| 736 |
+
content: "\f0c9";
|
| 737 |
+
}
|
| 738 |
+
.fa-list-ul:before {
|
| 739 |
+
content: "\f0ca";
|
| 740 |
+
}
|
| 741 |
+
.fa-list-ol:before {
|
| 742 |
+
content: "\f0cb";
|
| 743 |
+
}
|
| 744 |
+
.fa-strikethrough:before {
|
| 745 |
+
content: "\f0cc";
|
| 746 |
+
}
|
| 747 |
+
.fa-underline:before {
|
| 748 |
+
content: "\f0cd";
|
| 749 |
+
}
|
| 750 |
+
.fa-table:before {
|
| 751 |
+
content: "\f0ce";
|
| 752 |
+
}
|
| 753 |
+
.fa-magic:before {
|
| 754 |
+
content: "\f0d0";
|
| 755 |
+
}
|
| 756 |
+
.fa-truck:before {
|
| 757 |
+
content: "\f0d1";
|
| 758 |
+
}
|
| 759 |
+
.fa-pinterest:before {
|
| 760 |
+
content: "\f0d2";
|
| 761 |
+
}
|
| 762 |
+
.fa-pinterest-square:before {
|
| 763 |
+
content: "\f0d3";
|
| 764 |
+
}
|
| 765 |
+
.fa-google-plus-square:before {
|
| 766 |
+
content: "\f0d4";
|
| 767 |
+
}
|
| 768 |
+
.fa-google-plus:before {
|
| 769 |
+
content: "\f0d5";
|
| 770 |
+
}
|
| 771 |
+
.fa-money:before {
|
| 772 |
+
content: "\f0d6";
|
| 773 |
+
}
|
| 774 |
+
.fa-caret-down:before {
|
| 775 |
+
content: "\f0d7";
|
| 776 |
+
}
|
| 777 |
+
.fa-caret-up:before {
|
| 778 |
+
content: "\f0d8";
|
| 779 |
+
}
|
| 780 |
+
.fa-caret-left:before {
|
| 781 |
+
content: "\f0d9";
|
| 782 |
+
}
|
| 783 |
+
.fa-caret-right:before {
|
| 784 |
+
content: "\f0da";
|
| 785 |
+
}
|
| 786 |
+
.fa-columns:before {
|
| 787 |
+
content: "\f0db";
|
| 788 |
+
}
|
| 789 |
+
.fa-unsorted:before,
|
| 790 |
+
.fa-sort:before {
|
| 791 |
+
content: "\f0dc";
|
| 792 |
+
}
|
| 793 |
+
.fa-sort-down:before,
|
| 794 |
+
.fa-sort-asc:before {
|
| 795 |
+
content: "\f0dd";
|
| 796 |
+
}
|
| 797 |
+
.fa-sort-up:before,
|
| 798 |
+
.fa-sort-desc:before {
|
| 799 |
+
content: "\f0de";
|
| 800 |
+
}
|
| 801 |
+
.fa-envelope:before {
|
| 802 |
+
content: "\f0e0";
|
| 803 |
+
}
|
| 804 |
+
.fa-linkedin:before {
|
| 805 |
+
content: "\f0e1";
|
| 806 |
+
}
|
| 807 |
+
.fa-rotate-left:before,
|
| 808 |
+
.fa-undo:before {
|
| 809 |
+
content: "\f0e2";
|
| 810 |
+
}
|
| 811 |
+
.fa-legal:before,
|
| 812 |
+
.fa-gavel:before {
|
| 813 |
+
content: "\f0e3";
|
| 814 |
+
}
|
| 815 |
+
.fa-dashboard:before,
|
| 816 |
+
.fa-tachometer:before {
|
| 817 |
+
content: "\f0e4";
|
| 818 |
+
}
|
| 819 |
+
.fa-comment-o:before {
|
| 820 |
+
content: "\f0e5";
|
| 821 |
+
}
|
| 822 |
+
.fa-comments-o:before {
|
| 823 |
+
content: "\f0e6";
|
| 824 |
+
}
|
| 825 |
+
.fa-flash:before,
|
| 826 |
+
.fa-bolt:before {
|
| 827 |
+
content: "\f0e7";
|
| 828 |
+
}
|
| 829 |
+
.fa-sitemap:before {
|
| 830 |
+
content: "\f0e8";
|
| 831 |
+
}
|
| 832 |
+
.fa-umbrella:before {
|
| 833 |
+
content: "\f0e9";
|
| 834 |
+
}
|
| 835 |
+
.fa-paste:before,
|
| 836 |
+
.fa-clipboard:before {
|
| 837 |
+
content: "\f0ea";
|
| 838 |
+
}
|
| 839 |
+
.fa-lightbulb-o:before {
|
| 840 |
+
content: "\f0eb";
|
| 841 |
+
}
|
| 842 |
+
.fa-exchange:before {
|
| 843 |
+
content: "\f0ec";
|
| 844 |
+
}
|
| 845 |
+
.fa-cloud-download:before {
|
| 846 |
+
content: "\f0ed";
|
| 847 |
+
}
|
| 848 |
+
.fa-cloud-upload:before {
|
| 849 |
+
content: "\f0ee";
|
| 850 |
+
}
|
| 851 |
+
.fa-user-md:before {
|
| 852 |
+
content: "\f0f0";
|
| 853 |
+
}
|
| 854 |
+
.fa-stethoscope:before {
|
| 855 |
+
content: "\f0f1";
|
| 856 |
+
}
|
| 857 |
+
.fa-suitcase:before {
|
| 858 |
+
content: "\f0f2";
|
| 859 |
+
}
|
| 860 |
+
.fa-bell-o:before {
|
| 861 |
+
content: "\f0a2";
|
| 862 |
+
}
|
| 863 |
+
.fa-coffee:before {
|
| 864 |
+
content: "\f0f4";
|
| 865 |
+
}
|
| 866 |
+
.fa-cutlery:before {
|
| 867 |
+
content: "\f0f5";
|
| 868 |
+
}
|
| 869 |
+
.fa-file-text-o:before {
|
| 870 |
+
content: "\f0f6";
|
| 871 |
+
}
|
| 872 |
+
.fa-building-o:before {
|
| 873 |
+
content: "\f0f7";
|
| 874 |
+
}
|
| 875 |
+
.fa-hospital-o:before {
|
| 876 |
+
content: "\f0f8";
|
| 877 |
+
}
|
| 878 |
+
.fa-ambulance:before {
|
| 879 |
+
content: "\f0f9";
|
| 880 |
+
}
|
| 881 |
+
.fa-medkit:before {
|
| 882 |
+
content: "\f0fa";
|
| 883 |
+
}
|
| 884 |
+
.fa-fighter-jet:before {
|
| 885 |
+
content: "\f0fb";
|
| 886 |
+
}
|
| 887 |
+
.fa-beer:before {
|
| 888 |
+
content: "\f0fc";
|
| 889 |
+
}
|
| 890 |
+
.fa-h-square:before {
|
| 891 |
+
content: "\f0fd";
|
| 892 |
+
}
|
| 893 |
+
.fa-plus-square:before {
|
| 894 |
+
content: "\f0fe";
|
| 895 |
+
}
|
| 896 |
+
.fa-angle-double-left:before {
|
| 897 |
+
content: "\f100";
|
| 898 |
+
}
|
| 899 |
+
.fa-angle-double-right:before {
|
| 900 |
+
content: "\f101";
|
| 901 |
+
}
|
| 902 |
+
.fa-angle-double-up:before {
|
| 903 |
+
content: "\f102";
|
| 904 |
+
}
|
| 905 |
+
.fa-angle-double-down:before {
|
| 906 |
+
content: "\f103";
|
| 907 |
+
}
|
| 908 |
+
.fa-angle-left:before {
|
| 909 |
+
content: "\f104";
|
| 910 |
+
}
|
| 911 |
+
.fa-angle-right:before {
|
| 912 |
+
content: "\f105";
|
| 913 |
+
}
|
| 914 |
+
.fa-angle-up:before {
|
| 915 |
+
content: "\f106";
|
| 916 |
+
}
|
| 917 |
+
.fa-angle-down:before {
|
| 918 |
+
content: "\f107";
|
| 919 |
+
}
|
| 920 |
+
.fa-desktop:before {
|
| 921 |
+
content: "\f108";
|
| 922 |
+
}
|
| 923 |
+
.fa-laptop:before {
|
| 924 |
+
content: "\f109";
|
| 925 |
+
}
|
| 926 |
+
.fa-tablet:before {
|
| 927 |
+
content: "\f10a";
|
| 928 |
+
}
|
| 929 |
+
.fa-mobile-phone:before,
|
| 930 |
+
.fa-mobile:before {
|
| 931 |
+
content: "\f10b";
|
| 932 |
+
}
|
| 933 |
+
.fa-circle-o:before {
|
| 934 |
+
content: "\f10c";
|
| 935 |
+
}
|
| 936 |
+
.fa-quote-left:before {
|
| 937 |
+
content: "\f10d";
|
| 938 |
+
}
|
| 939 |
+
.fa-quote-right:before {
|
| 940 |
+
content: "\f10e";
|
| 941 |
+
}
|
| 942 |
+
.fa-spinner:before {
|
| 943 |
+
content: "\f110";
|
| 944 |
+
}
|
| 945 |
+
.fa-circle:before {
|
| 946 |
+
content: "\f111";
|
| 947 |
+
}
|
| 948 |
+
.fa-mail-reply:before,
|
| 949 |
+
.fa-reply:before {
|
| 950 |
+
content: "\f112";
|
| 951 |
+
}
|
| 952 |
+
.fa-github-alt:before {
|
| 953 |
+
content: "\f113";
|
| 954 |
+
}
|
| 955 |
+
.fa-folder-o:before {
|
| 956 |
+
content: "\f114";
|
| 957 |
+
}
|
| 958 |
+
.fa-folder-open-o:before {
|
| 959 |
+
content: "\f115";
|
| 960 |
+
}
|
| 961 |
+
.fa-smile-o:before {
|
| 962 |
+
content: "\f118";
|
| 963 |
+
}
|
| 964 |
+
.fa-frown-o:before {
|
| 965 |
+
content: "\f119";
|
| 966 |
+
}
|
| 967 |
+
.fa-meh-o:before {
|
| 968 |
+
content: "\f11a";
|
| 969 |
+
}
|
| 970 |
+
.fa-gamepad:before {
|
| 971 |
+
content: "\f11b";
|
| 972 |
+
}
|
| 973 |
+
.fa-keyboard-o:before {
|
| 974 |
+
content: "\f11c";
|
| 975 |
+
}
|
| 976 |
+
.fa-flag-o:before {
|
| 977 |
+
content: "\f11d";
|
| 978 |
+
}
|
| 979 |
+
.fa-flag-checkered:before {
|
| 980 |
+
content: "\f11e";
|
| 981 |
+
}
|
| 982 |
+
.fa-terminal:before {
|
| 983 |
+
content: "\f120";
|
| 984 |
+
}
|
| 985 |
+
.fa-code:before {
|
| 986 |
+
content: "\f121";
|
| 987 |
+
}
|
| 988 |
+
.fa-reply-all:before {
|
| 989 |
+
content: "\f122";
|
| 990 |
+
}
|
| 991 |
+
.fa-mail-reply-all:before {
|
| 992 |
+
content: "\f122";
|
| 993 |
+
}
|
| 994 |
+
.fa-star-half-empty:before,
|
| 995 |
+
.fa-star-half-full:before,
|
| 996 |
+
.fa-star-half-o:before {
|
| 997 |
+
content: "\f123";
|
| 998 |
+
}
|
| 999 |
+
.fa-location-arrow:before {
|
| 1000 |
+
content: "\f124";
|
| 1001 |
+
}
|
| 1002 |
+
.fa-crop:before {
|
| 1003 |
+
content: "\f125";
|
| 1004 |
+
}
|
| 1005 |
+
.fa-code-fork:before {
|
| 1006 |
+
content: "\f126";
|
| 1007 |
+
}
|
| 1008 |
+
.fa-unlink:before,
|
| 1009 |
+
.fa-chain-broken:before {
|
| 1010 |
+
content: "\f127";
|
| 1011 |
+
}
|
| 1012 |
+
.fa-question:before {
|
| 1013 |
+
content: "\f128";
|
| 1014 |
+
}
|
| 1015 |
+
.fa-info:before {
|
| 1016 |
+
content: "\f129";
|
| 1017 |
+
}
|
| 1018 |
+
.fa-exclamation:before {
|
| 1019 |
+
content: "\f12a";
|
| 1020 |
+
}
|
| 1021 |
+
.fa-superscript:before {
|
| 1022 |
+
content: "\f12b";
|
| 1023 |
+
}
|
| 1024 |
+
.fa-subscript:before {
|
| 1025 |
+
content: "\f12c";
|
| 1026 |
+
}
|
| 1027 |
+
.fa-eraser:before {
|
| 1028 |
+
content: "\f12d";
|
| 1029 |
+
}
|
| 1030 |
+
.fa-puzzle-piece:before {
|
| 1031 |
+
content: "\f12e";
|
| 1032 |
+
}
|
| 1033 |
+
.fa-microphone:before {
|
| 1034 |
+
content: "\f130";
|
| 1035 |
+
}
|
| 1036 |
+
.fa-microphone-slash:before {
|
| 1037 |
+
content: "\f131";
|
| 1038 |
+
}
|
| 1039 |
+
.fa-shield:before {
|
| 1040 |
+
content: "\f132";
|
| 1041 |
+
}
|
| 1042 |
+
.fa-calendar-o:before {
|
| 1043 |
+
content: "\f133";
|
| 1044 |
+
}
|
| 1045 |
+
.fa-fire-extinguisher:before {
|
| 1046 |
+
content: "\f134";
|
| 1047 |
+
}
|
| 1048 |
+
.fa-rocket:before {
|
| 1049 |
+
content: "\f135";
|
| 1050 |
+
}
|
| 1051 |
+
.fa-maxcdn:before {
|
| 1052 |
+
content: "\f136";
|
| 1053 |
+
}
|
| 1054 |
+
.fa-chevron-circle-left:before {
|
| 1055 |
+
content: "\f137";
|
| 1056 |
+
}
|
| 1057 |
+
.fa-chevron-circle-right:before {
|
| 1058 |
+
content: "\f138";
|
| 1059 |
+
}
|
| 1060 |
+
.fa-chevron-circle-up:before {
|
| 1061 |
+
content: "\f139";
|
| 1062 |
+
}
|
| 1063 |
+
.fa-chevron-circle-down:before {
|
| 1064 |
+
content: "\f13a";
|
| 1065 |
+
}
|
| 1066 |
+
.fa-html5:before {
|
| 1067 |
+
content: "\f13b";
|
| 1068 |
+
}
|
| 1069 |
+
.fa-css3:before {
|
| 1070 |
+
content: "\f13c";
|
| 1071 |
+
}
|
| 1072 |
+
.fa-anchor:before {
|
| 1073 |
+
content: "\f13d";
|
| 1074 |
+
}
|
| 1075 |
+
.fa-unlock-alt:before {
|
| 1076 |
+
content: "\f13e";
|
| 1077 |
+
}
|
| 1078 |
+
.fa-bullseye:before {
|
| 1079 |
+
content: "\f140";
|
| 1080 |
+
}
|
| 1081 |
+
.fa-ellipsis-h:before {
|
| 1082 |
+
content: "\f141";
|
| 1083 |
+
}
|
| 1084 |
+
.fa-ellipsis-v:before {
|
| 1085 |
+
content: "\f142";
|
| 1086 |
+
}
|
| 1087 |
+
.fa-rss-square:before {
|
| 1088 |
+
content: "\f143";
|
| 1089 |
+
}
|
| 1090 |
+
.fa-play-circle:before {
|
| 1091 |
+
content: "\f144";
|
| 1092 |
+
}
|
| 1093 |
+
.fa-ticket:before {
|
| 1094 |
+
content: "\f145";
|
| 1095 |
+
}
|
| 1096 |
+
.fa-minus-square:before {
|
| 1097 |
+
content: "\f146";
|
| 1098 |
+
}
|
| 1099 |
+
.fa-minus-square-o:before {
|
| 1100 |
+
content: "\f147";
|
| 1101 |
+
}
|
| 1102 |
+
.fa-level-up:before {
|
| 1103 |
+
content: "\f148";
|
| 1104 |
+
}
|
| 1105 |
+
.fa-level-down:before {
|
| 1106 |
+
content: "\f149";
|
| 1107 |
+
}
|
| 1108 |
+
.fa-check-square:before {
|
| 1109 |
+
content: "\f14a";
|
| 1110 |
+
}
|
| 1111 |
+
.fa-pencil-square:before {
|
| 1112 |
+
content: "\f14b";
|
| 1113 |
+
}
|
| 1114 |
+
.fa-external-link-square:before {
|
| 1115 |
+
content: "\f14c";
|
| 1116 |
+
}
|
| 1117 |
+
.fa-share-square:before {
|
| 1118 |
+
content: "\f14d";
|
| 1119 |
+
}
|
| 1120 |
+
.fa-compass:before {
|
| 1121 |
+
content: "\f14e";
|
| 1122 |
+
}
|
| 1123 |
+
.fa-toggle-down:before,
|
| 1124 |
+
.fa-caret-square-o-down:before {
|
| 1125 |
+
content: "\f150";
|
| 1126 |
+
}
|
| 1127 |
+
.fa-toggle-up:before,
|
| 1128 |
+
.fa-caret-square-o-up:before {
|
| 1129 |
+
content: "\f151";
|
| 1130 |
+
}
|
| 1131 |
+
.fa-toggle-right:before,
|
| 1132 |
+
.fa-caret-square-o-right:before {
|
| 1133 |
+
content: "\f152";
|
| 1134 |
+
}
|
| 1135 |
+
.fa-euro:before,
|
| 1136 |
+
.fa-eur:before {
|
| 1137 |
+
content: "\f153";
|
| 1138 |
+
}
|
| 1139 |
+
.fa-gbp:before {
|
| 1140 |
+
content: "\f154";
|
| 1141 |
+
}
|
| 1142 |
+
.fa-dollar:before,
|
| 1143 |
+
.fa-usd:before {
|
| 1144 |
+
content: "\f155";
|
| 1145 |
+
}
|
| 1146 |
+
.fa-rupee:before,
|
| 1147 |
+
.fa-inr:before {
|
| 1148 |
+
content: "\f156";
|
| 1149 |
+
}
|
| 1150 |
+
.fa-cny:before,
|
| 1151 |
+
.fa-rmb:before,
|
| 1152 |
+
.fa-yen:before,
|
| 1153 |
+
.fa-jpy:before {
|
| 1154 |
+
content: "\f157";
|
| 1155 |
+
}
|
| 1156 |
+
.fa-ruble:before,
|
| 1157 |
+
.fa-rouble:before,
|
| 1158 |
+
.fa-rub:before {
|
| 1159 |
+
content: "\f158";
|
| 1160 |
+
}
|
| 1161 |
+
.fa-won:before,
|
| 1162 |
+
.fa-krw:before {
|
| 1163 |
+
content: "\f159";
|
| 1164 |
+
}
|
| 1165 |
+
.fa-bitcoin:before,
|
| 1166 |
+
.fa-btc:before {
|
| 1167 |
+
content: "\f15a";
|
| 1168 |
+
}
|
| 1169 |
+
.fa-file:before {
|
| 1170 |
+
content: "\f15b";
|
| 1171 |
+
}
|
| 1172 |
+
.fa-file-text:before {
|
| 1173 |
+
content: "\f15c";
|
| 1174 |
+
}
|
| 1175 |
+
.fa-sort-alpha-asc:before {
|
| 1176 |
+
content: "\f15d";
|
| 1177 |
+
}
|
| 1178 |
+
.fa-sort-alpha-desc:before {
|
| 1179 |
+
content: "\f15e";
|
| 1180 |
+
}
|
| 1181 |
+
.fa-sort-amount-asc:before {
|
| 1182 |
+
content: "\f160";
|
| 1183 |
+
}
|
| 1184 |
+
.fa-sort-amount-desc:before {
|
| 1185 |
+
content: "\f161";
|
| 1186 |
+
}
|
| 1187 |
+
.fa-sort-numeric-asc:before {
|
| 1188 |
+
content: "\f162";
|
| 1189 |
+
}
|
| 1190 |
+
.fa-sort-numeric-desc:before {
|
| 1191 |
+
content: "\f163";
|
| 1192 |
+
}
|
| 1193 |
+
.fa-thumbs-up:before {
|
| 1194 |
+
content: "\f164";
|
| 1195 |
+
}
|
| 1196 |
+
.fa-thumbs-down:before {
|
| 1197 |
+
content: "\f165";
|
| 1198 |
+
}
|
| 1199 |
+
.fa-youtube-square:before {
|
| 1200 |
+
content: "\f166";
|
| 1201 |
+
}
|
| 1202 |
+
.fa-youtube:before {
|
| 1203 |
+
content: "\f167";
|
| 1204 |
+
}
|
| 1205 |
+
.fa-xing:before {
|
| 1206 |
+
content: "\f168";
|
| 1207 |
+
}
|
| 1208 |
+
.fa-xing-square:before {
|
| 1209 |
+
content: "\f169";
|
| 1210 |
+
}
|
| 1211 |
+
.fa-youtube-play:before {
|
| 1212 |
+
content: "\f16a";
|
| 1213 |
+
}
|
| 1214 |
+
.fa-dropbox:before {
|
| 1215 |
+
content: "\f16b";
|
| 1216 |
+
}
|
| 1217 |
+
.fa-stack-overflow:before {
|
| 1218 |
+
content: "\f16c";
|
| 1219 |
+
}
|
| 1220 |
+
.fa-instagram:before {
|
| 1221 |
+
content: "\f16d";
|
| 1222 |
+
}
|
| 1223 |
+
.fa-flickr:before {
|
| 1224 |
+
content: "\f16e";
|
| 1225 |
+
}
|
| 1226 |
+
.fa-adn:before {
|
| 1227 |
+
content: "\f170";
|
| 1228 |
+
}
|
| 1229 |
+
.fa-bitbucket:before {
|
| 1230 |
+
content: "\f171";
|
| 1231 |
+
}
|
| 1232 |
+
.fa-bitbucket-square:before {
|
| 1233 |
+
content: "\f172";
|
| 1234 |
+
}
|
| 1235 |
+
.fa-tumblr:before {
|
| 1236 |
+
content: "\f173";
|
| 1237 |
+
}
|
| 1238 |
+
.fa-tumblr-square:before {
|
| 1239 |
+
content: "\f174";
|
| 1240 |
+
}
|
| 1241 |
+
.fa-long-arrow-down:before {
|
| 1242 |
+
content: "\f175";
|
| 1243 |
+
}
|
| 1244 |
+
.fa-long-arrow-up:before {
|
| 1245 |
+
content: "\f176";
|
| 1246 |
+
}
|
| 1247 |
+
.fa-long-arrow-left:before {
|
| 1248 |
+
content: "\f177";
|
| 1249 |
+
}
|
| 1250 |
+
.fa-long-arrow-right:before {
|
| 1251 |
+
content: "\f178";
|
| 1252 |
+
}
|
| 1253 |
+
.fa-apple:before {
|
| 1254 |
+
content: "\f179";
|
| 1255 |
+
}
|
| 1256 |
+
.fa-windows:before {
|
| 1257 |
+
content: "\f17a";
|
| 1258 |
+
}
|
| 1259 |
+
.fa-android:before {
|
| 1260 |
+
content: "\f17b";
|
| 1261 |
+
}
|
| 1262 |
+
.fa-linux:before {
|
| 1263 |
+
content: "\f17c";
|
| 1264 |
+
}
|
| 1265 |
+
.fa-dribbble:before {
|
| 1266 |
+
content: "\f17d";
|
| 1267 |
+
}
|
| 1268 |
+
.fa-skype:before {
|
| 1269 |
+
content: "\f17e";
|
| 1270 |
+
}
|
| 1271 |
+
.fa-foursquare:before {
|
| 1272 |
+
content: "\f180";
|
| 1273 |
+
}
|
| 1274 |
+
.fa-trello:before {
|
| 1275 |
+
content: "\f181";
|
| 1276 |
+
}
|
| 1277 |
+
.fa-female:before {
|
| 1278 |
+
content: "\f182";
|
| 1279 |
+
}
|
| 1280 |
+
.fa-male:before {
|
| 1281 |
+
content: "\f183";
|
| 1282 |
+
}
|
| 1283 |
+
.fa-gittip:before {
|
| 1284 |
+
content: "\f184";
|
| 1285 |
+
}
|
| 1286 |
+
.fa-sun-o:before {
|
| 1287 |
+
content: "\f185";
|
| 1288 |
+
}
|
| 1289 |
+
.fa-moon-o:before {
|
| 1290 |
+
content: "\f186";
|
| 1291 |
+
}
|
| 1292 |
+
.fa-archive:before {
|
| 1293 |
+
content: "\f187";
|
| 1294 |
+
}
|
| 1295 |
+
.fa-bug:before {
|
| 1296 |
+
content: "\f188";
|
| 1297 |
+
}
|
| 1298 |
+
.fa-vk:before {
|
| 1299 |
+
content: "\f189";
|
| 1300 |
+
}
|
| 1301 |
+
.fa-weibo:before {
|
| 1302 |
+
content: "\f18a";
|
| 1303 |
+
}
|
| 1304 |
+
.fa-renren:before {
|
| 1305 |
+
content: "\f18b";
|
| 1306 |
+
}
|
| 1307 |
+
.fa-pagelines:before {
|
| 1308 |
+
content: "\f18c";
|
| 1309 |
+
}
|
| 1310 |
+
.fa-stack-exchange:before {
|
| 1311 |
+
content: "\f18d";
|
| 1312 |
+
}
|
| 1313 |
+
.fa-arrow-circle-o-right:before {
|
| 1314 |
+
content: "\f18e";
|
| 1315 |
+
}
|
| 1316 |
+
.fa-arrow-circle-o-left:before {
|
| 1317 |
+
content: "\f190";
|
| 1318 |
+
}
|
| 1319 |
+
.fa-toggle-left:before,
|
| 1320 |
+
.fa-caret-square-o-left:before {
|
| 1321 |
+
content: "\f191";
|
| 1322 |
+
}
|
| 1323 |
+
.fa-dot-circle-o:before {
|
| 1324 |
+
content: "\f192";
|
| 1325 |
+
}
|
| 1326 |
+
.fa-wheelchair:before {
|
| 1327 |
+
content: "\f193";
|
| 1328 |
+
}
|
| 1329 |
+
.fa-vimeo-square:before {
|
| 1330 |
+
content: "\f194";
|
| 1331 |
+
}
|
| 1332 |
+
.fa-turkish-lira:before,
|
| 1333 |
+
.fa-try:before {
|
| 1334 |
+
content: "\f195";
|
| 1335 |
+
}
|
| 1336 |
+
.fa-plus-square-o:before {
|
| 1337 |
+
content: "\f196";
|
| 1338 |
+
}
|
backend/staticfiles/rest_framework/css/font-awesome-4.0.3.c1e1ea213abf.css.gz
ADDED
|
Binary file (4.23 kB). View file
|
|
|